forked from ScoDoc/ScoDoc
Assiduites : fix #688
This commit is contained in:
parent
48bca602cc
commit
738f795f21
@ -342,7 +342,10 @@ def justifies(justi: Justificatif, obj: bool = False) -> list[int] or Query:
|
||||
|
||||
|
||||
def get_all_justified(
|
||||
etudid: int, date_deb: datetime = None, date_fin: datetime = None
|
||||
etudid: int,
|
||||
date_deb: datetime = None,
|
||||
date_fin: datetime = None,
|
||||
moduleimpl_id: int = False,
|
||||
) -> Query:
|
||||
"""Retourne toutes les assiduités justifiées sur une période"""
|
||||
|
||||
@ -360,6 +363,9 @@ def get_all_justified(
|
||||
date_deb,
|
||||
date_fin,
|
||||
)
|
||||
|
||||
if moduleimpl_id is not False:
|
||||
after = after.filter_by(moduleimpl_id=moduleimpl_id)
|
||||
return after
|
||||
|
||||
|
||||
@ -379,18 +385,23 @@ def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]:
|
||||
|
||||
|
||||
def formsemestre_get_assiduites_count(
|
||||
etudid: int, formsemestre: FormSemestre
|
||||
etudid: int,
|
||||
formsemestre: FormSemestre,
|
||||
moduleimpl_id: int = False,
|
||||
cache: bool = True,
|
||||
) -> tuple[int, int]:
|
||||
"""Les comptes d'absences de cet étudiant dans ce semestre:
|
||||
tuple (nb abs non justifiées, nb abs justifiées)
|
||||
Utilise un cache.
|
||||
Utilise par défaut un cache.
|
||||
"""
|
||||
metrique = sco_preferences.get_preference("assi_metrique", formsemestre.id)
|
||||
return get_assiduites_count_in_interval(
|
||||
etudid,
|
||||
date_debut=formsemestre.date_debut,
|
||||
date_fin=formsemestre.date_fin,
|
||||
date_debut_iso=formsemestre.date_debut.isoformat(),
|
||||
date_fin_iso=formsemestre.date_fin.isoformat(),
|
||||
metrique=scu.translate_assiduites_metric(metrique),
|
||||
cache=cache,
|
||||
moduleimpl_id=moduleimpl_id,
|
||||
)
|
||||
|
||||
|
||||
@ -401,22 +412,30 @@ def get_assiduites_count_in_interval(
|
||||
metrique="demi",
|
||||
date_debut: datetime = None,
|
||||
date_fin: datetime = None,
|
||||
cache: bool = True,
|
||||
moduleimpl_id: int = False,
|
||||
):
|
||||
"""Les comptes d'absences de cet étudiant entre ces deux dates, incluses:
|
||||
tuple (nb abs, nb abs justifiées)
|
||||
On peut spécifier les dates comme datetime ou iso.
|
||||
Utilise un cache.
|
||||
Utilise par défaut un cache.
|
||||
"""
|
||||
date_debut_iso = date_debut_iso or date_debut.isoformat()
|
||||
date_fin_iso = date_fin_iso or date_fin.isoformat()
|
||||
key = f"{etudid}_{date_debut_iso}_{date_fin_iso}{metrique}_assiduites"
|
||||
if moduleimpl_id is not False:
|
||||
key += f"_module_{moduleimpl_id}"
|
||||
|
||||
r = sco_cache.AbsSemEtudCache.get(key)
|
||||
r = False if cache is False else sco_cache.AbsSemEtudCache.get(key)
|
||||
if not r:
|
||||
date_debut: datetime = date_debut or datetime.fromisoformat(date_debut_iso)
|
||||
date_fin: datetime = date_fin or datetime.fromisoformat(date_fin_iso)
|
||||
|
||||
assiduites: Assiduite = Assiduite.query.filter_by(etudid=etudid)
|
||||
assiduites: Assiduite = (
|
||||
Assiduite.query.filter_by(etudid=etudid)
|
||||
if moduleimpl_id is False
|
||||
else Assiduite.query.filter_by(etudid=etudid, moduleimpl_id=moduleimpl_id)
|
||||
)
|
||||
assiduites = assiduites.filter(Assiduite.etat == scu.EtatAssiduite.ABSENT)
|
||||
justificatifs: Justificatif = Justificatif.query.filter_by(etudid=etudid)
|
||||
|
||||
@ -429,13 +448,17 @@ def get_assiduites_count_in_interval(
|
||||
calculator.compute_assiduites(assiduites)
|
||||
nb_abs: dict = calculator.to_dict()[metrique]
|
||||
|
||||
abs_just: list[Assiduite] = get_all_justified(etudid, date_debut, date_fin)
|
||||
abs_just: list[Assiduite] = get_all_justified(
|
||||
etudid, date_debut, date_fin, moduleimpl_id=moduleimpl_id
|
||||
)
|
||||
|
||||
calculator.reset()
|
||||
calculator.compute_assiduites(abs_just)
|
||||
nb_abs_just: dict = calculator.to_dict()[metrique]
|
||||
|
||||
r = (nb_abs, nb_abs_just)
|
||||
|
||||
if cache:
|
||||
ans = sco_cache.AbsSemEtudCache.set(key, r)
|
||||
if not ans:
|
||||
log("warning: get_assiduites_count failed to cache")
|
||||
|
@ -1172,22 +1172,9 @@ def view_module_abs(moduleimpl_id, fmt="html"):
|
||||
|
||||
rows = []
|
||||
for etud in inscrits:
|
||||
# TODO-ASSIDUITE ne va pas car ne filtre pas sur le moduleimpl
|
||||
# nb_abs, nb_abs_just = sco_assiduites.formsemestre_get_assiduites_count(etud.id, modimpl.formsemestre)
|
||||
nb_abs, nb_abs_just = 0, 0 # XXX TODO-ASSIDUITE
|
||||
# nb_abs = sco_abs.count_abs(
|
||||
# etudid=etud.id,
|
||||
# debut=debut_sem,
|
||||
# fin=fin_sem,
|
||||
# moduleimpl_id=moduleimpl_id,
|
||||
# )
|
||||
# if nb_abs:
|
||||
# nb_abs_just = sco_abs.count_abs_just(
|
||||
# etudid=etud.id,
|
||||
# debut=debut_sem,
|
||||
# fin=fin_sem,
|
||||
# moduleimpl_id=moduleimpl_id,
|
||||
# )
|
||||
nb_abs, nb_abs_just = sco_assiduites.formsemestre_get_assiduites_count(
|
||||
etud.id, modimpl.formsemestre, cache=False, moduleimpl_id=modimpl.id
|
||||
)
|
||||
rows.append(
|
||||
{
|
||||
"nomprenom": etud.nomprenom,
|
||||
|
Loading…
Reference in New Issue
Block a user