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
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

View file

@ -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

View file

@ -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 (<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:
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: Limport par fichier CSV est disponible une fois la démarche publiée
groupes:
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}.