From c4b93f8d4a766bdbc07239f2bca4a00c674a5e00 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 26 Oct 2021 22:40:48 +0200 Subject: [PATCH] fix(groupe_instructeur): unfollow dossiers when removed from groupe instructeur --- .../groupe_instructeurs_controller.rb | 25 +++++++++--------- .../groupe_instructeurs_controller.rb | 26 +++++++++---------- app/models/instructeur.rb | 10 ++++--- .../groupe_instructeurs_controller_spec.rb | 10 +++++-- spec/models/instructeur_spec.rb | 4 +-- 5 files changed, 43 insertions(+), 32 deletions(-) diff --git a/app/controllers/instructeurs/groupe_instructeurs_controller.rb b/app/controllers/instructeurs/groupe_instructeurs_controller.rb index 42b73866e..c27457a49 100644 --- a/app/controllers/instructeurs/groupe_instructeurs_controller.rb +++ b/app/controllers/instructeurs/groupe_instructeurs_controller.rb @@ -14,17 +14,16 @@ module Instructeurs end def add_instructeur - @instructeur = Instructeur.by_email(instructeur_email) || + instructeur = Instructeur.by_email(instructeur_email) || create_instructeur(instructeur_email) - if groupe_instructeur.instructeurs.include?(@instructeur) + if groupe_instructeur.instructeurs.include?(instructeur) flash[:alert] = "L’instructeur « #{instructeur_email} » est déjà dans le groupe." - else - groupe_instructeur.instructeurs << @instructeur + groupe_instructeur.instructeurs << instructeur flash[:notice] = "L’instructeur « #{instructeur_email} » a été affecté au groupe." GroupeInstructeurMailer - .add_instructeurs(groupe_instructeur, [@instructeur], current_user.email) + .add_instructeurs(groupe_instructeur, [instructeur], current_user.email) .deliver_later end @@ -34,14 +33,16 @@ module Instructeurs 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 + instructeur = Instructeur.find(instructeur_id) + if instructeur.remove_from_groupe_instructeur(groupe_instructeur) + flash[:notice] = "L’instructeur « #{instructeur.email} » a été retiré du groupe." + GroupeInstructeurMailer + .remove_instructeur(groupe_instructeur, instructeur, current_user.email) + .deliver_later + else + flash[:alert] = "L’instructeur « #{instructeur.email} » n’est pas dans le groupe." + end end redirect_to instructeur_groupe_path(procedure, groupe_instructeur) diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index 5ab1b9eb6..fd787c840 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -155,22 +155,22 @@ module NewAdministrateur 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) if procedure.routee? - @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 - else - - instructeur = Instructeur.find(instructeur_id) - if instructeur.remove_from_procedure(procedure) - flash[:notice] = "L'instructeur a bien été désaffecté de la démarche" + if instructeur.remove_from_groupe_instructeur(groupe_instructeur) + flash[:notice] = "L’instructeur « #{instructeur.email} » a été retiré du groupe." + GroupeInstructeurMailer + .remove_instructeur(groupe_instructeur, instructeur, current_user.email) + .deliver_later else - flash[:alert] = "Suppression impossible : il doit y avoir au moins un instructeur dans le groupe" + flash[:alert] = "L’instructeur « #{instructeur.email} » n’est pas dans le groupe." + end + else + if instructeur.remove_from_groupe_instructeur(procedure.defaut_groupe_instructeur) + flash[:notice] = "L’instructeur a bien été désaffecté de la démarche" + else + flash[:alert] = "L’instructeur n’est pas affecté à la démarche" end end end diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index 0a3da5b33..de70468f2 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -80,9 +80,13 @@ class Instructeur < ApplicationRecord end end - def remove_from_procedure(procedure) - if procedure.defaut_groupe_instructeur.in?(groupe_instructeurs) - groupe_instructeurs.destroy(procedure.defaut_groupe_instructeur) + def remove_from_groupe_instructeur(groupe_instructeur) + if groupe_instructeur.in?(groupe_instructeurs) + groupe_instructeurs.destroy(groupe_instructeur) + follows + .joins(:dossier) + .where(dossiers: { groupe_instructeur: groupe_instructeur }) + .update_all(unfollowed_at: Time.zone.now) end end diff --git a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb index c9855e498..fdb0c91f6 100644 --- a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb @@ -64,9 +64,14 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do end describe '#remove_instructeur' do - let!(:new_instructeur) { create(:instructeur) } + let(:new_instructeur) { create(:instructeur) } + let(:dossier) { create(:dossier) } - before { gi_1_1.instructeurs << instructeur << new_instructeur } + before do + gi_1_1.instructeurs << instructeur << new_instructeur + gi_1_1.dossiers << dossier + new_instructeur.followed_dossiers << dossier + end def remove_instructeur(instructeur) delete :remove_instructeur, @@ -82,6 +87,7 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do it { expect(gi_1_1.instructeurs).to include(instructeur) } it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } + it { expect(new_instructeur.reload.follows.count).to eq(0) } it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) } end diff --git a/spec/models/instructeur_spec.rb b/spec/models/instructeur_spec.rb index 768feef92..4426629db 100644 --- a/spec/models/instructeur_spec.rb +++ b/spec/models/instructeur_spec.rb @@ -84,8 +84,8 @@ describe Instructeur, type: :model do end end - describe "#remove_from_procedure" do - subject { instructeur.remove_from_procedure(procedure_to_remove) } + describe "#remove_from_groupe_instructeur" do + subject { instructeur.remove_from_groupe_instructeur(procedure_to_remove.defaut_groupe_instructeur) } context "with an assigned procedure" do let(:procedure_to_remove) { procedure }