From e63cdba1f66d79cd0f4ad8302bda09c4d894d1ec Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Sun, 7 Jul 2024 22:07:27 +0200
Subject: [PATCH] =?UTF-8?q?DUT=20apr=C3=A8s=20jury=20BUT:=20ajout=20sur=20?=
 =?UTF-8?q?bulletins=20et=20PVs.=20WIP=20#577?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/but/bulletin_but.py                  |  1 -
 app/but/bulletin_but_court.py            |  3 ++-
 app/but/bulletin_but_court_pdf.py        | 23 ++++++++++++++------
 app/but/jury_but_pv.py                   | 10 ++++++++-
 app/scodoc/sco_bulletins.py              |  8 +++++++
 app/scodoc/sco_bulletins_json.py         |  5 ++++-
 app/scodoc/sco_preferences.py            |  2 +-
 app/scodoc/sco_pv_lettres_inviduelles.py | 27 ++++++++++++++++++++++--
 app/templates/but/bulletin_court_page.j2 |  7 ++++--
 9 files changed, 70 insertions(+), 16 deletions(-)

diff --git a/app/but/bulletin_but.py b/app/but/bulletin_but.py
index 6e6c9d40..024fe53e 100644
--- a/app/but/bulletin_but.py
+++ b/app/but/bulletin_but.py
@@ -576,7 +576,6 @@ class BulletinBUT:
             show_uevalid=self.prefs["bul_show_uevalid"],
             show_mention=self.prefs["bul_show_mention"],
         )
-
         d.update(infos)
         # --- Rangs
         d["rang_nt"] = (
diff --git a/app/but/bulletin_but_court.py b/app/but/bulletin_but_court.py
index 41f989a1..d9772d63 100644
--- a/app/but/bulletin_but_court.py
+++ b/app/but/bulletin_but_court.py
@@ -39,6 +39,7 @@ from app.scodoc.codes_cursus import UE_STANDARD
 from app.scodoc.sco_exceptions import ScoNoReferentielCompetences, ScoValueError
 from app.scodoc.sco_logos import find_logo
 from app.scodoc.sco_permissions import Permission
+from app.scodoc.sco_pv_lettres_inviduelles import add_dut120_infos
 import app.scodoc.sco_utils as scu
 from app.views import notes_bp as bp
 from app.views import ScoData
@@ -67,7 +68,6 @@ def bulletin_but(formsemestre_id: int, etudid: int = None, fmt="html"):
         raise ScoValueError("formation non BUT")
 
     args = _build_bulletin_but_infos(etud, formsemestre, fmt=fmt)
-
     if fmt == "pdf":
         filename = scu.bul_filename(formsemestre, etud, prefix="bul-but")
         bul_pdf = bulletin_but_court_pdf.make_bulletin_but_court_pdf(args)
@@ -153,4 +153,5 @@ def _build_bulletin_but_infos(
             if ue.type == UE_STANDARD and ue.acronyme in ue_acronyms
         ],
     }
+    add_dut120_infos(formsemestre, etud.id, args)
     return args
diff --git a/app/but/bulletin_but_court_pdf.py b/app/but/bulletin_but_court_pdf.py
index 5acbee5d..041feef1 100644
--- a/app/but/bulletin_but_court_pdf.py
+++ b/app/but/bulletin_but_court_pdf.py
@@ -97,6 +97,8 @@ class BulletinGeneratorBUTCourt(BulletinGeneratorStandard):
             tuple[int, str], ScolarFormSemestreValidation
         ] = None,
         ues_acronyms: list[str] = None,
+        diplome_dut120: bool = False,
+        diplome_dut120_descr: str = "",
     ):
         super().__init__(bul, authuser=current_user, filigranne=filigranne)
         self.bul = bul
@@ -110,7 +112,8 @@ class BulletinGeneratorBUTCourt(BulletinGeneratorStandard):
         self.title = title
         self.ue_validation_by_niveau = ue_validation_by_niveau
         self.ues_acronyms = ues_acronyms  # sans UEs sport
-
+        self.diplome_dut120 = diplome_dut120
+        self.diplome_dut120_descr = diplome_dut120_descr
         self.nb_ues = len(self.ues_acronyms)
         # Styles PDF
         self.style_base = styles.ParagraphStyle("style_base")
@@ -243,13 +246,17 @@ class BulletinGeneratorBUTCourt(BulletinGeneratorStandard):
         )
         table_abs_ues.hAlign = "RIGHT"
         # Ligne (en bas) avec table cursus et boite jury
+        # table_content = [self.table_cursus_but()]
+        # if self.prefs["bul_show_decision"]:
+        #     table_content.append([Spacer(1, 8 * mm), self.boite_decisions_jury()])
+        table_content = [self.table_cursus_but()]
+        table_content.append(
+            [Spacer(1, 8 * mm), self.boite_decisions_jury()]
+            if self.prefs["bul_show_decision"]
+            else []
+        )
         table_cursus_jury = Table(
-            [
-                [
-                    self.table_cursus_but(),
-                    [Spacer(1, 8 * mm), self.boite_decisions_jury()],
-                ]
-            ],
+            [table_content],
             colWidths=(self.width_page_avail - 84 * mm, 84 * mm),
             style=style_table_2cols,
         )
