fusion col type/etat + col utilisateur + etudiant_seul

This commit is contained in:
Iziram 2023-11-03 14:57:22 +01:00
parent bb4a427207
commit 69e25952e3
2 changed files with 87 additions and 38 deletions

View File

@ -1,5 +1,6 @@
from app.tables import table_builder as tb from app.tables import table_builder as tb
from app.models import Identite, Assiduite, Justificatif from app.models import Identite, Assiduite, Justificatif
from app.auth.models import User
from datetime import datetime from datetime import datetime
from app.scodoc.sco_utils import EtatAssiduite, EtatJustificatif from app.scodoc.sco_utils import EtatAssiduite, EtatJustificatif
from flask_sqlalchemy.query import Query, Pagination from flask_sqlalchemy.query import Query, Pagination
@ -50,9 +51,11 @@ class ListeAssiJusti(tb.Table):
self.ajouter_lignes() self.ajouter_lignes()
def etudiant_seul(self) -> bool:
return len(self.etudiants) == 1
def ajouter_lignes(self): def ajouter_lignes(self):
# Générer les query assiduités et justificatifs # Générer les query assiduités et justificatifs
assiduites_query_etudiants: Query = None assiduites_query_etudiants: Query = None
justificatifs_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 - date_fin: la date de fin de l'objet
- etat: l'état de l'objet - etat: l'état de l'objet
- type: le type de l'objet ("assiduite" pour les assiduités, "justificatif" pour les justificatifs) - 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: Args:
query_assiduite (sqlalchemy.orm.Query, optional): Une requête SQLAlchemy pour les assiduités. 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.date_fin.label("date_fin"),
Assiduite.etat.label("etat"), Assiduite.etat.label("etat"),
literal("assiduite").label("type"), literal("assiduite").label("type"),
Assiduite.est_just.label("est_just"),
Assiduite.user_id.label("user_id"),
) )
queries.append(query_assiduite) queries.append(query_assiduite)
@ -159,6 +166,10 @@ class ListeAssiJusti(tb.Table):
Justificatif.date_fin.label("date_fin"), Justificatif.date_fin.label("date_fin"),
Justificatif.etat.label("etat"), Justificatif.etat.label("etat"),
literal("justificatif").label("type"), 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) queries.append(query_justificatif)
@ -187,6 +198,67 @@ class RowAssiJusti(tb.Row):
) )
def ajouter_colonnes(self, lien_redirection: str = None): 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 etud = self.etud
self.table.group_titles.update( self.table.group_titles.update(
{ {
@ -218,44 +290,19 @@ class RowAssiJusti(tb.Row):
target=lien_redirection, target=lien_redirection,
target_attrs={"class": "discretelink"}, target_attrs={"class": "discretelink"},
) )
# Type d'objet
self.add_cell( def _utilisateur(self) -> None:
"type", utilisateur: User = User.query.get(self.ligne["user_id"])
"Type",
self.ligne["type"].capitalize(),
)
# Etat de l'objet
objEnum: EtatAssiduite | EtatJustificatif = (
EtatAssiduite if self.ligne["type"] == "assiduite" else EtatJustificatif
)
self.add_cell( self.add_cell(
"etat", "user",
"État", "Saisie par",
objEnum.inverse().get(self.ligne["etat"]).name.capitalize(), "Inconnu" if utilisateur is None else utilisateur.get_nomprenom(),
) )
# Date de début def _actions(self) -> None:
self.add_cell( # XXX Ajouter une colonne avec les liens d'action (supprimer, modifier)
"date_debut", pass
"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"]},
)
class Filtre: class Filtre:

View File

@ -1033,9 +1033,11 @@ def test():
"""Visualisation de l'assiduité d'un groupe entre deux dates""" """Visualisation de l'assiduité d'un groupe entre deux dates"""
fmt = request.args.get("fmt", "html") fmt = request.args.get("fmt", "html")
etudid = request.args.get("etudid", 18114)
from app.tables.liste_assiduites import ListeAssiJusti 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"): if fmt.startswith("xls"):
return scu.send_file( return scu.send_file(
@ -1286,12 +1288,12 @@ def generate_bul_list(etud: Identite, semestre: FormSemestre) -> str:
assiduites, metric=metrique, filtered={"split": True} assiduites, metric=metrique, filtered={"split": True}
) )
# On sépare : # On sépare :
# - abs_j = absences justifiées # - abs_j = absences justifiées
# - abs_nj = absences non justifiées # - abs_nj = absences non justifiées
# - retards = les retards # - retards = les retards
# - justifs = les justificatifs # - justifs = les justificatifs
abs_j: list[str] = [ abs_j: list[str] = [
{"date": _get_date_str(assi.date_debut, assi.date_fin)} {"date": _get_date_str(assi.date_debut, assi.date_fin)}
for assi in assiduites for assi in assiduites