From 0332553587b0f22502f83603a1f8d45308a79d6b Mon Sep 17 00:00:00 2001
From: Iziram <matthias.hartmann@iziram.fr>
Date: Fri, 1 Mar 2024 12:40:05 +0100
Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9=20:=20correction=20bug=20cache?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/but/bulletin_but.py                   | 12 ++++++------
 app/but/bulletin_but_xml_compat.py        |  2 +-
 app/models/formsemestre.py                |  2 +-
 app/scodoc/html_sidebar.py                |  3 +--
 app/scodoc/sco_abs_notification.py        |  2 +-
 app/scodoc/sco_assiduites.py              | 21 +++++++++++----------
 app/scodoc/sco_bulletins.py               |  4 ++--
 app/scodoc/sco_bulletins_json.py          |  2 +-
 app/scodoc/sco_bulletins_xml.py           |  4 ++--
 app/scodoc/sco_formsemestre_validation.py |  4 ++--
 app/scodoc/sco_poursuite_dut.py           |  6 ++++--
 app/tables/recap.py                       | 14 +++++++-------
 app/views/__init__.py                     |  4 ++--
 app/views/notes.py                        |  8 ++++++--
 14 files changed, 47 insertions(+), 41 deletions(-)

diff --git a/app/but/bulletin_but.py b/app/but/bulletin_but.py
index 8eec9ba6a..ab4227b0d 100644
--- a/app/but/bulletin_but.py
+++ b/app/but/bulletin_but.py
@@ -393,7 +393,7 @@ class BulletinBUT:
         else:
             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, formsemestre, only_to_show=True
         )
