Assiduité : Permission JustifValidate #823

This commit is contained in:
Iziram 2024-06-26 10:32:15 +02:00
parent ddfd94b0ba
commit 48376724f5
5 changed files with 83 additions and 12 deletions

View File

@ -374,6 +374,10 @@ def _create_one(
errors.append("param 'etat': invalide") errors.append("param 'etat': invalide")
etat: scu.EtatJustificatif = scu.EtatJustificatif.get(etat) etat: scu.EtatJustificatif = scu.EtatJustificatif.get(etat)
if etat != scu.EtatJustificatif.ATTENTE and not current_user.has_permission(
Permission.JustifValidate
):
errors.append("param 'etat': non autorisé (Permission.JustifValidate)")
# cas 2 : date_debut # cas 2 : date_debut
date_debut: str = data.get("date_debut", None) date_debut: str = data.get("date_debut", None)
@ -473,7 +477,10 @@ def justif_edit(justif_id: int):
if etat is None: if etat is None:
errors.append("param 'etat': invalide") errors.append("param 'etat': invalide")
else: else:
justificatif_unique.etat = etat if current_user.has_permission(Permission.JustifValidate):
justificatif_unique.etat = etat
else:
errors.append("param 'etat': non autorisé (Permission.JustifValidate)")
# Cas 2 : raison # Cas 2 : raison
raison: str = data.get("raison", False) raison: str = data.get("raison", False)

View File

@ -170,13 +170,7 @@ class AjoutJustificatifEtudForm(AjoutAssiOrJustForm):
) )
etat = SelectField( etat = SelectField(
"État du justificatif", "État du justificatif",
choices=[ choices=[], # sera rempli dynamiquement
("", "Choisir..."), # Placeholder
(scu.EtatJustificatif.ATTENTE.value, "En attente de validation"),
(scu.EtatJustificatif.NON_VALIDE.value, "Non valide"),
(scu.EtatJustificatif.MODIFIE.value, "Modifié"),
(scu.EtatJustificatif.VALIDE.value, "Valide"),
],
validators=[DataRequired(message="This field is required.")], validators=[DataRequired(message="This field is required.")],
) )
fichiers = MultipleFileField(label="Ajouter des fichiers") fichiers = MultipleFileField(label="Ajouter des fichiers")

View File

