From 85005419aea4e0f4f9a592097485f7a261483311 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Thu, 19 Oct 2023 21:07:03 +0200
Subject: [PATCH] Clarifie explications validation manuelle RCUE. Commente
 code. Petits nettoyages.

---
 app/but/jury_but.py                       |  2 --
 app/comp/res_compat.py                    | 13 ++++++--
 app/comp/res_sem.py                       |  2 +-
 app/scodoc/codes_cursus.py                |  4 +--
 app/scodoc/sco_formsemestre_validation.py | 22 ++++++++-----
 app/templates/but/validation_rcues.j2     | 40 ++++++++++++++---------
 tools/build_release.sh                    |  2 +-
 7 files changed, 51 insertions(+), 34 deletions(-)

diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 4309342b2..bc3b7285c 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -83,7 +83,6 @@ from app.models.but_validations import (
     ApcValidationRCUE,
 )
 from app.models.etudiants import Identite
-from app.models.formations import Formation
 from app.models.formsemestre import FormSemestre
 from app.models.ues import UniteEns
 from app.models.validations import ScolarFormSemestreValidation
@@ -93,7 +92,6 @@ from app.scodoc.codes_cursus import (
     code_rcue_validant,
     BUT_CODES_ORDER,
     CODES_RCUE_VALIDES,
-    CODES_UE_CAPITALISANTS,
     CODES_UE_VALIDES,
     RED,
     UE_STANDARD,
diff --git a/app/comp/res_compat.py b/app/comp/res_compat.py
index fe4116309..2934f1e93 100644
--- a/app/comp/res_compat.py
+++ b/app/comp/res_compat.py
@@ -304,9 +304,16 @@ class NotesTableCompat(ResultatsSemestre):
         )
 
     def get_etud_decisions_ue(self, etudid: int) -> dict:
-        """Decisions du jury pour les UE de cet etudiant, ou None s'il n'y en pas eu.
-        Ne tient pas compte des UE capitalisées.
-        { ue_id : { 'code' : ADM|CMP|AJ, 'event_date' : "d/m/y", 'ects' : x }
+        """Decisions du jury pour les UE de cet etudiant dans ce formsemestre,
+        ou None s'il n'y en pas eu.
+        Ne tient pas compte des UE capitalisées ou externes.
+        { ue_id : {
+            'code' : ADM|CMP|AJ|ADSUP|...,
+            'event_date' : "d/m/y",
+            'ects' :  float, nb d'ects validées dans l'UE de ce semestre.
+            }
+            ...
+        }
         Ne renvoie aucune decision d'UE pour les défaillants
         """
         if self.get_etud_etat(etudid) == DEF:
diff --git a/app/comp/res_sem.py b/app/comp/res_sem.py
index 35affb5c1..212f97102 100644
--- a/app/comp/res_sem.py
+++ b/app/comp/res_sem.py
@@ -50,7 +50,7 @@ def load_formsemestre_validations(formsemestre: FormSemestre) -> ValidationsSeme
     If not in cache, build it and cache it (in g).
     """
     if not hasattr(g, "formsemestre_validation_cache"):
-        g.formsemestre_validations_cache = {}  # pylint: disable=C0237
+        g.formsemestre_validations_cache = {}
     else:
         if formsemestre.id in g.formsemestre_validations_cache:
             return g.formsemestre_validations_cache[formsemestre.id]
diff --git a/app/scodoc/codes_cursus.py b/app/scodoc/codes_cursus.py
index d214b3502..b11c7b6b6 100644
--- a/app/scodoc/codes_cursus.py
+++ b/app/scodoc/codes_cursus.py
@@ -201,8 +201,8 @@ CODES_SEM_REO = {NAR}  # reorientation
 CODES_JURY_UE = {ADM, CMP, ADJ, ADJR, ADSUP, AJ, ATJ, RAT, DEF, ABAN, DEM, UEBSL}
 CODES_UE_VALIDES_DE_DROIT = {ADM, CMP}  # validation "de droit"
 CODES_UE_VALIDES = CODES_UE_VALIDES_DE_DROIT | {ADJ, ADJR, ADSUP}
-"UE validée"
-CODES_UE_CAPITALISANTS = {ADM}
+"UE validée (attribution des ECTS)"
+CODES_UE_CAPITALISANTS = {ADM}  # XXX non utilisé
 "UE capitalisée"
 
 CODES_JURY_RCUE = {ADM, ADJ, ADSUP, CMP, AJ, ATJ, RAT, DEF, ABAN}
