forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -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:
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user