Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
2 changed files with 87 additions and 38 deletions
Showing only changes of commit 69e25952e3 - Show all commits

View File

@ -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:

View File

@ -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