feat(instructeurs import): can import instructeurs even if procedure not published

This commit is contained in:
Eric Leroy-Terquem 2024-09-24 14:47:06 +02:00
parent 59fe8b64c4
commit af1fd34256
No known key found for this signature in database
GPG key ID: 53D8FAECEF207605
4 changed files with 32 additions and 42 deletions

View file

@ -322,44 +322,42 @@ module Administrateurs
end end
def import 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)
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"
flash[:alert] = "Importation impossible : veuillez importer un fichier CSV"
elsif csv_file.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)}" flash[:alert] = "Importation impossible : le poids du fichier est supérieur à #{number_to_human_size(CSV_MAX_SIZE)}"
else else
file = csv_file.read file = csv_file.read
base_encoding = CharlockHolmes::EncodingDetector.detect(file) 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") 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') } 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| 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)
if added_instructeurs.present? if added_instructeurs.present?
notify_instructeurs(groupe_instructeur, added_instructeurs) notify_instructeurs(groupe, added_instructeurs)
end end
flash_message_for_import(invalid_emails) flash_message_for_import(invalid_emails)
else
flash_message_for_invalid_csv
end 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 end
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
end end
end end

View file

@ -5,19 +5,13 @@
= t(".csv_import.#{key}.title") = t(".csv_import.#{key}.title")
.fr-collapse#accordion-106 .fr-collapse#accordion-106
- csv_max_size = Administrateurs::GroupeInstructeursController::CSV_MAX_SIZE - csv_max_size = Administrateurs::GroupeInstructeursController::CSV_MAX_SIZE
- if procedure.publiee_or_close? %p.notice
%p.notice = t(".csv_import.#{key}.notice_1_html", csv_max_size: number_to_human_size(csv_max_size))
= t(".csv_import.#{key}.notice_1_html", csv_max_size: number_to_human_size(csv_max_size)) %p.notice
%p.notice = t(".csv_import.#{key}.notice_2")
= 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
= 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"
= 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') }
= 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')
- if procedure.groupe_instructeurs.many? - if procedure.groupe_instructeurs.many?
.flex.justify-between.align-center.mt-4 .flex.justify-between.align-center.mt-4
%div %div

View file

@ -32,7 +32,6 @@ en:
csv_import: csv_import:
import_file: Import file 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_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: groupes:
title: Bulk Import / Export title: Bulk Import / Export
notice_1_html: For the import, your csv file must have 2 columns (Group, Email) and be comma separated (<a href=/csv/en/import-groupe-test.csv>example file</a>). The file size must be less than %{csv_max_size}. notice_1_html: For the import, your csv file must have 2 columns (Group, Email) and be comma separated (<a href=/csv/en/import-groupe-test.csv>example file</a>). The file size must be less than %{csv_max_size}.

View file

@ -39,7 +39,6 @@ fr:
csv_import: csv_import:
import_file: Importer le fichier 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_alert: Tous les instructeurs ajoutés à la procédure vont être notifiés par email. Voulez-vous continuer ?
import_file_procedure_not_published: Limport par fichier CSV est disponible une fois la démarche publiée
groupes: groupes:
title: Import / Export en masse title: Import / Export en masse
notice_1_html: Pour limport, votre fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (<a href=/csv/fr/import-groupe-test.csv>exemple de fichier</a>). Le poids du fichier doit être inférieur à %{csv_max_size}. notice_1_html: Pour limport, votre fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (<a href=/csv/fr/import-groupe-test.csv>exemple de fichier</a>). Le poids du fichier doit être inférieur à %{csv_max_size}.