From 689b8610bfc5c5addf40417c48b3ecfc6dc3effa Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Wed, 6 Dec 2023 20:40:55 +0100
Subject: [PATCH] Envoi par mail des bulletins PDF courts

---
 app/but/bulletin_but.py         |  4 ++--
 app/but/bulletin_but_court.py   |  8 +++++--
 app/scodoc/sco_archives.py      |  6 +++--
 app/scodoc/sco_bulletins.py     | 24 ++++++++++++++-----
 app/scodoc/sco_bulletins_pdf.py |  4 +++-
 app/views/notes.py              | 41 ++++++++++++++++++++-------------
 6 files changed, 58 insertions(+), 29 deletions(-)

diff --git a/app/but/bulletin_but.py b/app/but/bulletin_but.py
index 8bdab7b48..e25074ad1 100644
--- a/app/but/bulletin_but.py
+++ b/app/but/bulletin_but.py
@@ -345,8 +345,8 @@ class BulletinBUT:
         - Si force_publishing, rempli le bulletin même si bul_hide_xml est vrai
         (bulletins non publiés).
         """
-        if version not in scu.BULLETINS_VERSIONS:
-            raise ScoValueError("version de bulletin demandée invalide")
+        if version not in scu.BULLETINS_VERSIONS_BUT:
+            raise ScoValueError("bulletin_etud: version de bulletin demandée invalide")
         res = self.res
         formsemestre = res.formsemestre
         etat_inscription = etud.inscription_etat(formsemestre.id)
diff --git a/app/but/bulletin_but_court.py b/app/but/bulletin_but_court.py
index 59f77b20b..9010ae350 100644
--- a/app/but/bulletin_but_court.py
+++ b/app/but/bulletin_but_court.py
@@ -83,12 +83,16 @@ def bulletin_but(formsemestre_id: int, etudid: int = None, fmt="html"):
     )
 
 
-def bulletin_but_court_pdf_frag(etud: Identite, formsemestre: FormSemestre) -> bytes:
+def bulletin_but_court_pdf_frag(
+    etud: Identite, formsemestre: FormSemestre, stand_alone=False
+) -> bytes:
     """Le code PDF d'un bulletin BUT court, à intégrer dans un document
     (pour les classeurs de tous les bulletins)
     """
     args = _build_bulletin_but_infos(etud, formsemestre)
-    return bulletin_but_court_pdf.make_bulletin_but_court_pdf(args, stand_alone=False)
+    return bulletin_but_court_pdf.make_bulletin_but_court_pdf(
+        args, stand_alone=stand_alone
+    )
 
 
 def _build_bulletin_but_infos(
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index 05e75f1f1..8d91bbcf1 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -346,7 +346,9 @@ def do_formsemestre_archive(
     )
 
     if bul_version not in scu.BULLETINS_VERSIONS:
-        raise ScoValueError("version de bulletin demandée invalide")
+        raise ScoValueError(
+            "do_formsemestre_archive: version de bulletin demandée invalide"
+        )
     formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
     res: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
     sem_archive_id = formsemestre_id
@@ -505,7 +507,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
         """,
     ]
     F = [
-        f"""<p><em>Note: les documents sont aussi affectés par les réglages sur la page 
+        f"""<p><em>Note: les documents sont aussi affectés par les réglages sur la page
         "<a class="stdlink" href="{
             url_for("scolar.edit_preferences", scodoc_dept=g.scodoc_dept)
         }">Paramétrage</a>"
diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py
index e0b64eb5c..82d8da5aa 100644
--- a/app/scodoc/sco_bulletins.py
+++ b/app/scodoc/sco_bulletins.py
@@ -513,8 +513,8 @@ def _ue_mod_bulletin(
                 sco_users.user_info(modimpl["responsable_id"])["nomcomplet"],
             )
             link_mod = f"""<a class="bull_link" href="{
-                url_for("notes.moduleimpl_status", 
-                        scodoc_dept=g.scodoc_dept, 
+                url_for("notes.moduleimpl_status",
+                        scodoc_dept=g.scodoc_dept,
                         moduleimpl_id=modimpl["moduleimpl_id"]
                         )
                 }" title="{mod["mod_descr_txt"]}">"""
@@ -576,7 +576,7 @@ def _ue_mod_bulletin(
                         "name"
                     ] = f"""{e.description or ""} {
                         e.descr_date()
-                        if e.date_debut and not is_complete  
+                        if e.date_debut and not is_complete
                         else ""}"""
                 e_dict["target_html"] = url_for(
                     "notes.evaluation_listenotes",
@@ -985,6 +985,8 @@ def do_formsemestre_bulletinetud(
     où bul est str ou bytes au format demandé (html, pdf, pdfmail, pdfpart, xml, json)
     et filigranne est un message à placer en "filigranne" (eg "Provisoire").
     """
+    from app.but import bulletin_but_court
+
     fmt = fmt or "html"
     if fmt == "xml":
         bul = sco_bulletins_xml.make_xml_formsemestre_bulletinetud(
@@ -1045,9 +1047,19 @@ def do_formsemestre_bulletinetud(
         if not can_send_bulletin_by_mail(formsemestre.id):
             raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !")
 
-        pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletin_etud(
-            bul_dict, etud=etud, formsemestre=formsemestre, version=version, fmt="pdf"
-        )
+        if version == "butcourt":
+            pdfdata = bulletin_but_court.bulletin_but_court_pdf_frag(
+                etud, formsemestre, stand_alone=True
+            )
+            filename = scu.bul_filename(formsemestre, etud, prefix="bul-court")
+        else:
+            pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletin_etud(
+                bul_dict,
+                etud=etud,
+                formsemestre=formsemestre,
+                version=version,
+                fmt="pdf",
+            )
 
         if prefer_mail_perso:
             recipient_addr = (
diff --git a/app/scodoc/sco_bulletins_pdf.py b/app/scodoc/sco_bulletins_pdf.py
index 658bcf50f..cf0d1348c 100644
--- a/app/scodoc/sco_bulletins_pdf.py
+++ b/app/scodoc/sco_bulletins_pdf.py
@@ -222,7 +222,9 @@ def get_formsemestre_bulletins_pdf(formsemestre_id, version="selectedevals"):
         else scu.BULLETINS_VERSIONS
     )
     if version not in versions:
-        raise ScoValueError("version de bulletin demandée invalide !")
+        raise ScoValueError(
+            "get_formsemestre_bulletins_pdf: version de bulletin demandée invalide !"
+        )
     cached = sco_cache.SemBulletinsPDFCache.get(str(formsemestre_id) + "_" + version)
     if cached:
         return cached[1], cached[0]
diff --git a/app/views/notes.py b/app/views/notes.py
index c6f8f5482..b7fbbd915 100644
--- a/app/views/notes.py
+++ b/app/views/notes.py
@@ -288,7 +288,9 @@ def formsemestre_bulletinetud(
 ):
     fmt = fmt or "html"
     if version not in scu.BULLETINS_VERSIONS_BUT:
-        raise ScoValueError("version de bulletin demandée invalide")
+        raise ScoValueError(
+            "formsemestre_bulletinetud: version de bulletin demandée invalide"
+        )
     if not isinstance(etudid, int):
         raise ScoInvalidIdType("formsemestre_bulletinetud: etudid must be an integer !")
     if formsemestre_id is not None and not isinstance(formsemestre_id, int):
@@ -1881,13 +1883,14 @@ _EXPL_BULL = """Versions des bulletins:
 @scodoc7func
 def formsemestre_bulletins_pdf_choice(formsemestre_id, version=None):
     """Choix version puis envoi classeur bulletins pdf"""
+    formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
     if version:
         pdfdoc, filename = sco_bulletins_pdf.get_formsemestre_bulletins_pdf(
             formsemestre_id, version=version
         )
         return scu.sendPDFFile(pdfdoc, filename)
-    return formsemestre_bulletins_choice(
-        formsemestre_id,
+    return _formsemestre_bulletins_choice(
+        formsemestre,
         title="Choisir la version des bulletins à générer",
         explanation=_EXPL_BULL,
     )
@@ -1900,7 +1903,7 @@ def formsemestre_bulletins_pdf_choice(formsemestre_id, version=None):
 def etud_bulletins_pdf(etudid, version="selectedevals"):
     "Publie tous les bulletins d'un etudiants dans un classeur PDF"
     if version not in scu.BULLETINS_VERSIONS:
-        raise ScoValueError("version de bulletin demandée invalide")
+        raise ScoValueError("etud_bulletins_pdf: version de bulletin demandée invalide")
     pdfdoc, filename = sco_bulletins_pdf.get_etud_bulletins_pdf(etudid, version=version)
     return scu.sendPDFFile(pdfdoc, filename)
 
@@ -1927,15 +1930,20 @@ def formsemestre_bulletins_mailetuds_choice(
                 prefer_mail_perso=prefer_mail_perso,
             )
         )
-
+    formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
     expl_bull = """Versions des bulletins:
         <ul>
             <li><b>courte</b>: moyennes des modules</li>
             <li><b>intermédiaire</b>: moyennes des modules et notes des évaluations sélectionnées</li>
             <li><b>complète</b>: toutes les notes</li>
-        <ul>"""
-    return formsemestre_bulletins_choice(
-        formsemestre_id,
+        """
+    if formsemestre.formation.is_apc():
+        expl_bull += """
+            <li><b>courte spéciale BUT</b>: un résumé en une page pour les BUTs</li>
+        """
+    expl_bull += "</ul>"
+    return _formsemestre_bulletins_choice(
+        formsemestre,
         title="Choisir la version des bulletins à envoyer par mail",
         explanation="""Chaque étudiant (non démissionnaire ni défaillant)
             ayant une adresse mail connue de ScoDoc
@@ -1947,23 +1955,24 @@ def formsemestre_bulletins_mailetuds_choice(
 
 
 # not published
-def formsemestre_bulletins_choice(
-    formsemestre_id, title="", explanation="", choose_mail=False
+def _formsemestre_bulletins_choice(
+    formsemestre: FormSemestre, title="", explanation="", choose_mail=False
 ):
     """Choix d'une version de bulletin"""
+    versions = (
+        scu.BULLETINS_VERSIONS_BUT
+        if formsemestre.formation.is_apc()
+        else scu.BULLETINS_VERSIONS
+    )
     H = [
         html_sco_header.html_sem_header(title),
         f"""
       <form name="f" method="GET" action="{request.base_url}">
-      <input type="hidden" name="formsemestre_id" value="{formsemestre_id}"></input>
+      <input type="hidden" name="formsemestre_id" value="{formsemestre.id}"></input>
       """,
     ]
     H.append("""<select name="version" class="noprint">""")
-    for version, description in (
-        ("short", "Version courte"),
-        ("selectedevals", "Version intermédiaire"),
-        ("long", "Version complète"),
-    ):
+    for version, description in versions.items():
         H.append(f"""<option value="{version}">{description}</option>""")
 
     H.append("""</select>&nbsp;&nbsp;<input type="submit" value="Générer"/>""")
-- 
GitLab