From a5ffe9f54bf49c954f54b1a74d16144e8d330b4d Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 9 Oct 2019 18:23:29 +0200 Subject: [PATCH] Remove instructeur from the group --- .../groupe_instructeurs_controller.rb | 20 +++++++++++ app/mailers/groupe_instructeur_mailer.rb | 11 ++++++ .../remove_instructeur.html.haml | 11 ++++++ .../groupe_instructeurs/show.html.haml | 6 ++++ config/routes.rb | 1 + .../groupe_instructeurs_controller_spec.rb | 35 +++++++++++++++++++ 6 files changed, 84 insertions(+) create mode 100644 app/views/groupe_instructeur_mailer/remove_instructeur.html.haml diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index 5a280e529..f9e1e791a 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -64,6 +64,22 @@ module NewAdministrateur redirect_to procedure_groupe_instructeur_path(procedure, groupe_instructeur) end + def remove_instructeur + if groupe_instructeur.instructeurs.one? + flash[:alert] = "Suppression impossible : il doit y avoir au moins un instructeur dans le groupe" + + else + @instructeur = Instructeur.find(instructeur_id) + groupe_instructeur.instructeurs.destroy(@instructeur) + flash[:notice] = "L’instructeur « #{@instructeur.email} » a été retiré du groupe." + GroupeInstructeurMailer + .remove_instructeur(groupe_instructeur, @instructeur, current_user.email) + .deliver_later + end + + redirect_to procedure_groupe_instructeur_path(procedure, groupe_instructeur) + end + private def create_instructeur(email) @@ -91,6 +107,10 @@ module NewAdministrateur params[:instructeur][:email].strip.downcase end + def instructeur_id + params[:instructeur][:id] + end + def label params[:groupe_instructeur][:label] end diff --git a/app/mailers/groupe_instructeur_mailer.rb b/app/mailers/groupe_instructeur_mailer.rb index fec9972e6..f5af9dd3c 100644 --- a/app/mailers/groupe_instructeur_mailer.rb +++ b/app/mailers/groupe_instructeur_mailer.rb @@ -11,4 +11,15 @@ class GroupeInstructeurMailer < ApplicationMailer emails = @group.instructeurs.pluck(:email) mail(bcc: emails, subject: subject) end + + def remove_instructeur(group, instructeur, current_instructeur_email) + @email = instructeur.email + @group = group + @current_instructeur_email = current_instructeur_email + + subject = "Suppression d’un instructeur dans le groupe \"#{group.label}\"" + + emails = @group.instructeurs.pluck(:email) + mail(bcc: emails, subject: subject) + end end diff --git a/app/views/groupe_instructeur_mailer/remove_instructeur.html.haml b/app/views/groupe_instructeur_mailer/remove_instructeur.html.haml new file mode 100644 index 000000000..15a3f15a7 --- /dev/null +++ b/app/views/groupe_instructeur_mailer/remove_instructeur.html.haml @@ -0,0 +1,11 @@ +%p + Bonjour, + +%p + L’instructeur « #{@email} » a été retiré du groupe « #{@group.label} » par « #{@current_instructeur_email} », en charge de la démarche « #{@group.procedure.libelle} ». + +%p + Cliquez sur le lien ci-dessous pour voir la liste des instructeurs de ce groupe : + = link_to(@group.label, procedure_groupe_instructeur_url(@group.procedure, @group)) + += render partial: "layouts/mailers/signature" diff --git a/app/views/new_administrateur/groupe_instructeurs/show.html.haml b/app/views/new_administrateur/groupe_instructeurs/show.html.haml index a569a9c34..40a3df3f4 100644 --- a/app/views/new_administrateur/groupe_instructeurs/show.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/show.html.haml @@ -37,5 +37,11 @@ - @instructeurs.each do |instructeur| %tr %td= instructeur.email + %td.actions= button_to 'retirer', + { action: :remove_instructeur }, + { method: :delete, + data: { confirm: "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » du groupe  « #{@groupe_instructeur.label} » ?" }, + params: { instructeur: { id: instructeur.id }}, + class: 'button' } = paginate @instructeurs diff --git a/config/routes.rb b/config/routes.rb index 0ec8fc4d0..dd1747482 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -353,6 +353,7 @@ Rails.application.routes.draw do resources :groupe_instructeurs, only: [:index, :show, :create, :update] do member do post 'add_instructeur' + delete 'remove_instructeur' end end diff --git a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb index c98718e4b..4ee61c8df 100644 --- a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb @@ -112,4 +112,39 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur)) } end end + + describe '#remove_instructeur' do + let!(:instructeur) { create(:instructeur) } + + before { gi_1_1.instructeurs << admin.instructeur << instructeur } + + def remove_instructeur(email) + delete :remove_instructeur, + params: { + procedure_id: procedure.id, + id: gi_1_1.id, + instructeur: { id: admin.instructeur.id } + } + end + + context 'when there are many instructeurs' do + before { remove_instructeur(admin.user.email) } + + it { expect(gi_1_1.instructeurs).to include(instructeur) } + it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } + it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, gi_1_1)) } + end + + context 'when there is only one instructeur' do + before do + remove_instructeur(admin.user.email) + remove_instructeur(instructeur.email) + end + + it { expect(gi_1_1.instructeurs).to include(instructeur) } + it { expect(gi_1_1.instructeurs.count).to eq(1) } + it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') } + it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, gi_1_1)) } + end + end end