Assiduité : correction bug cache

This commit is contained in:
Iziram 2024-03-01 12:40:05 +01:00
parent 958cf435c8
commit 0332553587
14 changed files with 47 additions and 41 deletions

View File

@ -393,7 +393,7 @@ class BulletinBUT:
else: else:
etud_ues_ids = res.etud_ues_ids(etud.id) etud_ues_ids = res.etud_ues_ids(etud.id)
nbabs, nbabsjust = formsemestre.get_abs_count(etud.id) nbabsnj, nbabsjust, nbabs = formsemestre.get_abs_count(etud.id)
etud_groups = sco_groups.get_etud_formsemestre_groups( etud_groups = sco_groups.get_etud_formsemestre_groups(
etud, formsemestre, only_to_show=True etud, formsemestre, only_to_show=True
) )
@ -408,7 +408,7 @@ class BulletinBUT:
} }
if self.prefs["bul_show_abs"]: if self.prefs["bul_show_abs"]:
semestre_infos["absences"] = { semestre_infos["absences"] = {
"injustifie": nbabs - nbabsjust, "injustifie": nbabsnj,
"total": nbabs, "total": nbabs,
"metrique": { "metrique": {
"H.": "Heure(s)", "H.": "Heure(s)",
@ -525,7 +525,7 @@ class BulletinBUT:
d["demission"] = "" d["demission"] = ""
# --- Absences # --- Absences
d["nbabs"], d["nbabsjust"] = self.res.formsemestre.get_abs_count(etud.id) _, d["nbabsjust"], d["nbabs"] = self.res.formsemestre.get_abs_count(etud.id)
# --- Decision Jury # --- Decision Jury
infos, _ = sco_bulletins.etud_descr_situation_semestre( infos, _ = sco_bulletins.etud_descr_situation_semestre(
@ -540,9 +540,9 @@ class BulletinBUT:
d.update(infos) d.update(infos)
# --- Rangs # --- Rangs
d["rang_nt"] = ( d[
f"{d['semestre']['rang']['value']} / {d['semestre']['rang']['total']}" "rang_nt"
) ] = f"{d['semestre']['rang']['value']} / {d['semestre']['rang']['total']}"
d["rang_txt"] = "Rang " + d["rang_nt"] d["rang_txt"] = "Rang " + d["rang_nt"]
d.update(sco_bulletins.make_context_dict(self.res.formsemestre, d["etud"])) d.update(sco_bulletins.make_context_dict(self.res.formsemestre, d["etud"]))

View File

@ -241,7 +241,7 @@ def bulletin_but_xml_compat(
# --- Absences # --- Absences
if sco_preferences.get_preference("bul_show_abs", formsemestre_id): if sco_preferences.get_preference("bul_show_abs", formsemestre_id):
nbabs, nbabsjust = formsemestre.get_abs_count(etud.id) _, nbabsjust, nbabs = formsemestre.get_abs_count(etud.id)
doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust))) doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust)))
# -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py --------- # -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py ---------

View File

@ -875,7 +875,7 @@ class FormSemestre(db.Model):
def get_abs_count(self, etudid): def get_abs_count(self, etudid):
"""Les comptes d'absences de cet étudiant dans ce semestre: """Les comptes d'absences de cet étudiant dans ce semestre:
tuple (nb abs, nb abs justifiées) tuple (nb abs non just, nb abs justifiées, nb abs total)
Utilise un cache. Utilise un cache.
""" """
from app.scodoc import sco_assiduites from app.scodoc import sco_assiduites

View File

@ -175,10 +175,9 @@ def sidebar(etudid: int = None):
inscription = etud.inscription_courante() inscription = etud.inscription_courante()
if inscription: if inscription:
formsemestre = inscription.formsemestre formsemestre = inscription.formsemestre
nbabs, nbabsjust = sco_assiduites.formsemestre_get_assiduites_count( nbabsnj, nbabsjust, _ = sco_assiduites.formsemestre_get_assiduites_count(
etudid, formsemestre etudid, formsemestre
) )
nbabsnj = nbabs - nbabsjust
H.append( H.append(
f"""<span title="absences du { f"""<span title="absences du {
formsemestre.date_debut.strftime("%d/%m/%Y") formsemestre.date_debut.strftime("%d/%m/%Y")

View File

@ -67,7 +67,7 @@ def abs_notify(etudid: int, date: str | datetime.datetime):
if not formsemestre: if not formsemestre:
return # non inscrit a la date, pas de notification return # non inscrit a la date, pas de notification
nbabs, nbabsjust = sco_assiduites.get_assiduites_count_in_interval( _, nbabsjust, nbabs = sco_assiduites.get_assiduites_count_in_interval(
etudid, etudid,
metrique=scu.translate_assiduites_metric( metrique=scu.translate_assiduites_metric(
sco_preferences.get_preference( sco_preferences.get_preference(

View File

@ -671,7 +671,7 @@ def create_absence_billet(
# Gestion du cache # Gestion du cache
def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]: def get_assiduites_count(etudid: int, sem: dict) -> 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, nb abs total)
Utilise un cache. Utilise un cache.
""" """
metrique = sco_preferences.get_preference("assi_metrique", sem["formsemestre_id"]) metrique = sco_preferences.get_preference("assi_metrique", sem["formsemestre_id"])
@ -687,17 +687,17 @@ def formsemestre_get_assiduites_count(
etudid: int, formsemestre: FormSemestre, moduleimpl_id: int = None etudid: int, formsemestre: FormSemestre, moduleimpl_id: int = None
) -> 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, nb abs total)
Utilise un cache. Utilise 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=scu.localize_datetime( date_debut=scu.localize_datetime(
datetime.combine(formsemestre.date_debut, time(8, 0)) datetime.combine(formsemestre.date_debut, time(0, 0))
), ),
date_fin=scu.localize_datetime( date_fin=scu.localize_datetime(
datetime.combine(formsemestre.date_fin, time(18, 0)) datetime.combine(formsemestre.date_fin, time(23, 0))
), ),
metrique=scu.translate_assiduites_metric(metrique), metrique=scu.translate_assiduites_metric(metrique),
moduleimpl_id=moduleimpl_id, moduleimpl_id=moduleimpl_id,
@ -714,12 +714,12 @@ def get_assiduites_count_in_interval(
moduleimpl_id: int = None, moduleimpl_id: int = None,
): ):
"""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 non justifiées, nb abs justifiées, nb abs total)
On peut spécifier les dates comme datetime ou iso. On peut spécifier les dates comme datetime ou iso.
Utilise un cache. Utilise un cache.
""" """
date_debut_iso = date_debut_iso or date_debut.isoformat() date_debut_iso = date_debut_iso or date_debut.strftime("%Y-%m-%d")
date_fin_iso = date_fin_iso or date_fin.isoformat() date_fin_iso = date_fin_iso or date_fin.strftime("%Y-%m-%d")
key = f"{etudid}_{date_debut_iso}_{date_fin_iso}_assiduites" key = f"{etudid}_{date_debut_iso}_{date_fin_iso}_assiduites"
r = sco_cache.AbsSemEtudCache.get(key) r = sco_cache.AbsSemEtudCache.get(key)
@ -744,9 +744,10 @@ def get_assiduites_count_in_interval(
if not ans: if not ans:
log("warning: get_assiduites_count failed to cache") log("warning: get_assiduites_count failed to cache")
nb_abs: dict = r["absent"][metrique] nb_abs: int = r["absent"][metrique]
nb_abs_just: dict = r["absent_just"][metrique] nb_abs_nj: int = r["absent_non_just"][metrique]
return (nb_abs, nb_abs_just) nb_abs_just: int = r["absent_just"][metrique]
return (nb_abs_nj, nb_abs_just, nb_abs)
def invalidate_assiduites_count(etudid: int, sem: dict): def invalidate_assiduites_count(etudid: int, sem: dict):

View File

@ -196,7 +196,7 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"):
pid = partition["partition_id"] pid = partition["partition_id"]
partitions_etud_groups[pid] = sco_groups.get_etud_groups_in_partition(pid) partitions_etud_groups[pid] = sco_groups.get_etud_groups_in_partition(pid)
# --- Absences # --- Absences
I["nbabs"], I["nbabsjust"] = sco_assiduites.get_assiduites_count(etudid, nt.sem) _, I["nbabsjust"], I["nbabs"] = sco_assiduites.get_assiduites_count(etudid, nt.sem)
# --- Decision Jury # --- Decision Jury
infos, dpv = etud_descr_situation_semestre( infos, dpv = etud_descr_situation_semestre(
@ -471,7 +471,7 @@ def _ue_mod_bulletin(
) # peut etre 'NI' ) # peut etre 'NI'
is_malus = mod["module"]["module_type"] == ModuleType.MALUS is_malus = mod["module"]["module_type"] == ModuleType.MALUS
if bul_show_abs_modules: if bul_show_abs_modules:
nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, sem) _, nbabsjust, nbabs = sco_assiduites.get_assiduites_count(etudid, sem)
mod_abs = [nbabs, nbabsjust] mod_abs = [nbabs, nbabsjust]
mod["mod_abs_txt"] = scu.fmt_abs(mod_abs) mod["mod_abs_txt"] = scu.fmt_abs(mod_abs)
else: else:

View File

@ -296,7 +296,7 @@ def formsemestre_bulletinetud_published_dict(
# --- Absences # --- Absences
if prefs["bul_show_abs"]: if prefs["bul_show_abs"]:
nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, sem) _, nbabsjust, nbabs = sco_assiduites.get_assiduites_count(etudid, sem)
d["absences"] = dict(nbabs=nbabs, nbabsjust=nbabsjust) d["absences"] = dict(nbabs=nbabs, nbabsjust=nbabsjust)
# --- Décision Jury # --- Décision Jury

View File

@ -260,7 +260,7 @@ def make_xml_formsemestre_bulletinetud(
numero=str(mod["numero"]), numero=str(mod["numero"]),
titre=quote_xml_attr(mod["titre"]), titre=quote_xml_attr(mod["titre"]),
abbrev=quote_xml_attr(mod["abbrev"]), abbrev=quote_xml_attr(mod["abbrev"]),
code_apogee=quote_xml_attr(mod["code_apogee"]) code_apogee=quote_xml_attr(mod["code_apogee"]),
# ects=ects ects des modules maintenant inutilisés # ects=ects ects des modules maintenant inutilisés
) )
x_ue.append(x_mod) x_ue.append(x_mod)
@ -347,7 +347,7 @@ def make_xml_formsemestre_bulletinetud(
# --- Absences # --- Absences
if sco_preferences.get_preference("bul_show_abs", formsemestre_id): if sco_preferences.get_preference("bul_show_abs", formsemestre_id):
nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, sem) _, nbabsjust, nbabs = sco_assiduites.get_assiduites_count(etudid, sem)
doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust))) doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust)))
# --- Decision Jury # --- Decision Jury
if ( if (

View File

@ -722,8 +722,8 @@ def formsemestre_recap_parcours_table(
f"""<td class="rcp_moy">{scu.fmt_note(nt.get_etud_moy_gen(etudid))}</td>""" f"""<td class="rcp_moy">{scu.fmt_note(nt.get_etud_moy_gen(etudid))}</td>"""
) )
# Absences (nb d'abs non just. dans ce semestre) # Absences (nb d'abs non just. dans ce semestre)
nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, sem) nbabsnj = sco_assiduites.get_assiduites_count(etudid, sem)[0]
H.append(f"""<td class="rcp_abs">{nbabs - nbabsjust}</td>""") H.append(f"""<td class="rcp_abs">{nbabsnj}</td>""")
# UEs # UEs
for ue in ues: for ue in ues:

View File

@ -105,7 +105,9 @@ def etud_get_poursuite_info(sem: dict, etud: dict) -> dict:
rangs.append(["rang_" + code_module, rang_module]) rangs.append(["rang_" + code_module, rang_module])
# Absences # Absences
nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, nt.sem) nbabsnj, nbabsjust, _ = sco_assiduites.get_assiduites_count(
etudid, nt.sem
)
# En BUT, prend tout, sinon ne prend que les semestre validés par le jury # En BUT, prend tout, sinon ne prend que les semestre validés par le jury
if nt.is_apc or ( if nt.is_apc or (
dec dec
@ -125,7 +127,7 @@ def etud_get_poursuite_info(sem: dict, etud: dict) -> dict:
("date_debut", s["date_debut"]), ("date_debut", s["date_debut"]),
("date_fin", s["date_fin"]), ("date_fin", s["date_fin"]),
("periode", "%s - %s" % (s["mois_debut"], s["mois_fin"])), ("periode", "%s - %s" % (s["mois_debut"], s["mois_fin"])),
("AbsNonJust", nbabs - nbabsjust), ("AbsNonJust", nbabsnj),
("AbsJust", nbabsjust), ("AbsJust", nbabsjust),
] ]
# ajout des 2 champs notes des modules et classement dans chaque module # ajout des 2 champs notes des modules et classement dans chaque module

View File

@ -620,7 +620,7 @@ class RowRecap(tb.Row):
def add_abs(self): def add_abs(self):
"Ajoute les colonnes absences" "Ajoute les colonnes absences"
# Absences (nb d'abs non just. dans ce semestre) # Absences (nb d'abs non just. dans ce semestre)
nbabs, nbabsjust = self.table.res.formsemestre.get_abs_count(self.etud.id) _, nbabsjust, nbabs = self.table.res.formsemestre.get_abs_count(self.etud.id)
self.add_cell("nbabs", "Abs", f"{nbabs:1.0f}", "abs", raw_content=nbabs) self.add_cell("nbabs", "Abs", f"{nbabs:1.0f}", "abs", raw_content=nbabs)
self.add_cell( self.add_cell(
"nbabsjust", "Just.", f"{nbabsjust:1.0f}", "abs", raw_content=nbabsjust "nbabsjust", "Just.", f"{nbabsjust:1.0f}", "abs", raw_content=nbabsjust
@ -691,9 +691,9 @@ class RowRecap(tb.Row):
self.add_ue_modimpls_cols(ue, ue_status["is_capitalized"]) self.add_ue_modimpls_cols(ue, ue_status["is_capitalized"])
self.nb_ues_etud_parcours = len(res.etud_parcours_ues_ids(etud.id)) self.nb_ues_etud_parcours = len(res.etud_parcours_ues_ids(etud.id))
ue_valid_txt = ue_valid_txt_html = ( ue_valid_txt = (
f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}" ue_valid_txt_html
) ) = f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}"
if self.nb_ues_warning: if self.nb_ues_warning:
ue_valid_txt_html += " " + scu.EMO_WARNING ue_valid_txt_html += " " + scu.EMO_WARNING
cell_class = "" cell_class = ""
@ -717,9 +717,9 @@ class RowRecap(tb.Row):
# sous-classé par JuryRow pour ajouter les codes # sous-classé par JuryRow pour ajouter les codes
table: TableRecap = self.table table: TableRecap = self.table
formsemestre: FormSemestre = table.res.formsemestre formsemestre: FormSemestre = table.res.formsemestre
table.group_titles["col_ue"] = ( table.group_titles[
f"UEs du S{formsemestre.semestre_id} {formsemestre.annee_scolaire()}" "col_ue"
) ] = f"UEs du S{formsemestre.semestre_id} {formsemestre.annee_scolaire()}"
col_id = f"moy_ue_{ue.id}" col_id = f"moy_ue_{ue.id}"
val = ( val = (
ue_status["moy"] ue_status["moy"]

View File

@ -74,8 +74,9 @@ class ScoData:
if ins: if ins:
self.etud_cur_sem = ins.formsemestre self.etud_cur_sem = ins.formsemestre
( (
self.nbabs, self.nbabsnj,
self.nbabsjust, self.nbabsjust,
self.nbabs,
) = sco_assiduites.get_assiduites_count_in_interval( ) = sco_assiduites.get_assiduites_count_in_interval(
etud.id, etud.id,
self.etud_cur_sem.date_debut.isoformat(), self.etud_cur_sem.date_debut.isoformat(),
@ -84,7 +85,6 @@ class ScoData:
sco_preferences.get_preference("assi_metrique") sco_preferences.get_preference("assi_metrique")
), ),
) )
self.nbabsnj = self.nbabs - self.nbabsjust
else: else:
self.etud_cur_sem = None self.etud_cur_sem = None
else: else:

View File

@ -1187,14 +1187,18 @@ def view_module_abs(moduleimpl_id, fmt="html"):
rows = [] rows = []
for etud in inscrits: for etud in inscrits:
nb_abs, nb_abs_just = sco_assiduites.formsemestre_get_assiduites_count( (
nb_abs_nj,
nb_abs_just,
nb_abs,
) = sco_assiduites.formsemestre_get_assiduites_count(
etud.id, modimpl.formsemestre, moduleimpl_id=modimpl.id etud.id, modimpl.formsemestre, moduleimpl_id=modimpl.id
) )
rows.append( rows.append(
{ {
"nomprenom": etud.nomprenom, "nomprenom": etud.nomprenom,
"just": nb_abs_just, "just": nb_abs_just,
"nojust": nb_abs - nb_abs_just, "nojust": nb_abs_nj,
"total": nb_abs, "total": nb_abs,
"_nomprenom_target": url_for( "_nomprenom_target": url_for(
"scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etud.id "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etud.id