demarches-normaliennes/app/controllers/new_administrateur/groupe_instructeurs_controller.rb
simon lehericey 6657459f9c Fix add instructeur with empty mail
As select2 does not handle required attribute, we can only add server side logic
2019-11-27 14:39:16 +01:00

167 lines
4.8 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module NewAdministrateur
class GroupeInstructeursController < AdministrateurController
ITEMS_PER_PAGE = 25
def index
@procedure = procedure
@groupes_instructeurs = paginated_groupe_instructeurs
end
def show
@procedure = procedure
@groupe_instructeur = groupe_instructeur
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
end
def create
@groupe_instructeur = procedure
.groupe_instructeurs
.new(label: label, instructeurs: [current_administrateur.instructeur])
if @groupe_instructeur.save
redirect_to procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe dinstructeurs « #{label} » a été créé."
else
@procedure = procedure
@groupes_instructeurs = paginated_groupe_instructeurs
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
render :index
end
end
def update
@groupe_instructeur = groupe_instructeur
if @groupe_instructeur.update(label: label)
redirect_to procedure_groupe_instructeur_path(procedure, groupe_instructeur),
notice: "Le nom est à présent « #{label} »."
else
@procedure = procedure
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
render :show
end
end
def add_instructeur
emails = params['emails'].presence || []
emails = emails.map(&:strip).map(&:downcase)
correct_emails, bad_emails = emails
.partition { |email| URI::MailTo::EMAIL_REGEXP.match?(email) }
if bad_emails.present?
flash[:alert] = t('.wrong_address',
count: bad_emails.count,
value: bad_emails.join(', '))
end
email_to_adds = correct_emails - groupe_instructeur.instructeurs.pluck(:email)
if email_to_adds.present?
instructeurs = email_to_adds.map do |instructeur_email|
Instructeur.by_email(instructeur_email) ||
create_instructeur(instructeur_email)
end
GroupeInstructeurMailer
.add_instructeurs(groupe_instructeur, instructeurs, current_user.email)
.deliver_later
groupe_instructeur.instructeurs << instructeurs
flash[:notice] = t('.assignment',
count: email_to_adds.count,
value: email_to_adds.join(', '),
groupe: groupe_instructeur.label)
end
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] = "Linstructeur « #{@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
def update_routing_criteria_name
procedure.update!(routing_criteria_name: routing_criteria_name)
redirect_to procedure_groupe_instructeurs_path(procedure),
notice: "Le libellé est maintenant « #{procedure.routing_criteria_name} »."
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
.includes(:groupe_instructeurs)
.find(params[:procedure_id])
end
def groupe_instructeur
procedure.groupe_instructeurs.find(params[:id])
end
def instructeur_id
params[:instructeur][:id]
end
def label
params[:groupe_instructeur][:label]
end
def paginated_groupe_instructeurs
procedure
.groupe_instructeurs
.page(params[:page])
.per(ITEMS_PER_PAGE)
.order(:label)
end
def paginated_instructeurs
groupe_instructeur
.instructeurs
.page(params[:page])
.per(ITEMS_PER_PAGE)
.order(:email)
end
def routing_criteria_name
params[:procedure][:routing_criteria_name]
end
def available_instructeur_emails
all = current_administrateur.instructeurs.pluck(:email)
assigned = groupe_instructeur.instructeurs.pluck(:email)
(all - assigned).sort
end
end
end