@@ -533,6 +540,8 @@ class BulletinGeneratorBUTCourt(BulletinGeneratorStandard):
             <br/>
             {self.bul["diplomation"]}
             """
+        if self.diplome_dut120_descr:
+            txt += f"""<br/>{self.diplome_dut120_descr}."""
 
         if self.bul["semestre"].get("autorisation_inscription", None):
             txt += (
diff --git a/app/but/jury_but_pv.py b/app/but/jury_but_pv.py
index 22aca962..1bc5a8d3 100644
--- a/app/but/jury_but_pv.py
+++ b/app/but/jury_but_pv.py
@@ -13,6 +13,7 @@ from openpyxl.styles import Alignment
 from app import log
 from app.but import jury_but
 from app.but.cursus_but import but_ects_valides
+from app.models.but_validations import ValidationDUT120
 from app.models.etudiants import Identite
 from app.models.formsemestre import FormSemestre
 from app.scodoc.gen_tables import GenTable
@@ -156,6 +157,13 @@ def pvjury_table_but(
 
         ects_but_valides = but_ects_valides(etud, referentiel_competence_id)
         has_diplome = deca.valide_diplome()
+        diplome_lst = ["ADM"] if has_diplome else []
+        validation_dut120 = ValidationDUT120.query.filter_by(
+            etudid=etudid, formsemestre_id=formsemestre.id
+        ).first()
+        if validation_dut120:
+            diplome_lst.append("Diplôme de DUT validé.")
+        diplome_str = ". ".join(diplome_lst)
         row = {
             "nom_pv": (
                 etud.code_ine or etud.code_nip or etud.id
@@ -190,7 +198,7 @@ def pvjury_table_but(
                     else ""
                 )
             ),
-            "diplome": "ADM" if has_diplome else "",
+            "diplome": diplome_str,
             # pour exports excel seulement:
             "civilite": etud.civilite_etat_civil_str,
             "nom": etud.nom,
diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py
index a24785ee..2ca0632f 100644
--- a/app/scodoc/sco_bulletins.py
+++ b/app/scodoc/sco_bulletins.py
@@ -69,6 +69,7 @@ from app.scodoc import sco_formsemestre
 from app.scodoc import sco_groups
 from app.scodoc import sco_preferences
 from app.scodoc import sco_pv_dict
+from app.scodoc import sco_pv_lettres_inviduelles
 from app.scodoc import sco_users
 import app.scodoc.sco_utils as scu
 from app.scodoc.sco_utils import ModuleType, fmt_note
@@ -711,6 +712,9 @@ def etud_descr_situation_semestre(
     descr_mention : 'Mention Bien', ou vide si pas de mention ou si pas show_mention
     diplomation   : "Diplôme obtenu." ou ""
     parcours_titre, parcours_code, refcomp_specialite, refcomp_specialite_long
+
+    diplome_dut120_descr: phrase explicative si DUT enregistré (en BUT)
+    diplome_dut120: booléen, vrai si DUT enregistré (en BUT)
     """
     # Fonction utilisée par tous les bulletins (APC ou classiques)
     infos = collections.defaultdict(str)
