From 738f795f214abebf6740ea1586f9ae2ed9d7d63c Mon Sep 17 00:00:00 2001 From: iziram Date: Thu, 31 Aug 2023 17:12:53 +0200 Subject: [PATCH] Assiduites : fix #688 --- app/scodoc/sco_assiduites.py | 47 +++++++++++++++++++++++++++--------- app/views/notes.py | 19 +++------------ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py index bd683033..ca4324f1 100644 --- a/app/scodoc/sco_assiduites.py +++ b/app/scodoc/sco_assiduites.py @@ -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 diff --git a/app/views/notes.py b/app/views/notes.py index 492f3493..f0e1c36e 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -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,