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(
=
UE dispensée
nan
valeur non disponible
đź“Ť
code jury non enregistré
+ 12.34
UE hors parcours
"""
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"
)
+ self.add_ues_cols(ues_sans_bonus)
- # --- Moyenne d'UE
+ 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"""{
@@ -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"