From 1193364c3f2c08e16eb5ed8c99c8e2f099aa3923 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Wed, 23 Apr 2025 10:55:01 +0200
Subject: [PATCH] Fix: sco_report when no admission data (continued)

---
 app/models/etudiants.py         | 19 +++++++++++++++----
 app/scodoc/sco_report.py        |  2 +-
 app/scodoc/sco_synchro_etuds.py |  5 +----
 sco_version.py                  |  2 +-
 4 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/app/models/etudiants.py b/app/models/etudiants.py
index b0e2ae47..505ae51b 100644
--- a/app/models/etudiants.py
+++ b/app/models/etudiants.py
@@ -63,6 +63,7 @@ class Identite(models.ScoDocModel):
     dept_naissance = db.Column(db.Text())
     nationalite = db.Column(db.Text())
     statut = db.Column(db.Text())
+    "champ libre inutilisé par ScoDoc, peut servir à filtrer dans les statistiques"
     boursier = db.Column(
         db.Boolean(), nullable=False, default=False, server_default="false"
     )
@@ -217,11 +218,15 @@ class Identite(models.ScoDocModel):
         return cls.query.filter_by(**args).first_or_404()
 
     @classmethod
-    def get_etud(cls, etudid: int, accept_none=False) -> "Identite":
+    def get_etud(
+        cls, etudid: int, accept_none=False, ensure_admission=False
+    ) -> "Identite":
         """Etudiant ou 404 (ou None si accept_none),
         cherche uniquement dans le département courant.
         Si accept_none, return None si l'id est invalide ou ne correspond
         pas à un étudiant.
+        Si ensure_admission: ajoute la relation "admission" si elle n'existe pas
+        déjà (cela entraîne un commit).
         """
         if not isinstance(etudid, int):
             try:
@@ -236,9 +241,15 @@ class Identite(models.ScoDocModel):
             if g.scodoc_dept
             else cls.query.filter_by(id=etudid)
         )
-        if accept_none:
-            return query.first()
-        return query.first_or_404()
+        etud: "Identite" = query.first() if accept_none else query.first_or_404()
+        if etud and not etud.admission and ensure_admission:
+            # Si admission n'existe pas, on l'ajoute
+            etud.admission = Admission()
+            db.session.add(etud.admission)
+            db.session.commit()
+            db.session.refresh(etud)
+            log(f"get_etud: added Admission to etudid={etudid}")
+        return etud
 
     @classmethod
     def create_etud(cls, **args) -> "Identite":
diff --git a/app/scodoc/sco_report.py b/app/scodoc/sco_report.py
index c7e171cc..2e8901ef 100644
--- a/app/scodoc/sco_report.py
+++ b/app/scodoc/sco_report.py
@@ -90,7 +90,7 @@ def formsemestre_etuds_stats(
         etudid = t[-1]
         if etudids and etudid not in etudids:
             continue
-        etud = Identite.get_etud(etudid)
+        etud = Identite.get_etud(etudid, ensure_admission=True)
         e_dict = etud.to_dict_scodoc7()
         if etud.admission:
             e_dict |= etud.admission.to_dict()
diff --git a/app/scodoc/sco_synchro_etuds.py b/app/scodoc/sco_synchro_etuds.py
index 08896943..7b271d2d 100644
--- a/app/scodoc/sco_synchro_etuds.py
+++ b/app/scodoc/sco_synchro_etuds.py
@@ -777,9 +777,6 @@ def do_import_etud_admission(etud: Identite, etud_data: dict, import_identite=Fa
         "codepostallycee": get_opt_str(etud_data, "codepostal_lycee"),
         "boursier": get_opt_str(etud_data, "bourse"),
     }
-    if etud.admission is None:
-        etud.admission = Admission()
-        db.session.add(etud.admission)
     args = {k: v for k, v in args.items() if v not in ("", None)}
     etud.admission.from_dict(args)
 
@@ -873,7 +870,7 @@ def formsemestre_import_etud_admission(
 
     for i in ins:
         etudid = i["etudid"]
-        etud: Identite = Identite.get_or_404(etudid)
+        etud: Identite = Identite.get_etud(etudid, ensure_admission=True)
         code_nip = etud.code_nip
         if not code_nip:
             etuds_no_nip.append(etud)
diff --git a/sco_version.py b/sco_version.py
index 270529ec..cf77d9ac 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -3,7 +3,7 @@
 
 "Infos sur version ScoDoc"
 
-SCOVERSION = "9.7.74"
+SCOVERSION = "9.7.75"
 
 SCONAME = "ScoDoc"
 
-- 
GitLab