From 69e25952e3e1509ac2060c8d39f20ddfa2fe6c91 Mon Sep 17 00:00:00 2001 From: Iziram Date: Fri, 3 Nov 2023 14:57:22 +0100 Subject: [PATCH] fusion col type/etat + col utilisateur + etudiant_seul --- app/tables/liste_assiduites.py | 117 +++++++++++++++++++++++---------- app/views/assiduites.py | 8 ++- 2 files changed, 87 insertions(+), 38 deletions(-) diff --git a/app/tables/liste_assiduites.py b/app/tables/liste_assiduites.py index 7492a4712..89c030f42 100644 --- a/app/tables/liste_assiduites.py +++ b/app/tables/liste_assiduites.py @@ -1,5 +1,6 @@ from app.tables import table_builder as tb from app.models import Identite, Assiduite, Justificatif +from app.auth.models import User from datetime import datetime from app.scodoc.sco_utils import EtatAssiduite, EtatJustificatif from flask_sqlalchemy.query import Query, Pagination @@ -50,9 +51,11 @@ class ListeAssiJusti(tb.Table): self.ajouter_lignes() + def etudiant_seul(self) -> bool: + return len(self.etudiants) == 1 + def ajouter_lignes(self): # Générer les query assiduités et justificatifs - assiduites_query_etudiants: Query = None justificatifs_query_etudiants: Query = None @@ -121,6 +124,8 @@ class ListeAssiJusti(tb.Table): - date_fin: la date de fin de l'objet - etat: l'état de l'objet - type: le type de l'objet ("assiduite" pour les assiduités, "justificatif" pour les justificatifs) + - est_just : si l'assiduité est justifié (booléen) None pour les justificatifs + - user_id : l'identifiant de l'utilisateur qui a signalé l'assiduité ou le justificatif Args: query_assiduite (sqlalchemy.orm.Query, optional): Une requête SQLAlchemy pour les assiduités. @@ -146,6 +151,8 @@ class ListeAssiJusti(tb.Table): Assiduite.date_fin.label("date_fin"), Assiduite.etat.label("etat"), literal("assiduite").label("type"), + Assiduite.est_just.label("est_just"), + Assiduite.user_id.label("user_id"), ) queries.append(query_assiduite) @@ -159,6 +166,10 @@ class ListeAssiJusti(tb.Table): Justificatif.date_fin.label("date_fin"), Justificatif.etat.label("etat"), literal("justificatif").label("type"), + # On doit avoir les mêmes colonnes sur les deux requêtes, + # donc on la met en nul car un justifcatif ne peut être justifié + literal(None).label("est_just"), + Justificatif.user_id.label("user_id"), ) queries.append(query_justificatif) @@ -187,6 +198,67 @@ class RowAssiJusti(tb.Row): ) def ajouter_colonnes(self, lien_redirection: str = None): + # Ajout de l'étudiant + self.table: ListeAssiJusti + if not self.table.etudiant_seul(): + self._etud() + + # Type d'objet + self._type() + + # Date de début + self.add_cell( + "date_debut", + "Date de début", + self.ligne["date_debut"].strftime("%d/%m/%y à %H:%M"), + data={"order": self.ligne["date_debut"]}, + ) + # Date de fin + self.add_cell( + "date_fin", + "Date de fin", + self.ligne["date_fin"].strftime("%d/%m/%y à %H:%M"), + data={"order": self.ligne["date_fin"]}, + ) + # Date de saisie + self.add_cell( + "entry_date", + "Saisie le", + self.ligne["entry_date"].strftime("%d/%m/%y à %H:%M"), + data={"order": self.ligne["entry_date"]}, + ) + + # Ajout de l'utilisateur ayant saisie l'objet + self._utilisateur() + + # Ajout colonne actions + self._actions() + + def _type(self) -> None: + obj_type: str = "" + is_assiduite: bool = self.ligne["type"] == "assiduite" + if is_assiduite: + etat: str = { + EtatAssiduite.PRESENT: "Présence", + EtatAssiduite.ABSENT: "Absence", + EtatAssiduite.RETARD: "Retard", + }.get(self.ligne["etat"]) + + justifiee: str = "Justifiée" if self.ligne["est_just"] else "" + obj_type = f"{etat} {justifiee}" + else: + etat: str = { + EtatJustificatif.VALIDE: "valide", + EtatJustificatif.ATTENTE: "soumis", + EtatJustificatif.MODIFIE: "modifié", + EtatJustificatif.NON_VALIDE: "invalide", + }.get(self.ligne["etat"]) + + obj_type = f"Justificatif {etat}" + + self.add_cell("obj_type", "Type", obj_type) + + def _etud(self) -> None: etud = self.etud self.table.group_titles.update( { @@ -218,44 +290,19 @@ class RowAssiJusti(tb.Row): target=lien_redirection, target_attrs={"class": "discretelink"}, ) - # Type d'objet - self.add_cell( - "type", - "Type", - self.ligne["type"].capitalize(), - ) - # Etat de l'objet - objEnum: EtatAssiduite | EtatJustificatif = ( - EtatAssiduite if self.ligne["type"] == "assiduite" else EtatJustificatif - ) + + def _utilisateur(self) -> None: + utilisateur: User = User.query.get(self.ligne["user_id"]) self.add_cell( - "etat", - "État", - objEnum.inverse().get(self.ligne["etat"]).name.capitalize(), + "user", + "Saisie par", + "Inconnu" if utilisateur is None else utilisateur.get_nomprenom(), ) - # Date de début - self.add_cell( - "date_debut", - "Date de début", - self.ligne["date_debut"].strftime("%d/%m/%y à %H:%M"), - data={"order": self.ligne["date_debut"]}, - ) - # Date de fin - self.add_cell( - "date_fin", - "Date de fin", - self.ligne["date_fin"].strftime("%d/%m/%y à %H:%M"), - data={"order": self.ligne["date_fin"]}, - ) - # Date de saisie - self.add_cell( - "entry_date", - "Saisie le", - self.ligne["entry_date"].strftime("%d/%m/%y à %H:%M"), - data={"order": self.ligne["entry_date"]}, - ) + def _actions(self) -> None: + # XXX Ajouter une colonne avec les liens d'action (supprimer, modifier) + pass class Filtre: diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 1c9a6f1b2..333117c25 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -1033,9 +1033,11 @@ def test(): """Visualisation de l'assiduité d'un groupe entre deux dates""" fmt = request.args.get("fmt", "html") + etudid = request.args.get("etudid", 18114) + from app.tables.liste_assiduites import ListeAssiJusti - table: ListeAssiJusti = ListeAssiJusti(Identite.get_etud(18114)) + table: ListeAssiJusti = ListeAssiJusti(Identite.get_etud(etudid)) if fmt.startswith("xls"): return scu.send_file( @@ -1286,12 +1288,12 @@ def generate_bul_list(etud: Identite, semestre: FormSemestre) -> str: assiduites, metric=metrique, filtered={"split": True} ) - # On sépare : + # On sépare : # - abs_j = absences justifiées # - abs_nj = absences non justifiées # - retards = les retards # - justifs = les justificatifs - + abs_j: list[str] = [ {"date": _get_date_str(assi.date_debut, assi.date_fin)} for assi in assiduites