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(
|
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")
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user