diff --git a/app/scodoc/sco_formsemestre_validation.py b/app/scodoc/sco_formsemestre_validation.py
index 76ce5c29a..26d9e6c16 100644
--- a/app/scodoc/sco_formsemestre_validation.py
+++ b/app/scodoc/sco_formsemestre_validation.py
@@ -367,7 +367,7 @@ def formsemestre_validation_etud_form(
 
     H.append(
         f"""<div class="link_defaillance">Ou <a class="stdlink" href="{
-            url_for("scolar.form_def", scodoc_dept=g.scodoc_dept, etudid=etudid, 
+            url_for("scolar.form_def", scodoc_dept=g.scodoc_dept, etudid=etudid,
                     formsemestre_id=formsemestre_id)
             }">déclarer l'étudiant comme défaillant dans ce semestre</a></div>"""
     )
@@ -683,7 +683,7 @@ def formsemestre_recap_parcours_table(
         # 2eme ligne: notes
         H.append(f"""<tr class="{class_sem} rcp_l2 sem_{sem["formsemestre_id"]}">""")
         H.append(
-            f"""<td class="rcp_type_sem" 
+            f"""<td class="rcp_type_sem"
                 style="background-color:{bgcolor};">&nbsp;</td>"""
         )
         if is_prev:
@@ -808,7 +808,7 @@ def form_decision_manuelle(Se, formsemestre_id, etudid, desturl="", sortcol=None
     return true;
     }
     </script>
-    
+
     <form method="get" action="formsemestre_validation_etud_manu" name="formvalidmanu" id="formvalidmanu" class="sfv_decisions sfv_decisions_manuelles" onsubmit="return check_sfv_form()">
     <input type="hidden" name="etudid" value="%s"/>
     <input type="hidden" name="formsemestre_id" value="%s"/>
@@ -1028,7 +1028,7 @@ def do_formsemestre_validation_auto(formsemestre_id):
     ]
     if conflicts:
         H.append(
-            f"""<p><b>Attention:</b> {len(conflicts)} étudiants non modifiés 
+            f"""<p><b>Attention:</b> {len(conflicts)} étudiants non modifiés
             car décisions différentes déja saisies :
             <ul>"""
         )
@@ -1190,12 +1190,16 @@ def formsemestre_validate_previous_ue(formsemestre: FormSemestre, etud: Identite
 
     <p class="help">Utiliser cette page pour enregistrer des UEs validées antérieurement,
     <em>dans un semestre hors ScoDoc</em>.</p>
-    <p class="expl"><b>Les UE validées dans ScoDoc sont 
-    automatiquement prises en compte</b>. 
+    <p class="expl"><b>Les UE validées dans ScoDoc sont
+    automatiquement prises en compte</b>.
     </p>
     <p>Cette page est surtout utile  pour les étudiants ayant
-    suivi un début de cursus dans <b>un autre établissement</b>, ou qui 
+    suivi un début de cursus dans <b>un autre établissement</b>, ou qui
     ont suivi une UE à l'étranger ou dans un semestre géré <b>sans ScoDoc</b>.
+    </>
+    <p>Il est aussi nécessaire de valider les UEs antérieures en cas de changement
+    de référentiel de compétence en cours de cursus (par exemple si un étudiant redouble et
+    que le programme change de référentiel entre temps).
     </p>
     <p>Pour les semestres précédents gérés avec ScoDoc, passer par la page jury normale.
     </p>
@@ -1277,7 +1281,7 @@ def _get_etud_ue_cap_html(etud: Identite, formsemestre: FormSemestre) -> str:
     H = [
         f"""<div class="sco_box sco_lightgreen_bg ue_list_etud_validations">
         <div class="sco_box_title">Validations d'UEs dans cette formation</div>
-        <div class="help">Liste de toutes les UEs validées par {etud.html_link_fiche()}, 
+        <div class="help">Liste de toutes les UEs validées par {etud.html_link_fiche()},
         sur des semestres ou déclarées comme "antérieures" (externes).
         </div>
         <ul class="liste_validations">"""
@@ -1296,7 +1300,7 @@ def _get_etud_ue_cap_html(etud: Identite, formsemestre: FormSemestre) -> str:
             H.append(
                 f"""
                 <form class="inline-form">
-                    <button 
+                    <button
                     data-v_id="{validation.id}" data-type="validation_ue" data-etudid="{etud.id}"
                     >effacer</button>
                 </form>
diff --git a/app/templates/but/validation_rcues.j2 b/app/templates/but/validation_rcues.j2
index a40194ba4..4c30123ea 100644
--- a/app/templates/but/validation_rcues.j2
+++ b/app/templates/but/validation_rcues.j2
@@ -23,7 +23,7 @@
                 <div class="scoplement">
                     {% if validation %}
                         <div>Validation de {{niv['ue_'+sem].acronyme}}</div>
-                        <div>Jury de {{validation.formsemestre.titre_annee() 
+                        <div>Jury de {{validation.formsemestre.titre_annee()
                             if validation.formsemestre else "-"}}</div>
                         <div>enregistrée le {{
                             validation.event_date.strftime("%d/%m/%Y à %H:%M")
@@ -48,9 +48,9 @@
 <div class="parcour_formation">
 
 <div class="titre_parcours">
-    Validations de {{sco.etud.html_link_fiche()|safe}} 
+    Validations de {{sco.etud.html_link_fiche()|safe}}
     {% if parcour %}
-        parcours {{parcour.code}} « {{parcour.libelle}} » 
+        parcours {{parcour.code}} « {{parcour.libelle}} »
     {% else %}
         non inscrit{{sco.etud.e}} à un parcours de la spécialité
     {% endif %}
@@ -64,7 +64,7 @@
     </div>
     <div class="niveaux">
     {% for annee, niv in comp['niveaux'].items() %}
-        <div class="niveau comp-c{{color_idx}}-{{annee}}" 
+        <div class="niveau comp-c{{color_idx}}-{{annee}}"
             style="--color: var(--col-c{{color_idx}}-{{annee}});">
             <div class="titre_niveau n{{annee}}">
                 <span class="parcs">
@@ -120,10 +120,10 @@
                                 if validation.date else "-"
                             }}
                         </div>
-                        <div>par le jury de {{validation.formsemestre.titre_annee() 
+                        <div>par le jury de {{validation.formsemestre.titre_annee()
                                 if validation.formsemestre else "-"}}
                         </div>
-                    </div>                    
+                    </div>
                 {% endif %}
                 </div>
             </div>
@@ -164,7 +164,7 @@
 </div>
 {% endif %}
 
-<div class="help"> 
+<div class="help">
 
 <p>Cette page montre les validations d'UEs et de niveaux de compétences (RCUEs)
 de {{sco.etud.html_link_fiche()|safe}}
@@ -182,18 +182,26 @@ du référentiel de compétence <a class="stdlink" href="{{
 </p>
 
 <p>Seuls les UEs et niveaux de ce référentiel sont montrés. Si le référentiel a
-changé, enregistrer des validations "antérieures".
+changé, <a class="stdlink" href="{{
+    url_for( 'notes.formsemestre_validate_previous_ue',
+        scodoc_dept=g.scodoc_dept,
+        etudid=sco.etud.id,
+        formsemestre_id=sco.formsemestre.id)
+}}">enregistrer des validations "antérieures"</a>.
 </p>
 
 <p>Le symbole <span class="parc">TC</span> désigne un niveau du tronc commun
-(c'est à dire présent dans tous les parcours de la spécialité). </p> 
+(c'est à dire présent dans tous les parcours de la spécialité). </p>
 
 {% if edit %}
-<p>Les validations sont enregistrées au fur et à mesure.
-Attention, cette page permet une saisie "manuelle", la cohérence des décisions
-n'est pas vérifiée (ni avec les notes, ni avec les décisions d'UEs, ni entre
-années), et les <tt>ADSUP</tt> ne sont pas automatiquement générés. Privilégiez
-lorsque c'est possible la saisie par
+<p>Les validations sont enregistrées au fur et à mesure.</p>
+<p>
+⚠️ Attention, cette page permet une saisie "manuelle", la cohérence des décisions
+n'est pas vérifiée: ni avec les notes, ni avec les décisions d'UEs
+(qu'il vous faudra probablement saisir aussi), ni entre années.
+Les <tt>ADSUP</tt> ne sont pas automatiquement générés.
+<br>
+Privilégiez lorsque c'est possible la saisie par
 <a class="stdlink" href="{{url_for('notes.formsemestre_validation_but',
             scodoc_dept=g.scodoc_dept,
             etudid=sco.etud.id,
@@ -216,7 +224,7 @@ function record_rcue_validation(event, niveau_id) {
         etudid=sco.etud.id
     )
     }}';
-    
+
     fetch(record_url, {
         method: 'POST',
         headers: {
@@ -244,4 +252,4 @@ function record_rcue_validation(event, niveau_id) {
 }
 </script>
 
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/tools/build_release.sh b/tools/build_release.sh
index f182dab4f..c320abd4f 100755
--- a/tools/build_release.sh
+++ b/tools/build_release.sh
@@ -129,7 +129,7 @@ cp -p "$SCODOC_DIR"/tools/etc/scodoc9.service "$slash"/etc/systemd/system/ || di
 
 # Répertoire DEBIAN
 mv "$SCODOC_DIR"/tools/debian "$slash"/DEBIAN || die "can't install DEBIAN dir"
-chmod 755 "$slash"/DEBIAN/*inst || die "can't chmod debian scripts"
+chmod 750 "$slash"/DEBIAN/*inst || die "can't chmod debian scripts"
 
 # ------------ CREATION DU VIRTUALENV
 #echo "Creating python3 virtualenv..."
-- 
GitLab