From a6deafd885b3e8c64d365aaf43b8881c803af912 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 10 Oct 2019 19:36:56 +0200 Subject: [PATCH] Add instructeurs to groupe --- .../groupe_instructeurs_controller.rb | 32 +++++++++++++++++++ app/mailers/groupe_instructeur_mailer.rb | 14 ++++++++ .../add_instructeur.html.haml | 11 +++++++ .../groupe_instructeurs/show.html.haml | 8 +++++ config/routes.rb | 6 +++- .../groupe_instructeurs_controller_spec.rb | 29 +++++++++++++++++ 6 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 app/mailers/groupe_instructeur_mailer.rb create mode 100644 app/views/groupe_instructeur_mailer/add_instructeur.html.haml diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index 50ce654aa..5a280e529 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -46,8 +46,36 @@ module NewAdministrateur end end + def add_instructeur + @instructeur = Instructeur.find_by(email: instructeur_email) || + create_instructeur(instructeur_email) + + if groupe_instructeur.instructeurs.include?(@instructeur) + flash[:alert] = "L’instructeur « #{instructeur_email} » est déjà dans le groupe." + + else + groupe_instructeur.instructeurs << @instructeur + flash[:notice] = "L’instructeur « #{instructeur_email} » a été affecté au groupe." + GroupeInstructeurMailer + .add_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) + user = User.create_or_promote_to_instructeur( + email, + SecureRandom.hex, + administrateurs: [current_administrateur] + ) + user.invite! + user.instructeur + end + def procedure current_administrateur .procedures @@ -59,6 +87,10 @@ module NewAdministrateur procedure.groupe_instructeurs.find(params[:id]) end + def instructeur_email + params[:instructeur][:email].strip.downcase + end + def label params[:groupe_instructeur][:label] end diff --git a/app/mailers/groupe_instructeur_mailer.rb b/app/mailers/groupe_instructeur_mailer.rb new file mode 100644 index 000000000..fec9972e6 --- /dev/null +++ b/app/mailers/groupe_instructeur_mailer.rb @@ -0,0 +1,14 @@ +class GroupeInstructeurMailer < ApplicationMailer + layout 'mailers/layout' + + def add_instructeur(group, instructeur, current_instructeur_email) + @email = instructeur.email + @group = group + @current_instructeur_email = current_instructeur_email + + subject = "Ajout 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/add_instructeur.html.haml b/app/views/groupe_instructeur_mailer/add_instructeur.html.haml new file mode 100644 index 000000000..578312cb7 --- /dev/null +++ b/app/views/groupe_instructeur_mailer/add_instructeur.html.haml @@ -0,0 +1,11 @@ +%p + Bonjour, + +%p + L’instructeur « #{@email} » a été affecté au 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 c08d4399b..a569a9c34 100644 --- a/app/views/new_administrateur/groupe_instructeurs/show.html.haml +++ b/app/views/new_administrateur/groupe_instructeurs/show.html.haml @@ -20,6 +20,14 @@ .card .card-title Gestion des instructeurs + = form_for :instructeur, + url: { action: :add_instructeur }, + html: { class: 'form' } do |f| + + = f.label :email do + Affecter un nouvel instructeur + = f.email_field :email, placeholder: 'marie.dupont@exemple.fr', required: true + = f.submit 'Affecter', class: 'button primary send' %table.table.mt-2 %thead diff --git a/config/routes.rb b/config/routes.rb index 973188fed..0ec8fc4d0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -350,7 +350,11 @@ Rails.application.routes.draw do get 'annotations' end - resources :groupe_instructeurs, only: [:index, :show, :create, :update] + resources :groupe_instructeurs, only: [:index, :show, :create, :update] do + member do + post 'add_instructeur' + end + end resources :administrateurs, controller: 'procedure_administrateurs', only: [:index, :create, :destroy] diff --git a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb index 912a4b2fe..c98718e4b 100644 --- a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb @@ -83,4 +83,33 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(flash.alert).to be_present } end end + + describe '#add_instructeur' do + let!(:instructeur) { create(:instructeur) } + before do + gi_1_1.instructeurs << instructeur + + post :add_instructeur, + params: { + procedure_id: procedure.id, + id: gi_1_1.id, + instructeur: { email: new_instructeur_email } + } + end + + context 'of a new instructeur' do + let(:new_instructeur_email) { 'new_instructeur@mail.com' } + + it { expect(gi_1_1.instructeurs.pluck(:email)).to include(new_instructeur_email) } + it { expect(flash.notice).to be_present } + it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, gi_1_1)) } + end + + context 'of an instructeur already in the group' do + let(:new_instructeur_email) { instructeur.email } + + it { expect(flash.alert).to be_present } + it { expect(response).to redirect_to(procedure_groupe_instructeur_path(procedure, procedure.defaut_groupe_instructeur)) } + end + end end