From 431b0aa651d66c2425b680fa0e683ca5e79120fd Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Thu, 6 Feb 2025 10:22:43 +0100
Subject: [PATCH] formsemestre_inscr_passage: mentionne DEM inscrits. Close
 #1038

---
 app/models/formsemestre.py      |  2 +-
 app/scodoc/sco_inscr_passage.py | 50 ++++++++++++++++++++-------------
 app/scodoc/sco_synchro_etuds.py |  4 ++-
 app/static/css/scodoc.css       |  5 ++++
 sco_version.py                  |  2 +-
 5 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py
index ef321bb9..f8c4638d 100644
--- a/app/models/formsemestre.py
+++ b/app/models/formsemestre.py
@@ -1221,7 +1221,7 @@ class FormSemestre(models.ScoDocModel):
         }
 
     @property
-    def etuds_inscriptions(self) -> dict:
+    def etuds_inscriptions(self) -> dict[int, "FormSemestreInscription"]:
         """Map { etudid : inscription } (incluant DEM et DEF)"""
         return {ins.etud.id: ins for ins in self.inscriptions}
 
diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py
index d0d05ceb..fc07eacb 100644
--- a/app/scodoc/sco_inscr_passage.py
+++ b/app/scodoc/sco_inscr_passage.py
@@ -50,22 +50,24 @@ from app.scodoc.sco_exceptions import ScoValueError
 
 def _list_authorized_etuds_by_sem(
     formsemestre: FormSemestre, ignore_jury=False
-) -> tuple[dict[int, dict], list[dict], dict[int, Identite]]:
+) -> tuple[dict[int, dict], dict[int, dict], dict[int, Identite]]:
     """Liste des etudiants autorisés à s'inscrire dans sem.
     delai = nb de jours max entre la date de l'autorisation et celle de debut du semestre cible.
     ignore_jury: si vrai, considère tous les étudiants comme autorisés, même
     s'ils n'ont pas de décision de jury.
     """
     src_sems = _list_source_sems(formsemestre)
-    inscrits = list_inscrits(formsemestre.id)
-    r = {}
+    inscriptions = formsemestre.etuds_inscriptions
+    auth_etuds_by_sem = {}
     candidats = {}  # etudid : etud (tous les etudiants candidats)
     nb = 0  # debug
     src_formsemestre: FormSemestre
     for src_formsemestre in src_sems:
         if ignore_jury:
             # liste de tous les inscrits au semestre (sans dems)
-            etud_list = list_inscrits(src_formsemestre.id).values()
+            etud_list = list_inscrits_edict(
+                src_formsemestre.id, with_dems=False
+            ).values()
         else:
             # liste des étudiants autorisés par le jury à s'inscrire ici
             etud_list = _list_etuds_from_sem(src_formsemestre, formsemestre)