@ -1136,7 +1136,9 @@ def formsemestre_status(formsemestre_id=None, check_parcours=True):
# --- Lien Traitement Justificatifs: # --- Lien Traitement Justificatifs:
if current_user.has_permission(Permission.AbsJustifView): if current_user.has_permission(
Permission.AbsJustifView
) and current_user.has_permission(Permission.JustifValidate):
H.append( H.append(
f"""<p> f"""<p>
<a class="stdlink" href="{url_for('assiduites.traitement_justificatifs', <a class="stdlink" href="{url_for('assiduites.traitement_justificatifs',

View File

@ -68,6 +68,11 @@ _SCO_PERMISSIONS = (
"AbsJustifView", "AbsJustifView",
"Visualisation du détail des justificatifs (motif, fichiers)", "Visualisation du détail des justificatifs (motif, fichiers)",
), ),
(
1 << 51,
"JustifValidate",
"Définir la validité d'un justificatif (valide, invalide, modifié)",
),
# Attention: les permissions sont codées sur 64 bits. # Attention: les permissions sont codées sur 64 bits.
) )

View File

@ -519,11 +519,22 @@ def _record_assiduite_etud(
if assi_etat != scu.EtatAssiduite.PRESENT and form.est_just.data: if assi_etat != scu.EtatAssiduite.PRESENT and form.est_just.data:
# si la case "justifiée est cochée alors on créé un justificatif de même période" # si la case "justifiée est cochée alors on créé un justificatif de même période"
# L'état est Valide si l'user à la permission JustifValidate
etat: scu.EtatJustificatif = scu.EtatJustificatif.ATTENTE
if current_user.has_permission(Permission.JustifValidate):
etat = scu.EtatJustificatif.VALIDE
else:
flash(
"Vous ne pouvez pas créer de justificatif valide,"
+ " il est automatiquement passé 'EN ATTENTE'",
)
justi: Justificatif = Justificatif.create_justificatif( justi: Justificatif = Justificatif.create_justificatif(
etudiant=etud, etudiant=etud,
date_debut=dt_debut_tz_server, date_debut=dt_debut_tz_server,
date_fin=dt_fin_tz_server, date_fin=dt_fin_tz_server,
etat=scu.EtatJustificatif.VALIDE, etat=etat,
user_id=current_user.id, user_id=current_user.id,
) )
@ -642,6 +653,21 @@ def edit_justificatif_etud(justif_id: int):
readonly = not current_user.has_permission(Permission.AbsChange) readonly = not current_user.has_permission(Permission.AbsChange)
form = AjoutJustificatifEtudForm(obj=justif) form = AjoutJustificatifEtudForm(obj=justif)
# Limite les choix d'état si l'utilisateur n'a pas la permission de valider
choix_etat: list = [
(scu.EtatJustificatif.ATTENTE.value, "En attente de validation")
]
if current_user.has_permission(Permission.JustifValidate):
choix_etat = [
("", "Choisir..."),
(scu.EtatJustificatif.ATTENTE.value, "En attente de validation"),
(scu.EtatJustificatif.NON_VALIDE.value, "Non valide"),
(scu.EtatJustificatif.MODIFIE.value, "Modifié"),
(scu.EtatJustificatif.VALIDE.value, "Valide"),
]
form.etat.choices = choix_etat
if readonly: if readonly:
form.disable_all() form.disable_all()
@ -717,6 +743,21 @@ def ajout_justificatif_etud():
) )
form = AjoutJustificatifEtudForm() form = AjoutJustificatifEtudForm()
# Limite les choix d'état si l'utilisateur n'a pas la permission de valider
choix_etat: list = [
(scu.EtatJustificatif.ATTENTE.value, "En attente de validation")
]
if current_user.has_permission(Permission.JustifValidate):
choix_etat = [
("", "Choisir..."),
(scu.EtatJustificatif.ATTENTE.value, "En attente de validation"),
(scu.EtatJustificatif.NON_VALIDE.value, "Non valide"),
(scu.EtatJustificatif.MODIFIE.value, "Modifié"),
(scu.EtatJustificatif.VALIDE.value, "Valide"),
]
form.etat.choices = choix_etat
if form.validate_on_submit(): if form.validate_on_submit():
if form.cancel.data: # cancel button if form.cancel.data: # cancel button
return redirect(redirect_url) return redirect(redirect_url)
@ -782,6 +823,16 @@ def _record_justificatif_etud(
form.set_error("Erreur: état invalide") form.set_error("Erreur: état invalide")
return False return False
if (
not current_user.has_permission(Permission.JustifValidate)
and etat != scu.EtatJustificatif.ATTENTE
):
log("_record_justificatif_etud: pas la permission")
form.set_error(
"Erreur: vous n'avez pas la permission de définir la validité d'un justificatif"
)
return False
try: try:
message = "" message = ""
if justif: if justif:
@ -1521,12 +1572,22 @@ def tableau_assiduite_actions():
# Justification d'une assiduité depuis le tableau # Justification d'une assiduité depuis le tableau
if action == "justifier" and obj_type == "assiduite": if action == "justifier" and obj_type == "assiduite":
# L'état est Valide si l'user à la permission JustifValidate
etat: scu.EtatJustificatif = scu.EtatJustificatif.ATTENTE
if current_user.has_permission(Permission.JustifValidate):
etat = scu.EtatJustificatif.VALIDE
else:
flash(
"Vous ne pouvez pas créer de justificatif valide,"
+ " il est automatiquement passé 'EN ATTENTE'",
)
# Création du justificatif correspondant # Création du justificatif correspondant
justificatif_correspondant: Justificatif = Justificatif.create_justificatif( justificatif_correspondant: Justificatif = Justificatif.create_justificatif(
etudiant=objet.etudiant, etudiant=objet.etudiant,
date_debut=objet.date_debut, date_debut=objet.date_debut,
date_fin=objet.date_fin, date_fin=objet.date_fin,
etat=scu.EtatJustificatif.VALIDE, etat=etat,
user_id=current_user.id, user_id=current_user.id,
) )
@ -1534,7 +1595,8 @@ def tableau_assiduite_actions():
scass.simple_invalidate_cache( scass.simple_invalidate_cache(
justificatif_correspondant.to_dict(), objet.etudiant.id justificatif_correspondant.to_dict(), objet.etudiant.id
) )
flash(f"{objet_name} justifiée") if etat == scu.EtatJustificatif.VALIDE:
flash(f"{objet_name} justifiée")
return redirect(request.referrer) return redirect(request.referrer)
# Si on arrive ici, c'est que l'action n'est pas autorisée # Si on arrive ici, c'est que l'action n'est pas autorisée
@ -1695,6 +1757,7 @@ def signale_evaluation_abs(etudid: int = None, evaluation_id: int = None):
@bp.route("traitement_justificatifs") @bp.route("traitement_justificatifs")
@scodoc @scodoc
@permission_required(Permission.JustifValidate)
@permission_required(Permission.AbsJustifView) @permission_required(Permission.AbsJustifView)
def traitement_justificatifs(): def traitement_justificatifs():
"""Page de traitement des justificatifs """Page de traitement des justificatifs