demarches-normaliennes/app/controllers/new_administrateur/groupe_instructeurs_controller.rb

180 lines
5.3 KiB
Ruby
Raw Normal View History

2019-10-17 15:13:50 +02:00
module NewAdministrateur
class GroupeInstructeursController < AdministrateurController
ITEMS_PER_PAGE = 25
def index
@procedure = procedure
2019-10-23 20:51:25 +02:00
@groupes_instructeurs = paginated_groupe_instructeurs
2019-10-17 15:13:50 +02:00
end
2019-10-23 20:22:56 +02:00
def show
@procedure = procedure
@groupe_instructeur = groupe_instructeur
2019-10-23 20:54:59 +02:00
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
2019-10-23 20:22:56 +02:00
end
2019-10-23 20:51:25 +02:00
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
2019-10-23 20:54:59 +02:00
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
2019-10-23 20:54:59 +02:00
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
render :show
end
end
def destroy
if procedure.groupe_instructeurs.one?
flash[:alert] = "Suppression impossible : il doit y avoir au moins un groupe instructeur sur chaque procédure"
elsif groupe_instructeur == procedure.defaut_groupe_instructeur
flash[:alert] = "Impossible de supprimer le groupe par défaut"
else
flash[:notice] = "le groupe « #{groupe_instructeur.label} » a été supprimé."
groupe_instructeur.destroy
end
redirect_to procedure_groupe_instructeurs_path(procedure)
end
2019-10-10 19:36:56 +02:00
def add_instructeur
emails = params['emails'].presence || []
emails = emails.map(&:strip).map(&:downcase)
2019-10-10 19:36:56 +02:00
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.map(&:email)
if email_to_adds.present?
instructeurs = email_to_adds.map do |instructeur_email|
Instructeur.by_email(instructeur_email) ||
create_instructeur(instructeur_email)
end
2019-10-10 19:36:56 +02:00
groupe_instructeur.instructeurs << instructeurs
2019-10-10 19:36:56 +02:00
GroupeInstructeurMailer
.add_instructeurs(groupe_instructeur, instructeurs, current_user.email)
2019-10-10 19:36:56 +02:00
.deliver_later
flash[:notice] = t('.assignment',
count: email_to_adds.count,
value: email_to_adds.join(', '),
groupe: groupe_instructeur.label)
2019-10-10 19:36:56 +02:00
end
redirect_to procedure_groupe_instructeur_path(procedure, groupe_instructeur)
end
2019-10-09 18:23:29 +02:00
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
2019-10-17 10:57:58 +02:00
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
2019-10-17 15:13:50 +02:00
private
2019-10-10 19:36:56 +02:00
def create_instructeur(email)
user = User.create_or_promote_to_instructeur(
email,
SecureRandom.hex,
administrateurs: [current_administrateur]
)
user.invite!
user.instructeur
end
2019-10-17 15:13:50 +02:00
def procedure
current_administrateur
.procedures
.includes(:groupe_instructeurs)
.find(params[:procedure_id])
end
2019-10-23 20:22:56 +02:00
def groupe_instructeur
procedure.groupe_instructeurs.find(params[:id])
end
2019-10-23 20:51:25 +02:00
2019-10-09 18:23:29 +02:00
def instructeur_id
params[:instructeur][:id]
end
2019-10-23 20:51:25 +02:00
def label
params[:groupe_instructeur][:label]
end
def paginated_groupe_instructeurs
procedure
.groupe_instructeurs
.page(params[:page])
.per(ITEMS_PER_PAGE)
.order(:label)
end
2019-10-23 20:54:59 +02:00
def paginated_instructeurs
groupe_instructeur
.instructeurs
.page(params[:page])
.per(ITEMS_PER_PAGE)
.order(:email)
end
2019-10-17 10:57:58 +02:00
def routing_criteria_name
params[:procedure][:routing_criteria_name]
end
def available_instructeur_emails
all = current_administrateur.instructeurs.map(&:email)
assigned = groupe_instructeur.instructeurs.map(&:email)
(all - assigned).sort
end
2019-10-17 15:13:50 +02:00
end
end