@@ -830,12 +834,16 @@ def etud_descr_situation_semestre(
         descr_dec += " Diplôme obtenu."
 
     infos["diplomation"] = "Diplôme obtenu." if pv["validation_parcours"] else ""
+    # Ajoute diplome_dut120_descr et diplome_dut120
+    sco_pv_lettres_inviduelles.add_dut120_infos(formsemestre, etudid, infos)
+
     _format_situation_fields(
         infos,
         [
             "descr_inscription",
             "descr_defaillance",
             "descr_decisions_ue",
+            "diplome_dut120_descr",
             "descr_decision_annee",
         ],
         [descr_dec, descr_mention, descr_autorisations],
diff --git a/app/scodoc/sco_bulletins_json.py b/app/scodoc/sco_bulletins_json.py
index 8fa0d38b..46383b0d 100644
--- a/app/scodoc/sco_bulletins_json.py
+++ b/app/scodoc/sco_bulletins_json.py
@@ -447,6 +447,7 @@ def dict_decision_jury(
         'situation': 'Inscrit le 25/06/2021. Décision jury: Validé.  UE acquises: '
                     'UE31, UE32.  Diplôme obtenu.',
         'diplomation' : 'Diplôme obtenu.' # (ou vide)
+
     }
     """
     from app.scodoc import sco_bulletins
@@ -460,8 +461,10 @@ def dict_decision_jury(
             formsemestre,
             show_uevalid=prefs["bul_show_uevalid"],
         )
-        d["situation"] = infos["situation"]
         d["diplomation"] = infos["diplomation"]
+        d["situation"] = infos["situation"]
+        d["diplome_dut120"] = infos["diplome_dut120"]
+        d["diplome_dut120_descr"] = infos["diplome_dut120_descr"]
         if dpv:
             decision = dpv["decisions"][0]
             etat = decision["etat"]
diff --git a/app/scodoc/sco_preferences.py b/app/scodoc/sco_preferences.py
index 106e541b..019cec65 100644
--- a/app/scodoc/sco_preferences.py
+++ b/app/scodoc/sco_preferences.py
@@ -1350,7 +1350,7 @@ class BasePreferences:
                 "bul_show_decision",
                 {
                     "initvalue": 0,
-                    "title": "Faire figurer les décisions sur les bulletins",
+                    "title": "Faire figurer les décisions de jury sur les bulletins",
                     "input_type": "boolcheckbox",
                     "category": "bul",
                     "labels": ["non", "oui"],
diff --git a/app/scodoc/sco_pv_lettres_inviduelles.py b/app/scodoc/sco_pv_lettres_inviduelles.py
index 6e335f0a..053eed1b 100644
--- a/app/scodoc/sco_pv_lettres_inviduelles.py
+++ b/app/scodoc/sco_pv_lettres_inviduelles.py
@@ -43,7 +43,7 @@ from reportlab.platypus.doctemplate import BaseDocTemplate
 from reportlab.lib import styles
 
 from app import db
-from app.models import FormSemestre, Identite
+from app.models import FormSemestre, Identite, ValidationDUT120
 
 import app.scodoc.sco_utils as scu
 from app.scodoc import sco_bulletins_pdf
@@ -347,7 +347,9 @@ def add_classic_infos(formsemestre: FormSemestre, params: dict, decision: dict):
 
 
 def add_apc_infos(formsemestre: FormSemestre, params: dict, decision: dict):
-    """Ajoute les champs pour les formations APC (BUT), donc avec codes RCUE et année"""
+    """Ajoute à params les champs pour les formations APC (BUT), avec codes RCUE et année
+    et diplome_dut120_descr
+    """
     annee_but = (formsemestre.semestre_id + 1) // 2
     params["decision_orig"] = f"année BUT{annee_but}"
     if decision is None:
@@ -364,3 +366,24 @@ def add_apc_infos(formsemestre: FormSemestre, params: dict, decision: dict):
                 '<br/>&nbsp;&nbsp;&nbsp;&nbsp;- '.join( decision.get("descr_decisions_rcue_list", []) )
             }
         """
+    add_dut120_infos(formsemestre, decision["identite"]["etudid"], params)
+
+
+def add_dut120_infos(formsemestre: FormSemestre, etudid: int, params: dict):
+    """Ajout DUT120:
+    diplome_dut120_descr: phrase explicative si DUT enregistré
+    diplome_dut120: booléen, vrai si DUT enregistré
+    """
+    validation_dut120 = ValidationDUT120.query.filter_by(
+        etudid=etudid, formsemestre_id=formsemestre.id
+    ).first()
+    if validation_dut120:
+        params["diplome_dut120"] = True
+        params["diplome_dut120_descr"] = "Diplôme de DUT (BUT1, BUT2) validé"
+        if "decision_sem_descr" in params:
+            # sur decision_sem_descr afin que cela apparaisse sur les
+            # lettres individuelles sans avoir à modifier le paramétrage
+            params["decision_sem_descr"] += ". " + params["diplome_dut120_descr"]
+    else:
+        params["diplome_dut120"] = False
+        params["diplome_dut120_descr"] = ""
diff --git a/app/templates/but/bulletin_court_page.j2 b/app/templates/but/bulletin_court_page.j2
index 6912ee72..95180ff8 100644
--- a/app/templates/but/bulletin_court_page.j2
+++ b/app/templates/but/bulletin_court_page.j2
@@ -133,13 +133,16 @@
             <div>ECTS acquis en BUT&nbsp;: <b>{{"%g"|format(ects_total)}}</b></div>
             <div class="descr_jury">
                 {% if bul.semestre.decision_annee %}
-                    Décision saisie le {{
+                    {# Décision saisie le {{
                         datetime.datetime.fromisoformat(bul.semestre.decision_annee.date).strftime(scu.DATE_FMT)
-                    }},
+                    }}, #}
                     année <b>BUT{{bul.semestre.decision_annee.ordre}}</b>
                     <b>{{bul.semestre.decision_annee.code}}</b>.
                 {% endif %}
                 <div class="diplomation">{{bul.semestre.diplomation}}</div>
+                {% if diplome_dut120_descr %}
+                <div class="diplomation">{{diplome_dut120_descr}}.</div>
+                {% endif %}
                 {% set virg = joiner(", ") %}
                 {% for aut in bul.semestre.autorisation_inscription -%}
                     {% if loop.first %}
-- 
GitLab