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

138 lines
4.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2019-10-24 21:52:05 +02:00
module Instructeurs
class GroupeInstructeursController < InstructeurController
include EmailSanitizableConcern
include UninterlacePngConcern
include GroupeInstructeursSignatureConcern
before_action :ensure_allowed!
2019-10-24 21:52:05 +02:00
ITEMS_PER_PAGE = 25
def index
@procedure = procedure
@groupes_instructeurs = paginated_groupe_instructeurs
end
2019-10-24 22:17:55 +02:00
def show
@procedure = procedure
@groupe_instructeur = groupe_instructeur
@instructeurs = paginated_instructeurs
end
2019-10-25 09:26:31 +02:00
def add_instructeur
2024-07-10 15:54:12 +02:00
email = instructeur_email.present? ? [instructeur_email] : []
email = check_if_typo(email)&.first
errors = Array.wrap(generate_emails_suggestions_message(@maybe_typos))
if !errors.empty?
flash.now[:alert] = errors.join(". ") if !errors.empty?
@procedure = procedure
@groupe_instructeur = groupe_instructeur
@instructeurs = paginated_instructeurs
return render :show
end
instructeur = Instructeur.by_email(email) ||
create_instructeur(email)
2019-10-25 09:26:31 +02:00
if instructeur.blank?
flash[:alert] = "Ladresse email « #{email} » nest pas valide."
elsif groupe_instructeur.instructeurs.include?(instructeur)
flash[:alert] = "Linstructeur « #{email} » est déjà dans le groupe."
2019-10-25 09:26:31 +02:00
else
groupe_instructeur.add(instructeur)
flash[:notice] = "Linstructeur « #{email} » a été affecté au groupe."
if instructeur.user.email_verified_at
GroupeInstructeurMailer
.notify_added_instructeurs(groupe_instructeur, [instructeur], current_user.email)
.deliver_later
elsif instructeur.should_receive_email_activation?
InstructeurMailer.confirm_and_notify_added_instructeur(instructeur, groupe_instructeur, current_user.email).deliver_later
end
# else instructeur already exists and email is not verified, so do not spam them
2019-10-25 09:26:31 +02:00
end
redirect_to instructeur_groupe_path(procedure, groupe_instructeur)
end
2019-10-25 10:17:39 +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)
if groupe_instructeur.remove(instructeur)
flash[:notice] = "Linstructeur « #{instructeur.email} » a été retiré du groupe."
GroupeInstructeurMailer
.notify_removed_instructeur(groupe_instructeur, instructeur, current_user.email)
.deliver_later
else
flash[:alert] = "Linstructeur « #{instructeur.email} » nest pas dans le groupe."
end
2019-10-25 10:17:39 +02:00
end
redirect_to instructeur_groupe_path(procedure, groupe_instructeur)
end
2019-10-24 21:52:05 +02:00
private
2019-10-25 09:26:31 +02:00
def create_instructeur(email)
user = User.create_or_promote_to_instructeur(
email,
SecureRandom.hex,
administrateurs: [procedure.administrateurs.first]
)
2019-10-25 09:26:31 +02:00
user.instructeur
end
2019-10-24 21:52:05 +02:00
def procedure
current_instructeur
.procedures
.includes(:groupe_instructeurs)
.find(params[:procedure_id])
end
2019-10-24 22:17:55 +02:00
def groupe_instructeur
current_instructeur.groupe_instructeurs.find(params[:id])
end
2019-10-24 21:52:05 +02:00
def paginated_groupe_instructeurs
current_instructeur
.groupe_instructeurs
.where(procedure: procedure)
.page(params[:page])
.per(ITEMS_PER_PAGE)
end
2019-10-24 22:17:55 +02:00
def paginated_instructeurs
groupe_instructeur
.instructeurs
.page(params[:page])
.per(ITEMS_PER_PAGE)
.order(:email)
end
2019-10-25 09:26:31 +02:00
def instructeur_email
params.dig('instructeur', 'email')&.strip&.downcase
2019-10-25 09:26:31 +02:00
end
2019-10-25 10:17:39 +02:00
def instructeur_id
params[:instructeur][:id]
end
def ensure_allowed!
if !(current_administrateur&.owns?(procedure) || procedure.instructeurs_self_management_enabled?)
flash[:alert] = "Vous navez pas le droit de gérer les instructeurs de cette démarche"
redirect_to instructeur_procedure_path(procedure)
end
rescue ActiveRecord::RecordNotFound
flash[:alert] = "Vous navez pas accès à cette démarche"
redirect_to root_path
end
2019-10-24 21:52:05 +02:00
end
end