@@ -81,7 +83,7 @@ def _list_authorized_etuds_by_sem(
                 candidats[e["etudid"]] = etud
                 liste_filtree.append(e)
                 nb += 1
-        r[src_formsemestre.id] = {
+        auth_etuds_by_sem[src_formsemestre.id] = {
             "etuds": liste_filtree,
             "infos": {
                 "id": src_formsemestre.id,
@@ -94,15 +96,20 @@ def _list_authorized_etuds_by_sem(
                 "filename": "etud_autorises",
             },
         }
-        # ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre dest.
-        for e in r[src_formsemestre.id]["etuds"]:
-            e["inscrit"] = e["etudid"] in inscrits
+        # ajoute attribut inscrit qui indique si l'étudiant est déjà inscrit dans le semestre cible
+        for e in auth_etuds_by_sem[src_formsemestre.id]["etuds"]:
+            e["inscrit"] = e["etudid"] in inscriptions
 
-    # Ajoute liste des etudiants actuellement inscrits
-    for e in inscrits.values():
+    # Ajoute étudiants actuellement inscrits dans le semestre cible
+    inscrits_by_id_edict = {
+        ins.etudid: ins.etud.to_dict_scodoc7() for ins in inscriptions.values()
+    }
+    # ajoute état inscription pour afficher démissionnaires avec style
+    for e in inscrits_by_id_edict.values():
         e["inscrit"] = True
-    r[formsemestre.id] = {
-        "etuds": list(inscrits.values()),
+        e["etat"] = inscriptions[e["etudid"]].etat
+    auth_etuds_by_sem[formsemestre.id] = {
+        "etuds": list(inscrits_by_id_edict.values()),
         "infos": {
             "id": formsemestre.id,
             "title": "Semestre cible: " + formsemestre.titre_annee(),
@@ -112,16 +119,17 @@ def _list_authorized_etuds_by_sem(
                 formsemestre_id=formsemestre.id,
             ),
             "comment": " actuellement inscrits dans ce semestre",
-            "help": "Ces étudiants sont actuellement inscrits dans ce semestre. Si vous les décochez, il seront désinscrits.",
+            "help": """Ces étudiants sont actuellement inscrits dans ce semestre.
+                Si vous les décochez, il seront désinscrits.""",
             "filename": "etud_inscrits",
         },
     }
 
-    return r, inscrits, candidats
+    return auth_etuds_by_sem, inscrits_by_id_edict, candidats
 
 
-def list_inscrits(formsemestre_id: int, with_dems=False) -> list[dict]:
-    """Étudiants déjà inscrits à ce semestre
+def list_inscrits_edict(formsemestre_id: int, with_dems=False) -> list[dict]:
+    """Étudiants (as dict) déjà inscrits à ce semestre
     { etudid : etud }
     """
     if not with_dems:
@@ -663,9 +671,8 @@ def etuds_select_box(
     if help_txt:  # bubble
         H.append(f'title="{help_txt}"')
     H.append(
-        """>%(title)s</a></div>
-        <div class="pas_sembox_subtitle">(%(nbetuds)d étudiants%(comment)s)"""
-        % infos
+        f""">{infos['title']}</a></div>
+        <div class="pas_sembox_subtitle">({infos['nbetuds']} étudiants{infos['comment']})"""
     )
     if with_checkbox:
         H.append(
@@ -707,6 +714,9 @@ def etuds_select_box(
             if is_inscrit
             else ("inscrit-ailleurs" if etud["etudid"] in inscrits_ailleurs else "")
         )
+        if etud.get("etat") == scu.DEMISSION:
+            extra_class += " etuddem"
+
         H.append(
             _etud_row(
                 etud,
@@ -748,6 +758,8 @@ def _etud_row(
             )
             }">{nomprenom}</a>
         """
+        if etud.get("etat") == scu.DEMISSION:
+            elink += """<span class="etuddem">(DEM.)</span>"""
     else:
         # ce n'est pas un etudiant ScoDoc
         elink = nomprenom
diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py
index 80f8fcf1..407a1b43 100644
--- a/app/scodoc/sco_synchro_etuds.py
+++ b/app/scodoc/sco_synchro_etuds.py
@@ -388,7 +388,9 @@ def _build_page(
 
 def list_synch(sem, annee_apogee=None):
     """"""
-    inscrits = sco_inscr_passage.list_inscrits(sem["formsemestre_id"], with_dems=True)
+    inscrits = sco_inscr_passage.list_inscrits_edict(
+        sem["formsemestre_id"], with_dems=True
+    )
     # Tous les ensembles d'etudiants sont ici des ensembles de codes NIP (voir EKEY_SCO)
     # (sauf inscrits_without_key)
     inscrits_set = set()
diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css
index 52185676..7e072b60 100644
--- a/app/static/css/scodoc.css
+++ b/app/static/css/scodoc.css
@@ -3809,6 +3809,11 @@ span.sp_etape {
   color: red !important;
 }
 
+.etuds-box .etuddem {
+  color: red !important;
+  font-style: italic;
+}
+
 div.etuds_select_boxes {
   margin-bottom: 16px;
 }
diff --git a/sco_version.py b/sco_version.py
index e63d45ce..032ec0c6 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -3,7 +3,7 @@
 
 "Infos sur version ScoDoc"
 
-SCOVERSION = "9.7.61"
+SCOVERSION = "9.7.62"
 
 SCONAME = "ScoDoc"
 
-- 
GitLab