Add instructeur

This commit is contained in:
simon lehericey 2019-10-25 09:26:31 +02:00
parent 94081a3997
commit 79b808470c
4 changed files with 71 additions and 1 deletions

View file

@ -13,8 +13,36 @@ module Instructeurs
@instructeurs = paginated_instructeurs @instructeurs = paginated_instructeurs
end end
def add_instructeur
@instructeur = Instructeur.find_by(email: instructeur_email) ||
create_instructeur(instructeur_email)
if groupe_instructeur.instructeurs.include?(@instructeur)
flash[:alert] = "Linstructeur « #{instructeur_email} » est déjà dans le groupe."
else
groupe_instructeur.instructeurs << @instructeur
flash[:notice] = "Linstructeur « #{instructeur_email} » a été affecté au groupe."
GroupeInstructeurMailer
.add_instructeur(groupe_instructeur, @instructeur, current_user.email)
.deliver_later
end
redirect_to instructeur_groupe_path(procedure, groupe_instructeur)
end
private private
def create_instructeur(email)
user = User.create_or_promote_to_instructeur(
email,
SecureRandom.hex,
administrateurs: [procedure.administrateurs.first]
)
user.invite!
user.instructeur
end
def procedure def procedure
current_instructeur current_instructeur
.procedures .procedures
@ -42,5 +70,9 @@ module Instructeurs
.per(ITEMS_PER_PAGE) .per(ITEMS_PER_PAGE)
.order(:email) .order(:email)
end end
def instructeur_email
params[:instructeur][:email].strip.downcase
end
end end
end end

View file

@ -10,6 +10,14 @@
.card.mt-2 .card.mt-2
.card-title Gestion des instructeurs .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 %table.table.mt-2
%thead %thead

View file

@ -288,7 +288,11 @@ Rails.application.routes.draw do
scope module: 'instructeurs', as: 'instructeur' do scope module: 'instructeurs', as: 'instructeur' do
resources :procedures, only: [:index, :show], param: :procedure_id do resources :procedures, only: [:index, :show], param: :procedure_id do
member do member do
resources :groupes, only: [:index, :show], controller: 'groupe_instructeurs' resources :groupes, only: [:index, :show], controller: 'groupe_instructeurs' do
member do
post 'add_instructeur'
end
end
patch 'update_displayed_fields' patch 'update_displayed_fields'
get 'update_sort/:table/:column' => 'procedures#update_sort', as: 'update_sort' get 'update_sort/:table/:column' => 'procedures#update_sort', as: 'update_sort'

View file

@ -36,4 +36,30 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
it { expect(response).to have_http_status(:ok) } it { expect(response).to have_http_status(:ok) }
end end
end end
describe '#add_instructeur' do
before do
post :add_instructeur,
params: {
procedure_id: procedure.id,
id: gi_1_2.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_2.instructeurs.pluck(:email)).to include(new_instructeur_email) }
it { expect(flash.notice).to be_present }
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) }
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(instructeur_groupe_path(procedure, gi_1_2)) }
end
end
end end