From bf4b69c9b29563e7f9ec8ed1cbc6f9284de9fd0a Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 12 Dec 2023 03:05:31 +0100 Subject: [PATCH] WIP: formulaire ajout justificatif --- app/api/justificatifs.py | 4 +- app/forms/assiduite/ajout_assiduite_etud.py | 58 ++-- app/models/assiduites.py | 8 +- app/scodoc/html_sidebar.py | 28 +- app/scodoc/sco_archives_justificatifs.py | 4 +- app/scodoc/sco_bulletins_legacy.py | 2 +- app/scodoc/sco_bulletins_standard.py | 9 +- app/scodoc/sco_evaluation_check_abs.py | 2 +- app/static/css/assiduites.css | 26 +- app/tables/liste_assiduites.py | 12 +- .../assiduites/pages/ajout_justificatif.j2 | 245 ---------------- .../pages/ajout_justificatif_etud.j2 | 105 +++++++ app/templates/assiduites/widgets/tableau.j2 | 2 +- app/templates/sidebar.j2 | 2 +- app/views/assiduites.py | 267 +++++++++++------- sco_version.py | 2 +- 16 files changed, 383 insertions(+), 393 deletions(-) delete mode 100644 app/templates/assiduites/pages/ajout_justificatif.j2 create mode 100644 app/templates/assiduites/pages/ajout_justificatif_etud.j2 diff --git a/app/api/justificatifs.py b/app/api/justificatifs.py index 57c36b3f..d0b10ec4 100644 --- a/app/api/justificatifs.py +++ b/app/api/justificatifs.py @@ -640,9 +640,9 @@ def justif_import(justif_id: int = None): db.session.commit() return {"filename": fname} - except ScoValueError as err: + except ScoValueError as exc: # Si cela ne fonctionne pas on renvoie une erreur - return json_error(404, err.args[0]) + return json_error(404, exc.args[0]) @bp.route("/justificatif//export/", methods=["GET", "POST"]) diff --git a/app/forms/assiduite/ajout_assiduite_etud.py b/app/forms/assiduite/ajout_assiduite_etud.py index 96616fd0..2c83f0f5 100644 --- a/app/forms/assiduite/ajout_assiduite_etud.py +++ b/app/forms/assiduite/ajout_assiduite_etud.py @@ -26,9 +26,11 @@ """ Formulaire ajout d'une "assiduité" sur un étudiant +Formulaire ajout d'un justificatif sur un étudiant """ from flask_wtf import FlaskForm +from flask_wtf.file import MultipleFileField from wtforms import ( SelectField, StringField, @@ -37,20 +39,15 @@ from wtforms import ( TextAreaField, validators, ) +from wtforms.validators import DataRequired -class AjoutAssiduiteEtudForm(FlaskForm): - "Formulaire de saisie d'une assiduité pour un étudiant" +class AjoutAssiOrJustForm(FlaskForm): + """Elements communs aux deux formulaires ajout + assiduité et justificatif + """ + error_message = "" # used to report our errors - - assi_etat = RadioField( - "Signaler:", - choices=[("absent", "absence"), ("retard", "retard"), ("present", "présence")], - default="absent", - validators=[ - validators.DataRequired("spécifiez le type d'évènement à signaler"), - ], - ) date_debut = StringField( "Date de début", validators=[validators.Length(max=10)], @@ -89,14 +86,9 @@ class AjoutAssiduiteEtudForm(FlaskForm): "id": "assi_date_fin", }, ) - modimpl = SelectField( - "Module", - choices={}, # will be populated dynamically - ) assi_raison = TextAreaField( "Raison", render_kw={ - # "name": "assi_raison", "id": "assi_raison", "cols": 75, "rows": 4, @@ -114,3 +106,37 @@ class AjoutAssiduiteEtudForm(FlaskForm): ) submit = SubmitField("Enregistrer") cancel = SubmitField("Annuler", render_kw={"formnovalidate": True}) + + +class AjoutAssiduiteEtudForm(AjoutAssiOrJustForm): + "Formulaire de saisie d'une assiduité pour un étudiant" + + assi_etat = RadioField( + "Signaler:", + choices=[("absent", "absence"), ("retard", "retard"), ("present", "présence")], + default="absent", + validators=[ + validators.DataRequired("spécifiez le type d'évènement à signaler"), + ], + ) + modimpl = SelectField( + "Module", + choices={}, # will be populated dynamically + ) + + +class AjoutJustificatifEtudForm(AjoutAssiOrJustForm): + "Formulaire de saisie d'un justificatif pour un étudiant" + + etat = SelectField( + "État du justificatif", + choices=[ + ("", "Choisir..."), # Placeholder + ("attente", "En attente de validation"), + ("non_valide", "Non valide"), + ("modifie", "Modifié"), + ("valide", "Valide"), + ], + validators=[DataRequired(message="This field is required.")], + ) + fichiers = MultipleFileField() diff --git a/app/models/assiduites.py b/app/models/assiduites.py index 4027afcf..ab58e2f3 100644 --- a/app/models/assiduites.py +++ b/app/models/assiduites.py @@ -373,13 +373,13 @@ class Justificatif(db.Model): } return data - def __str__(self) -> str: + def __repr__(self) -> str: "chaine pour journaux et debug (lisible par humain français)" try: etat_str = EtatJustificatif(self.etat).name except ValueError: etat_str = "Invalide" - return f"""Justificatif {etat_str} de { + return f"""Justificatif id={self.id} {etat_str} de { self.date_debut.strftime("%d/%m/%Y %Hh%M") } à { self.date_fin.strftime("%d/%m/%Y %Hh%M") @@ -411,7 +411,7 @@ class Justificatif(db.Model): db.session.add(nouv_justificatif) - log(f"create_justificatif: {etud.id} {nouv_justificatif}") + log(f"create_justificatif: etudid={etud.id} {nouv_justificatif}") Scolog.logdb( method="create_justificatif", etudid=etud.id, @@ -482,8 +482,6 @@ def compute_assiduites_justified( etudid: int, justificatifs: list[Justificatif] = None, reset: bool = False ) -> list[int]: """ - compute_assiduites_justified_faster - Args: etudid (int): l'identifiant de l'étudiant justificatifs (list[Justificatif]): La liste des justificatifs qui seront utilisés diff --git a/app/scodoc/html_sidebar.py b/app/scodoc/html_sidebar.py index 719a824b..3c35157c 100755 --- a/app/scodoc/html_sidebar.py +++ b/app/scodoc/html_sidebar.py @@ -122,26 +122,40 @@ def sidebar(etudid: int = None): nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, cur_sem) nbabsnj = nbabs - nbabsjust H.append( - f"""({sco_preferences.get_preference("assi_metrique", None)}) + f"""({ + sco_preferences.get_preference("assi_metrique", None)})
{ nbabsjust } J., { nbabsnj } N.J.
""" ) H.append(" """ ) diff --git a/app/scodoc/sco_archives_justificatifs.py b/app/scodoc/sco_archives_justificatifs.py index 60c3bd8d..b3564b8b 100644 --- a/app/scodoc/sco_archives_justificatifs.py +++ b/app/scodoc/sco_archives_justificatifs.py @@ -122,10 +122,10 @@ class JustificatifArchiver(BaseArchiver): archive_name: str = None, description: str = "", user_id: str = None, - ) -> str: + ) -> tuple[str, str]: """ Ajoute un fichier dans une archive "justificatif" pour l'etudid donné - Retourne l'archive_name utilisé + Retourne l'archive_name utilisé et le filename """ if archive_name is None: archive_id: str = self.create_obj_archive( diff --git a/app/scodoc/sco_bulletins_legacy.py b/app/scodoc/sco_bulletins_legacy.py index a2ac2475..d8229e3c 100644 --- a/app/scodoc/sco_bulletins_legacy.py +++ b/app/scodoc/sco_bulletins_legacy.py @@ -316,7 +316,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator): # --- Absences H.append( f"""

- Absences :{I['nbabs']} demi-journées, dont {I['nbabsjust']} justifiées (pendant ce semestre). diff --git a/app/scodoc/sco_bulletins_standard.py b/app/scodoc/sco_bulletins_standard.py index 715f17a9..7f6da79d 100644 --- a/app/scodoc/sco_bulletins_standard.py +++ b/app/scodoc/sco_bulletins_standard.py @@ -134,8 +134,11 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): if nbabs: H.append( f"""

- - Absences : {self.infos['nbabs']} demi-journées, dont {self.infos['nbabsjust']} justifiées + + Absences : {self.infos['nbabs']} demi-journées, dont { + self.infos['nbabsjust']} justifiées (pendant ce semestre).

""" @@ -186,7 +189,7 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator): if can_edit_app: H.append( f"""

ok') H.append("") - def etudlist(etudids, linkabs=False): + def etudlist(etudids: list[int], linkabs=False): H.append("