@@ -408,7 +408,7 @@ class BulletinBUT:
         }
         if self.prefs["bul_show_abs"]:
             semestre_infos["absences"] = {
-                "injustifie": nbabs - nbabsjust,
+                "injustifie": nbabsnj,
                 "total": nbabs,
                 "metrique": {
                     "H.": "Heure(s)",
@@ -525,7 +525,7 @@ class BulletinBUT:
             d["demission"] = ""
 
         # --- 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
         infos, _ = sco_bulletins.etud_descr_situation_semestre(
@@ -540,9 +540,9 @@ class BulletinBUT:
 
         d.update(infos)
         # --- Rangs
-        d["rang_nt"] = (
-            f"{d['semestre']['rang']['value']} / {d['semestre']['rang']['total']}"
-        )
+        d[
+            "rang_nt"
+        ] = f"{d['semestre']['rang']['value']} / {d['semestre']['rang']['total']}"
         d["rang_txt"] = "Rang " + d["rang_nt"]
 
         d.update(sco_bulletins.make_context_dict(self.res.formsemestre, d["etud"]))
diff --git a/app/but/bulletin_but_xml_compat.py b/app/but/bulletin_but_xml_compat.py
index 07522f80c..fb9af2056 100644
--- a/app/but/bulletin_but_xml_compat.py
+++ b/app/but/bulletin_but_xml_compat.py
@@ -241,7 +241,7 @@ def bulletin_but_xml_compat(
 
     # --- Absences
     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)))
 
     # -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py ---------
diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py
index 09c1d3056..5541d1780 100644
--- a/app/models/formsemestre.py
+++ b/app/models/formsemestre.py
@@ -875,7 +875,7 @@ class FormSemestre(db.Model):
 
     def get_abs_count(self, etudid):
         """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.
         """
         from app.scodoc import sco_assiduites
diff --git a/app/scodoc/html_sidebar.py b/app/scodoc/html_sidebar.py
index f1c8f8356..2d351e628 100755
--- a/app/scodoc/html_sidebar.py
+++ b/app/scodoc/html_sidebar.py
@@ -175,10 +175,9 @@ def sidebar(etudid: int = None):
         inscription = etud.inscription_courante()
         if inscription:
             formsemestre = inscription.formsemestre
-            nbabs, nbabsjust = sco_assiduites.formsemestre_get_assiduites_count(
+            nbabsnj, nbabsjust, _ = sco_assiduites.formsemestre_get_assiduites_count(
                 etudid, formsemestre
             )
-            nbabsnj = nbabs - nbabsjust
             H.append(
                 f"""<span title="absences du {
                     formsemestre.date_debut.strftime("%d/%m/%Y")
diff --git a/app/scodoc/sco_abs_notification.py b/app/scodoc/sco_abs_notification.py
index ba729e278..54a645e38 100644
--- a/app/scodoc/sco_abs_notification.py
+++ b/app/scodoc/sco_abs_notification.py
@@ -67,7 +67,7 @@ def abs_notify(etudid: int, date: str | datetime.datetime):
     if not formsemestre:
         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,
         metrique=scu.translate_assiduites_metric(
             sco_preferences.get_preference(
diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py
index 597accb98..b9b650eaf 100644
--- a/app/scodoc/sco_assiduites.py
+++ b/app/scodoc/sco_assiduites.py
@@ -671,7 +671,7 @@ def create_absence_billet(
 # Gestion du cache
 def get_assiduites_count(etudid: int, sem: dict) -> tuple[int, int]:
     """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.
     """
     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
 ) -> tuple[int, int]:
     """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.
     """
     metrique = sco_preferences.get_preference("assi_metrique", formsemestre.id)
     return get_assiduites_count_in_interval(
         etudid,
         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(
-            datetime.combine(formsemestre.date_fin, time(18, 0))
+            datetime.combine(formsemestre.date_fin, time(23, 0))
         ),
         metrique=scu.translate_assiduites_metric(metrique),
         moduleimpl_id=moduleimpl_id,
@@ -714,12 +714,12 @@ def get_assiduites_count_in_interval(
     moduleimpl_id: int = None,
 ):
     """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.
     Utilise un cache.
     """
-    date_debut_iso = date_debut_iso or date_debut.isoformat()
-    date_fin_iso = date_fin_iso or date_fin.isoformat()
+    date_debut_iso = date_debut_iso or date_debut.strftime("%Y-%m-%d")
+    date_fin_iso = date_fin_iso or date_fin.strftime("%Y-%m-%d")
     key = f"{etudid}_{date_debut_iso}_{date_fin_iso}_assiduites"
 
     r = sco_cache.AbsSemEtudCache.get(key)
@@ -744,9 +744,10 @@ def get_assiduites_count_in_interval(
             if not ans:
                 log("warning: get_assiduites_count failed to cache")
 
-    nb_abs: dict = r["absent"][metrique]
-    nb_abs_just: dict = r["absent_just"][metrique]
-    return (nb_abs, nb_abs_just)
+    nb_abs: int = r["absent"][metrique]
+    nb_abs_nj: int = r["absent_non_just"][metrique]
+    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):
diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py
index 1b70d3858..d1c32795d 100644
--- a/app/scodoc/sco_bulletins.py
+++ b/app/scodoc/sco_bulletins.py
@@ -196,7 +196,7 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"):
         pid = partition["partition_id"]
         partitions_etud_groups[pid] = sco_groups.get_etud_groups_in_partition(pid)
     # --- 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
     infos, dpv = etud_descr_situation_semestre(
@@ -471,7 +471,7 @@ def _ue_mod_bulletin(
         )  # peut etre 'NI'
         is_malus = mod["module"]["module_type"] == ModuleType.MALUS
         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["mod_abs_txt"] = scu.fmt_abs(mod_abs)
         else:
diff --git a/app/scodoc/sco_bulletins_json.py b/app/scodoc/sco_bulletins_json.py
index 0481e6f9c..a7848b39e 100644
--- a/app/scodoc/sco_bulletins_json.py
+++ b/app/scodoc/sco_bulletins_json.py
@@ -296,7 +296,7 @@ def formsemestre_bulletinetud_published_dict(
 
     # --- Absences
     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écision Jury
diff --git a/app/scodoc/sco_bulletins_xml.py b/app/scodoc/sco_bulletins_xml.py
index 25f2cfa64..77f95ac28 100644
--- a/app/scodoc/sco_bulletins_xml.py
+++ b/app/scodoc/sco_bulletins_xml.py
@@ -260,7 +260,7 @@ def make_xml_formsemestre_bulletinetud(
                 numero=str(mod["numero"]),
                 titre=quote_xml_attr(mod["titre"]),
                 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
             )
             x_ue.append(x_mod)
@@ -347,7 +347,7 @@ def make_xml_formsemestre_bulletinetud(
 
     # --- Absences
     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)))
     # --- Decision Jury
     if (
diff --git a/app/scodoc/sco_formsemestre_validation.py b/app/scodoc/sco_formsemestre_validation.py
index df4770fa3..27d99fffd 100644
--- a/app/scodoc/sco_formsemestre_validation.py
+++ b/app/scodoc/sco_formsemestre_validation.py
@@ -722,8 +722,8 @@ def formsemestre_recap_parcours_table(
             f"""<td class="rcp_moy">{scu.fmt_note(nt.get_etud_moy_gen(etudid))}</td>"""
         )
         # Absences (nb d'abs non just. dans ce semestre)
-        nbabs, nbabsjust = sco_assiduites.get_assiduites_count(etudid, sem)
-        H.append(f"""<td class="rcp_abs">{nbabs - nbabsjust}</td>""")
+        nbabsnj = sco_assiduites.get_assiduites_count(etudid, sem)[0]
+        H.append(f"""<td class="rcp_abs">{nbabsnj}</td>""")
 
         # UEs
         for ue in ues:
diff --git a/app/scodoc/sco_poursuite_dut.py b/app/scodoc/sco_poursuite_dut.py
index c271628a2..475d59808 100644
--- a/app/scodoc/sco_poursuite_dut.py
+++ b/app/scodoc/sco_poursuite_dut.py
@@ -105,7 +105,9 @@ def etud_get_poursuite_info(sem: dict, etud: dict) -> dict:
                                 rangs.append(["rang_" + code_module, rang_module])
 
                 # 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
                 if nt.is_apc or (
                     dec
@@ -125,7 +127,7 @@ def etud_get_poursuite_info(sem: dict, etud: dict) -> dict:
                         ("date_debut", s["date_debut"]),
                         ("date_fin", s["date_fin"]),
                         ("periode", "%s - %s" % (s["mois_debut"], s["mois_fin"])),
-                        ("AbsNonJust", nbabs - nbabsjust),
+                        ("AbsNonJust", nbabsnj),
                         ("AbsJust", nbabsjust),
                     ]
                     # ajout des 2 champs notes des modules et classement dans chaque module
diff --git a/app/tables/recap.py b/app/tables/recap.py
index f26535edc..0c853c352 100644
--- a/app/tables/recap.py
+++ b/app/tables/recap.py
@@ -620,7 +620,7 @@ class RowRecap(tb.Row):
     def add_abs(self):
         "Ajoute les colonnes absences"
         # 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(
             "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.nb_ues_etud_parcours = len(res.etud_parcours_ues_ids(etud.id))
-        ue_valid_txt = ue_valid_txt_html = (
-            f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}"
-        )
+        ue_valid_txt = (
+            ue_valid_txt_html
+        ) = f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}"
         if self.nb_ues_warning:
             ue_valid_txt_html += " " + scu.EMO_WARNING
         cell_class = ""
@@ -717,9 +717,9 @@ class RowRecap(tb.Row):
         # sous-classé par JuryRow pour ajouter les codes
         table: TableRecap = self.table
         formsemestre: FormSemestre = table.res.formsemestre
-        table.group_titles["col_ue"] = (
-            f"UEs du S{formsemestre.semestre_id} {formsemestre.annee_scolaire()}"
-        )
+        table.group_titles[
+            "col_ue"
+        ] = f"UEs du S{formsemestre.semestre_id} {formsemestre.annee_scolaire()}"
         col_id = f"moy_ue_{ue.id}"
         val = (
             ue_status["moy"]
diff --git a/app/views/__init__.py b/app/views/__init__.py
index 890fb63eb..b28a4e57c 100644
--- a/app/views/__init__.py
+++ b/app/views/__init__.py
@@ -74,8 +74,9 @@ class ScoData:
             if ins:
                 self.etud_cur_sem = ins.formsemestre
                 (
-                    self.nbabs,
+                    self.nbabsnj,
                     self.nbabsjust,
+                    self.nbabs,
                 ) = sco_assiduites.get_assiduites_count_in_interval(
                     etud.id,
                     self.etud_cur_sem.date_debut.isoformat(),
@@ -84,7 +85,6 @@ class ScoData:
                         sco_preferences.get_preference("assi_metrique")
                     ),
                 )
-                self.nbabsnj = self.nbabs - self.nbabsjust
             else:
                 self.etud_cur_sem = None
         else:
diff --git a/app/views/notes.py b/app/views/notes.py
index 717131db3..570b64f52 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -1187,14 +1187,18 @@ def view_module_abs(moduleimpl_id, fmt="html"):
 
     rows = []
     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
         )
         rows.append(
             {
                 "nomprenom": etud.nomprenom,
                 "just": nb_abs_just,
-                "nojust": nb_abs - nb_abs_just,
+                "nojust": nb_abs_nj,
                 "total": nb_abs,
                 "_nomprenom_target": url_for(
                     "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etud.id
-- 
GitLab