From af1fd3425653818f9f62292a7f924ca787dde9e9 Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Tue, 24 Sep 2024 14:47:06 +0200 Subject: [PATCH] feat(instructeurs import): can import instructeurs even if procedure not published --- .../groupe_instructeurs_controller.rb | 52 +++++++++---------- .../_import_export.html.haml | 20 +++---- .../groupe_instructeurs/en.yml | 1 - .../groupe_instructeurs/fr.yml | 1 - 4 files changed, 32 insertions(+), 42 deletions(-) diff --git a/app/controllers/administrateurs/groupe_instructeurs_controller.rb b/app/controllers/administrateurs/groupe_instructeurs_controller.rb index 759bfe30c..c9ecd1563 100644 --- a/app/controllers/administrateurs/groupe_instructeurs_controller.rb +++ b/app/controllers/administrateurs/groupe_instructeurs_controller.rb @@ -322,44 +322,42 @@ module Administrateurs end def import - if procedure.publiee_or_close? - if !CSV_ACCEPTED_CONTENT_TYPES.include?(csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type) - flash[:alert] = "Importation impossible : veuillez importer un fichier CSV" + if !CSV_ACCEPTED_CONTENT_TYPES.include?(csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type) + flash[:alert] = "Importation impossible : veuillez importer un fichier CSV" - elsif csv_file.size > CSV_MAX_SIZE - flash[:alert] = "Importation impossible : le poids du fichier est supérieur à #{number_to_human_size(CSV_MAX_SIZE)}" + elsif csv_file.size > CSV_MAX_SIZE + flash[:alert] = "Importation impossible : le poids du fichier est supérieur à #{number_to_human_size(CSV_MAX_SIZE)}" - else - file = csv_file.read - base_encoding = CharlockHolmes::EncodingDetector.detect(file) + else + file = csv_file.read + base_encoding = CharlockHolmes::EncodingDetector.detect(file) - csv_content = ACSV::CSV.new_for_ruby3(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase).map(&:to_h) + csv_content = ACSV::CSV.new_for_ruby3(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase).map(&:to_h) - if csv_content.first.has_key?("groupe") && csv_content.first.has_key?("email") - groupes_emails = csv_content.map { |r| r.to_h.slice('groupe', 'email') } + if csv_content.first.has_key?("groupe") && csv_content.first.has_key?("email") + groupes_emails = csv_content.map { |r| r.to_h.slice('groupe', 'email') } - added_instructeurs_by_group, invalid_emails = InstructeursImportService.import_groupes(procedure, groupes_emails) + added_instructeurs_by_group, invalid_emails = InstructeursImportService.import_groupes(procedure, groupes_emails) - added_instructeurs_by_group.each do |groupe, added_instructeurs| - if added_instructeurs.present? - notify_instructeurs(groupe, added_instructeurs) - end - flash_message_for_import(invalid_emails) - end - - elsif csv_content.first.has_key?("email") && !csv_content.map(&:to_h).first.keys.many? && procedure.groupe_instructeurs.one? - instructors_emails = csv_content.map(&:to_h) - - added_instructeurs, invalid_emails = InstructeursImportService.import_instructeurs(procedure, instructors_emails) + added_instructeurs_by_group.each do |groupe, added_instructeurs| if added_instructeurs.present? - notify_instructeurs(groupe_instructeur, added_instructeurs) + notify_instructeurs(groupe, added_instructeurs) end flash_message_for_import(invalid_emails) - else - flash_message_for_invalid_csv end - redirect_to admin_procedure_groupe_instructeurs_path(procedure) + + elsif csv_content.first.has_key?("email") && !csv_content.map(&:to_h).first.keys.many? && procedure.groupe_instructeurs.one? + instructors_emails = csv_content.map(&:to_h) + + added_instructeurs, invalid_emails = InstructeursImportService.import_instructeurs(procedure, instructors_emails) + if added_instructeurs.present? + notify_instructeurs(groupe_instructeur, added_instructeurs) + end + flash_message_for_import(invalid_emails) + else + flash_message_for_invalid_csv end + redirect_to admin_procedure_groupe_instructeurs_path(procedure) end end diff --git a/app/views/administrateurs/groupe_instructeurs/_import_export.html.haml b/app/views/administrateurs/groupe_instructeurs/_import_export.html.haml index 1286c969b..429fef441 100644 --- a/app/views/administrateurs/groupe_instructeurs/_import_export.html.haml +++ b/app/views/administrateurs/groupe_instructeurs/_import_export.html.haml @@ -5,19 +5,13 @@ = t(".csv_import.#{key}.title") .fr-collapse#accordion-106 - csv_max_size = Administrateurs::GroupeInstructeursController::CSV_MAX_SIZE - - if procedure.publiee_or_close? - %p.notice - = t(".csv_import.#{key}.notice_1_html", csv_max_size: number_to_human_size(csv_max_size)) - %p.notice - = t(".csv_import.#{key}.notice_2") - = form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form flex justify-between align-center" do - = file_field_tag :csv_file, required: true, accept: 'text/csv', size: "1" - = submit_tag t('.csv_import.import_file'), class: 'fr-btn fr-btn--secondary', data: { disable_with: "Envoi...", confirm: t('.csv_import.import_file_alert') } - - else - %p.mt-4.form.font-weight-bold.mb-2.text-lg - = t(".csv_import.#{key}.title") - %p.notice - = t('.csv_import.import_file_procedure_not_published') + %p.notice + = t(".csv_import.#{key}.notice_1_html", csv_max_size: number_to_human_size(csv_max_size)) + %p.notice + = t(".csv_import.#{key}.notice_2") + = form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form flex justify-between align-center" do + = file_field_tag :csv_file, required: true, accept: 'text/csv', size: "1" + = submit_tag t('.csv_import.import_file'), class: 'fr-btn fr-btn--secondary', data: { disable_with: "Envoi...", confirm: t('.csv_import.import_file_alert') } - if procedure.groupe_instructeurs.many? .flex.justify-between.align-center.mt-4 %div diff --git a/config/locales/views/administrateurs/groupe_instructeurs/en.yml b/config/locales/views/administrateurs/groupe_instructeurs/en.yml index 2aa0133ef..d50fc5b2b 100644 --- a/config/locales/views/administrateurs/groupe_instructeurs/en.yml +++ b/config/locales/views/administrateurs/groupe_instructeurs/en.yml @@ -32,7 +32,6 @@ en: csv_import: import_file: Import file import_file_alert: All instructors added to the procedure will be notified by email. Do you want to continue? - import_file_procedure_not_published: CSV file import is available once the procedure is published groupes: title: Bulk Import / Export notice_1_html: For the import, your csv file must have 2 columns (Group, Email) and be comma separated (example file). The file size must be less than %{csv_max_size}. diff --git a/config/locales/views/administrateurs/groupe_instructeurs/fr.yml b/config/locales/views/administrateurs/groupe_instructeurs/fr.yml index d72670381..cf5bac1a8 100644 --- a/config/locales/views/administrateurs/groupe_instructeurs/fr.yml +++ b/config/locales/views/administrateurs/groupe_instructeurs/fr.yml @@ -39,7 +39,6 @@ fr: csv_import: import_file: Importer le fichier import_file_alert: Tous les instructeurs ajoutés à la procédure vont être notifiés par email. Voulez-vous continuer ? - import_file_procedure_not_published: L’import par fichier CSV est disponible une fois la démarche publiée groupes: title: Import / Export en masse notice_1_html: Pour l’import, votre fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (exemple de fichier). Le poids du fichier doit être inférieur à %{csv_max_size}.