From 7712de19a2e6ed54c77428b966c794b474c6f678 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Tue, 20 Jun 2023 21:01:40 +0200
Subject: [PATCH] =?UTF-8?q?Modifie=20effacement=20d=C3=A9cisions=20annuell?=
 =?UTF-8?q?es=20BUT=20et=20RCUE.=20Am=C3=A9liore=20affichage=20d=C3=A9cisi?=
 =?UTF-8?q?ons?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/but/jury_but.py                           | 35 +++++++++++--------
 app/models/validations.py                     | 14 +++++---
 app/static/css/jury_delete_manual.css         |  6 +++-
 .../but/formsemestre_validation_auto_but.j2   | 10 ++++--
 app/views/notes.py                            |  7 +++-
 5 files changed, 49 insertions(+), 23 deletions(-)

diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 6861c8ecd..83b1d9ddb 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -902,6 +902,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         Efface même si étudiant DEM ou DEF.
         Si à cheval ou only_one_sem, n'efface que les décisions UE et les
         autorisations de passage du semestre d'origine du deca.
+
+        Dans tous les cas, efface les validations de l'année en cours.
         (commite la session.)
         """
         if only_one_sem or self.a_cheval:
@@ -916,8 +918,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         else:
             for dec_ue in self.decisions_ues.values():
                 dec_ue.erase()
-            for dec_rcue in self.decisions_rcue_by_niveau.values():
-                dec_rcue.erase()
+
             if self.formsemestre_impair:
                 ScolarAutorisationInscription.delete_autorisation_etud(
                     self.etud.id, self.formsemestre_impair.id
@@ -926,21 +927,27 @@ class DecisionsProposeesAnnee(DecisionsProposees):
                 ScolarAutorisationInscription.delete_autorisation_etud(
                     self.etud.id, self.formsemestre_pair.id
                 )
-            validations = ApcValidationAnnee.query.filter_by(
+        # Efface les RCUEs
+        for dec_rcue in self.decisions_rcue_by_niveau.values():
+            dec_rcue.erase()
+
+        # Efface les validations concernant l'année BUT
+        # de ce semestre
+        validations = (
+            ApcValidationAnnee.query.filter_by(
                 etudid=self.etud.id,
-                # XXX efface les validations émise depuis ce semestre
-                # et pas toutes celles concernant cette l'année...
-                # (utiliser formation_id pour changer cette politique)
-                formsemestre_id=self.formsemestre.id,
                 ordre=self.annee_but,
             )
-            for validation in validations:
-                db.session.delete(validation)
-                Scolog.logdb(
-                    "jury_but",
-                    etudid=self.etud.id,
-                    msg=f"Validation année BUT{self.annee_but}: effacée",
-                )
+            .join(Formation)
+            .filter_by(formation_code=self.formsemestre.formation.formation_code)
+        )
+        for validation in validations:
+            db.session.delete(validation)
+            Scolog.logdb(
+                "jury_but",
+                etudid=self.etud.id,
+                msg=f"Validation année BUT{self.annee_but}: effacée",
+            )
 
         # Efface éventuelles validations de semestre
         # (en principe inutilisées en BUT)
diff --git a/app/models/validations.py b/app/models/validations.py
index 8a1a8dd0d..7686d7897 100644
--- a/app/models/validations.py
+++ b/app/models/validations.py
@@ -79,17 +79,23 @@ class ScolarFormSemestreValidation(db.Model):
     def html(self, detail=False) -> str:
         "Affichage html"
         if self.ue_id is not None:
-            return f"""Validation de l'UE {self.ue.acronyme} de {self.ue.formation.acronyme}
+            return f"""Validation de l'UE <b>{self.ue.acronyme}</b>
+                {('parcours <span class="parcours">'
+                  + ", ".join([p.code for p in self.ue.parcours]))
+                  + "</span>"
+                  if self.ue.parcours else ""}
+                de {self.ue.formation.acronyme}
                 {("émise par " + self.formsemestre.html_link_status()) 
                     if self.formsemestre else ""}
-                :<b>{self.code}</b>
+                : <b>{self.code}</b>
                 le {self.event_date.strftime("%d/%m/%Y")} à {self.event_date.strftime("%Hh%M")}
             """
         else:
             return f"""Validation du semestre S{
                 self.formsemestre.semestre_id if self.formsemestre else "?"}
-                (<b>{self.code}</b>
-                le {self.event_date.strftime("%d/%m/%Y")} à {self.event_date.strftime("%Hh%M")})
+                {self.formsemestre.html_link_status() if self.formsemestre else ""}
+                : <b>{self.code}</b>
+                le {self.event_date.strftime("%d/%m/%Y")} à {self.event_date.strftime("%Hh%M")}
             """
 
 
diff --git a/app/static/css/jury_delete_manual.css b/app/static/css/jury_delete_manual.css
index 6580e089f..6fa14f9ea 100644
--- a/app/static/css/jury_delete_manual.css
+++ b/app/static/css/jury_delete_manual.css
@@ -6,4 +6,8 @@ div.jury_decisions_list div {
 
 div.jury_decisions_list form {
     display: inline-block;
-}
\ No newline at end of file
+}
+
+span.parcours {
+    color:blueviolet;
+}
diff --git a/app/templates/but/formsemestre_validation_auto_but.j2 b/app/templates/but/formsemestre_validation_auto_but.j2
index db7de789a..27334aac5 100644
--- a/app/templates/but/formsemestre_validation_auto_but.j2
+++ b/app/templates/but/formsemestre_validation_auto_but.j2
@@ -26,9 +26,13 @@
     En conséquence, saisir ensuite <b>manuellement les décisions manquantes</b>,
     notamment sur les UEs en dessous de 10.
 </p>
-<p class="warning">
-    Il est nécessaire de relire soigneusement les décisions à l'issue de cette procédure !
-</p>
+<div class="warning">
+    <ul>
+    <li>Ne jamais lancer ce calcul avant que toutes les notes ne soient saisies !
+    (verrouiller le semestre ensuite)
+    </li>
+    <li>Il est nécessaire de relire soigneusement les décisions à l'issue de cette procédure !</li>
+</div>
 
 
 <div class="row">
diff --git a/app/views/notes.py b/app/views/notes.py
index 3a5e3bbe7..cf5da2e36 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -2898,7 +2898,12 @@ def formsemestre_jury_but_erase(formsemestre_id: int, etudid: int = None):
         )
         + """
         <p>Les décisions des années scolaires précédentes ne seront pas modifiées.</p>
-        <div class="warning">Cette opération est irréversible !</div>
+        <p>Efface aussi toutes les validations concernant l'année BUT de ce semestre,
+        même si elles ont été acquises ailleurs.
+        </p>
+        <div class="warning">Cette opération est irréversible !
+        A n'utiliser que dans des cas exceptionnels, vérifiez bien tous les étudiants ensuite.
+        </div>
         """,
         cancel_url=dest_url,
     )
-- 
GitLab