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