From faf09af63c147f4492fabff2ee1fa1c7edb8b3cf Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Sun, 8 Sep 2024 09:52:22 +0200
Subject: [PATCH] Tableaux recap: corrige nb UE validables en BUT selon
 parcours. Fix #987

---
 app/scodoc/sco_recapcomplet.py |  1 +
 app/static/css/scodoc.css      |  8 ++++++
 app/tables/recap.py            | 50 ++++++++++++++++++++++++----------
 3 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/app/scodoc/sco_recapcomplet.py b/app/scodoc/sco_recapcomplet.py
index 1c9bbeef..a9a10919 100644
--- a/app/scodoc/sco_recapcomplet.py
+++ b/app/scodoc/sco_recapcomplet.py
@@ -260,6 +260,7 @@ def formsemestre_recapcomplet(
             <div><tt>=</tt></div><div>UE dispensée</div>
             <div><tt>nan</tt></div><div>valeur non disponible</div>
             <div>📍</div><div>code jury non enregistré</div>
+            <div><span class="ue_hors_parcours">12.34</span></div><div>UE hors parcours</div>
         </div>
     </div>
     """
diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css
index 2bd994ec..d27fa8a9 100644
--- a/app/static/css/scodoc.css
+++ b/app/static/css/scodoc.css
@@ -4636,6 +4636,14 @@ table.table_recap tr.selected td.moy_ue_warning {
   color: rgb(255, 0, 0);
 }
 
+table.table_recap td.ue_hors_parcours a,
+table.table_recap tr.selected td.ue_hors_parcours a,
+span.ue_hors_parcours {
+  color: purple;
+  font-style: italic;
+  font-weight: bold;
+}
+
 table.table_recap td.cap table.table_recap td.col_ues_validables {
   white-space: nowrap;
   font-style: normal !important;
diff --git a/app/tables/recap.py b/app/tables/recap.py
index f66ddddf..6265e0d8 100644
--- a/app/tables/recap.py
+++ b/app/tables/recap.py
@@ -666,11 +666,21 @@ class RowRecap(tb.Row):
                 if res.is_apc
                 else "Moyenne générale du semestre"
             )
-
-        # --- Moyenne d'UE
+        self.add_ues_cols(ues_sans_bonus)
+
+    def add_ues_cols(self, ues_sans_bonus: list[UniteEns]):
+        """Ajout des colonnes concernant les UEs
+        - pour chaque UE :
+            - sa moyenne (et son code en mode jury)
+            - les moyennes de modules dans l'UE
+        - la colonne UEs avec le nombre d'UEs validables
+        """
+        etudid = self.etud.id
+        table: TableRecap = self.table
+        res = table.res
         self.nb_ues_validables, self.nb_ues_warning = 0, 0
         for ue in ues_sans_bonus:
-            ue_status = res.get_etud_ue_status(etud.id, ue.id)
+            ue_status = res.get_etud_ue_status(etudid, ue.id)
             if ue_status is not None:
                 self.add_ue_cols(ue, ue_status)
                 if table.mode_jury:
@@ -679,7 +689,7 @@ class RowRecap(tb.Row):
                 # Bonus (sport) dans cette UE ?
                 # Le bonus sport appliqué sur cette UE
                 if (res.bonus_ues is not None) and (ue.id in res.bonus_ues):
-                    val = res.bonus_ues[ue.id][etud.id] or ""
+                    val = res.bonus_ues[ue.id][etudid] or ""
                     val_fmt = val_fmt_html = table.fmt_note(val)
                     if val:
                         val_fmt_html = f"""<span class="green-arrow-up"></span><span class="sp2l">{
@@ -696,7 +706,7 @@ class RowRecap(tb.Row):
                 # Les moyennes des modules (ou ressources et SAÉs) dans cette UE
                 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(etudid))
         ue_valid_txt = ue_valid_txt_html = (
             f"{self.nb_ues_validables}/{self.nb_ues_etud_parcours}"
         )
@@ -705,7 +715,7 @@ class RowRecap(tb.Row):
         cell_class = ""
         if self.nb_ues_warning:
             cell_class = "moy_ue_warning"
-        elif self.nb_ues_validables < len(ues_sans_bonus):
+        elif self.nb_ues_validables < self.nb_ues_etud_parcours:  # len(ues_sans_bonus):
             cell_class = "moy_inf"
         self.add_cell(
             "ues_validables",
@@ -719,7 +729,7 @@ class RowRecap(tb.Row):
         )
 
     def add_ue_cols(self, ue: UniteEns, ue_status: dict, col_group: str = None):
-        "Ajoute résultat UE au row (colonne col_ue)"
+        "Ajoute résultat d'une UE au row (colonne col_ue)"
         # sous-classé par JuryRow pour ajouter les codes
         table: TableRecap = self.table
         formsemestre: FormSemestre = table.res.formsemestre
@@ -732,26 +742,36 @@ class RowRecap(tb.Row):
             if (self.etud.id, ue.id) not in table.res.dispense_ues
             else "="
         )
-        note_classes = []
+        cell_classes = []
+        # Cette UE est-elle dans le parcours de l'étudiant (dans ce semestre) ?
+        ue_hors_parcours = ue.id not in self.table.res.etud_parcours_ues_ids(
+            self.etud.id
+        )
+
+        target_attrs = {}  # pour décorer la cellule (bulle)
         if isinstance(val, float):
             if val < table.barre_moy:
-                note_classes = ["moy_inf"]
+                cell_classes = ["moy_inf"]
             elif val >= table.barre_valid_ue:
-                note_classes = ["moy_ue_valid"]
-                self.nb_ues_validables += 1
+                cell_classes = ["moy_ue_valid"]
+                if not ue_hors_parcours:
+                    self.nb_ues_validables += 1
             if val < table.barre_warning_ue:
-                note_classes = ["moy_ue_warning"]  # notes très basses
+                cell_classes = ["moy_ue_warning"]  # notes très basses
                 self.nb_ues_warning += 1
         if ue_status["is_capitalized"]:
-            note_classes.append("ue_capitalized")
-
+            cell_classes.append("ue_capitalized")
+        if ue_hors_parcours:
+            cell_classes.append("ue_hors_parcours")
+            target_attrs["title"] = "UE hors du parcours actuel de l'étudiant"
         self.add_cell(
             col_id,
             ue.acronyme,
             table.fmt_note(val),
             group=col_group or f"col_ue_{ue.id}",
-            classes=note_classes,
+            classes=cell_classes,
             column_classes={f"col_ue_{ue.id}", "col_moy_ue", "col_ue"},
+            target_attrs=target_attrs,
         )
         table.foot_title_row.cells[col_id].target_attrs[
             "title"
-- 
GitLab