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( 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: ) -> Query:
"""Retourne toutes les assiduités justifiées sur une période""" """Retourne toutes les assiduités justifiées sur une période"""
@ -360,6 +363,9 @@ def get_all_justified(
date_deb, date_deb,
date_fin, date_fin,
) )
if moduleimpl_id is not False:
after = after.filter_by(moduleimpl_id=moduleimpl_id)
return after return after
@ -379,18 +385,23 @@ def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]:
def formsemestre_get_assiduites_count( def formsemestre_get_assiduites_count(
etudid: int, formsemestre: FormSemestre etudid: int,
formsemestre: FormSemestre,
moduleimpl_id: int = False,
cache: bool = True,
) -> tuple[int, int]: ) -> tuple[int, int]:
"""Les comptes d'absences de cet étudiant dans ce semestre: """Les comptes d'absences de cet étudiant dans ce semestre:
tuple (nb abs non justifiées, nb abs justifiées) 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) metrique = sco_preferences.get_preference("assi_metrique", formsemestre.id)
return get_assiduites_count_in_interval( return get_assiduites_count_in_interval(
etudid, etudid,
date_debut=formsemestre.date_debut, date_debut_iso=formsemestre.date_debut.isoformat(),
date_fin=formsemestre.date_fin, date_fin_iso=formsemestre.date_fin.isoformat(),
metrique=scu.translate_assiduites_metric(metrique), metrique=scu.translate_assiduites_metric(metrique),
cache=cache,
moduleimpl_id=moduleimpl_id,
) )
@ -401,22 +412,30 @@ def get_assiduites_count_in_interval(
metrique="demi", metrique="demi",
date_debut: datetime = None, date_debut: datetime = None,
date_fin: 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: """Les comptes d'absences de cet étudiant entre ces deux dates, incluses:
tuple (nb abs, nb abs justifiées) tuple (nb abs, nb abs justifiées)
On peut spécifier les dates comme datetime ou iso. 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_debut_iso = date_debut_iso or date_debut.isoformat()
date_fin_iso = date_fin_iso or date_fin.isoformat() date_fin_iso = date_fin_iso or date_fin.isoformat()
key = f"{etudid}_{date_debut_iso}_{date_fin_iso}{metrique}_assiduites" 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: if not r:
date_debut: datetime = date_debut or datetime.fromisoformat(date_debut_iso) date_debut: datetime = date_debut or datetime.fromisoformat(date_debut_iso)
date_fin: datetime = date_fin or datetime.fromisoformat(date_fin_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) assiduites = assiduites.filter(Assiduite.etat == scu.EtatAssiduite.ABSENT)
justificatifs: Justificatif = Justificatif.query.filter_by(etudid=etudid) justificatifs: Justificatif = Justificatif.query.filter_by(etudid=etudid)
@ -429,13 +448,17 @@ def get_assiduites_count_in_interval(
calculator.compute_assiduites(assiduites) calculator.compute_assiduites(assiduites)
nb_abs: dict = calculator.to_dict()[metrique] 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.reset()
calculator.compute_assiduites(abs_just) calculator.compute_assiduites(abs_just)
nb_abs_just: dict = calculator.to_dict()[metrique] nb_abs_just: dict = calculator.to_dict()[metrique]
r = (nb_abs, nb_abs_just) r = (nb_abs, nb_abs_just)
if cache:
ans = sco_cache.AbsSemEtudCache.set(key, r) ans = sco_cache.AbsSemEtudCache.set(key, r)
if not ans: if not ans:
log("warning: get_assiduites_count failed to cache") log("warning: get_assiduites_count failed to cache")

View File

@ -1172,22 +1172,9 @@ def view_module_abs(moduleimpl_id, fmt="html"):
rows = [] rows = []
for etud in inscrits: 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(
# nb_abs, nb_abs_just = sco_assiduites.formsemestre_get_assiduites_count(etud.id, modimpl.formsemestre) etud.id, modimpl.formsemestre, cache=False, moduleimpl_id=modimpl.id
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,
# )
rows.append( rows.append(
{ {
"nomprenom": etud.nomprenom, "nomprenom": etud.nomprenom,