From d83ad1aa213696cdf1a96f5589236acfd32d59d1 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Thu, 6 Feb 2025 11:26:07 +0100
Subject: [PATCH] =?UTF-8?q?Calcul=20auto=20jury=20BUT:=20enregistre=20auto?=
 =?UTF-8?q?risations=20passage=20apr=C3=A8s=20semestre=20impair.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/but/jury_but.py       | 21 +++++++++++++--------
 app/models/validations.py |  9 +++++++--
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 3c1e1b18..9d416568 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -634,7 +634,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
     def next_semestre_ids(self, code: str) -> set[int]:
         """Les indices des semestres dans lequels l'étudiant est autorisé
         à poursuivre après le semestre courant.
-        code: code jury sur année BUT
+        code: code jury sur année BUT (inutilisé sur semestres impairs)
         """
         # La poursuite d'études dans un semestre pair d'une même année
         # est de droit pour tout étudiant.
@@ -722,7 +722,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         db.session.commit()
 
     def record(self, code: str, mark_recorded: bool = True) -> bool:
-        """Enregistre le code de l'année, et au besoin l'autorisation d'inscription.
+        """Enregistre le code de l'année, mais pas l'autorisation d'inscription.
         Si l'étudiant est DEM ou DEF, ne fait rien.
         Si le code est None, efface le code déjà enregistré.
         Si mark_recorded est vrai, positionne self.recorded
@@ -773,16 +773,17 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         self.invalidate_formsemestre_cache()
         return True
 
-    def record_autorisation_inscription(self, code: str):
+    def record_autorisation_inscription(self, code: str) -> bool:
         """Autorisation d'inscription dans semestre suivant.
         code: code jury sur année BUT
+        Return vrai si modif.
         """
         if self.autorisations_recorded:
-            return
+            return False
         if self.inscription_etat != scu.INSCRIT:
             # les dem et DEF ne continuent jamais
-            return
-        ScolarAutorisationInscription.delete_autorisation_etud(
+            return False  # ? devrait effacer existant ?
+        modif = ScolarAutorisationInscription.delete_autorisation_etud(
             etudid=self.etud.id,
             origin_formsemestre_id=self.formsemestre.id,
         )
@@ -793,7 +794,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
                 self.formsemestre.id,
                 next_semestre_id,
             )
-            self.autorisations_recorded = True
+            modif = self.autorisations_recorded = True
+        return modif
 
     def invalidate_formsemestre_cache(self):
         "invalide le résultats des deux formsemestres"
@@ -893,7 +895,10 @@ class DecisionsProposeesAnnee(DecisionsProposees):
                 not only_validantes
             ) or code in sco_codes.CODES_ANNEE_BUT_VALIDES_DE_DROIT:
                 modif |= self.record(code)
-                self.record_autorisation_inscription(code)
+                modif |= self.record_autorisation_inscription(code)
+            elif self.formsemestre.semestre_id % 2:  # semestre impair: passage de droit
+                modif |= self.record_autorisation_inscription(code)
+
         return modif
 
     def erase(self, only_one_sem=False):
diff --git a/app/models/validations.py b/app/models/validations.py
index fee681ee..25417b42 100644
--- a/app/models/validations.py
+++ b/app/models/validations.py
@@ -229,13 +229,17 @@ class ScolarAutorisationInscription(models.ScoDocModel):
         cls,
         etudid: int,
         origin_formsemestre_id: int,
-    ):
-        """Efface les autorisations de cet étudiant venant du sem. origine"""
+    ) -> bool:
+        """Efface les autorisations de cet étudiant venant du sem. origine.
+        Vrai si modification.
+        """
         autorisations = cls.query.filter_by(
             etudid=etudid, origin_formsemestre_id=origin_formsemestre_id
         )
+        modif = False
         for autorisation in autorisations:
             db.session.delete(autorisation)
+            modif = True
             log(f"ScolarAutorisationInscription: deleting {autorisation}")
             Scolog.logdb(
                 "autorise_etud",
@@ -243,3 +247,4 @@ class ScolarAutorisationInscription(models.ScoDocModel):
                 msg=f"Passage vers S{autorisation.semestre_id}: effacé",
             )
         db.session.flush()
+        return modif
-- 
GitLab