Assiduites : fix #688

This commit is contained in:
iziram 2023-08-31 17:12:53 +02:00
parent 48bca602cc
commit 738f795f21
2 changed files with 38 additions and 28 deletions

View File

@ -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,16 +448,20 @@ 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)
ans = sco_cache.AbsSemEtudCache.set(key, r)
if not ans:
log("warning: get_assiduites_count failed to cache")
if cache:
ans = sco_cache.AbsSemEtudCache.set(key, r)
if not ans:
log("warning: get_assiduites_count failed to cache")
return r

View File

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