From 8614a29f9b1274874b00d6e8ac07f346f122b6fd Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Mon, 17 Jul 2023 10:37:12 +0200
Subject: [PATCH] =?UTF-8?q?validation=5Frcues:=20affiche=20ECTS=20et=20am?=
 =?UTF-8?q?=C3=A9liore=20menu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/but/validations_view.py           |  2 +
 app/models/validations.py             |  9 +++
 app/static/css/parcour_formation.css  |  8 +++
 app/templates/but/validation_rcues.j2 | 81 ++++++++++++++++-----------
 sco_version.py                        |  2 +-
 5 files changed, 68 insertions(+), 34 deletions(-)

diff --git a/app/but/validations_view.py b/app/but/validations_view.py
index 94ffb2f4e..344214a59 100644
--- a/app/but/validations_view.py
+++ b/app/but/validations_view.py
@@ -47,10 +47,12 @@ def validation_rcues(etud: Identite, formsemestre: FormSemestre, edit: bool = Fa
 
     ue_validation_by_niveau = get_ue_validation_by_niveau(refcomp, etud)
     rcue_validation_by_niveau = get_rcue_validation_by_niveau(refcomp, etud)
+    ects_total = sum((v.ects() for v in ue_validation_by_niveau.values()))
     return render_template(
         "but/validation_rcues.j2",
         competences_parcour=competences_parcour,
         edit=edit,
+        ects_total=ects_total,
         formation=formation,
         parcour=parcour,
         rcue_validation_by_niveau=rcue_validation_by_niveau,
diff --git a/app/models/validations.py b/app/models/validations.py
index d4ca5bb07..14e7a5b7a 100644
--- a/app/models/validations.py
+++ b/app/models/validations.py
@@ -10,6 +10,7 @@ from app.models import CODE_STR_LEN
 from app.models.events import Scolog
 from app.scodoc import sco_cache
 from app.scodoc import sco_utils as scu
+from app.scodoc.codes_cursus import CODES_UE_VALIDES
 
 
 class ScolarFormSemestreValidation(db.Model):
@@ -122,6 +123,14 @@ class ScolarFormSemestreValidation(db.Model):
                 le {self.event_date.strftime("%d/%m/%Y")} à {self.event_date.strftime("%Hh%M")}
             """
 
+    def ects(self) -> float:
+        "Les ECTS acquis par cette validation. (0 si ce n'est pas une validation d'UE)"
+        return (
+            self.ue.ects
+            if (self.ue is not None) and (self.code in CODES_UE_VALIDES)
+            else 0.0
+        )
+
 
 class ScolarAutorisationInscription(db.Model):
     """Autorisation d'inscription dans un semestre"""
diff --git a/app/static/css/parcour_formation.css b/app/static/css/parcour_formation.css
index a08bdac8a..72efae4eb 100644
--- a/app/static/css/parcour_formation.css
+++ b/app/static/css/parcour_formation.css
@@ -169,3 +169,11 @@ select.validation_rcue {
     display: inline-block;
     margin-left: 32px;
 }
+div.recap_ects, div.link_edit {
+    margin-left: 16px;
+    margin-right: 16px;
+    margin-bottom: 16px;
+}
+.link_edit a {
+    padding-right: 48px;
+}
\ No newline at end of file
diff --git a/app/templates/but/validation_rcues.j2 b/app/templates/but/validation_rcues.j2
index ebb556738..4e4f6a829 100644
--- a/app/templates/but/validation_rcues.j2
+++ b/app/templates/but/validation_rcues.j2
@@ -29,6 +29,7 @@
                             validation.event_date.strftime("%d/%m/%Y à %H:%M")
                             if validation.event_date else "-"
                         }}</div>
+                        <div>{{"%g"|format(validation.ects())}} ECTS</div>
                     {% else %}
                         pas de décision de jury enregistrée pour cette UE
                     {% endif %}
@@ -83,33 +84,34 @@
             <div class="rcue" style="position: relative;">
                 <div class="rcue_validation_code with_scoplement">
                 {% set validation = rcue_validation_by_niveau.get(niv['niveau'].id) %}
-                {% if validation %}
-                    <div>
-                        RCUE enregistré <b>{{validation.code}}</b>
-                        {% if niv['niveau'] and edit %}
-                            {% if not (niv['ue_pair'] and niv['ue_impair']) %}
-                            <span title="UEs manquantes">⛔</span>
-                            {% else %}
-                            <select class="validation_rcue" name="ue_niv_{{niv['niveau'].id}}" id="ue_niv_{{niv['niveau'].id}}"
-                                onchange="record_rcue_validation(event,
-                                            {{niv['niveau'].id}},
-                                        );"
-                                
-                                data-ue1_id="{{niv['ue_impair'].id}}"
-                                data-ue2_id="{{niv['ue_pair'].id}}"
-                                data-code="{{validation.code if validation else ''}}"
-                            >
-                            {% for code in rcue_codes %}
-                                <option value="{{code}}"
-                                    {% if validation and validation.code == code -%}
-                                    selected
-                                    {%- endif %}
-                                >{{code}}</option>
-                            {% endfor %}
-                            </select>
-                            {% endif %}
+                <div>
+                    {% if validation or niv['niveau'] %}
+                        RCUE : <b>{{validation.code if validation else ""}}</b>
+                    {% endif %}
+                    {% if niv['niveau'] and edit %}
+                        {% if not (niv['ue_pair'] and niv['ue_impair']) %}
+                        <span title="UEs manquantes">⛔</span>
+                        {% else %}
+                        <select class="validation_rcue" name="ue_niv_{{niv['niveau'].id}}" id="ue_niv_{{niv['niveau'].id}}"
+                            onchange="record_rcue_validation(event,
+                                        {{niv['niveau'].id}},
+                                    );"
+                            data-ue1_id="{{niv['ue_impair'].id}}"
+                            data-ue2_id="{{niv['ue_pair'].id}}"
+                            data-code="{{validation.code if validation else ''}}"
+                        >
+                        {% for code in rcue_codes %}
+                            <option value="{{code}}"
+                                {% if validation and validation.code == code -%}
+                                selected
+                                {%- endif %}
+                            >{{code}}</option>
+                        {% endfor %}
+                        </select>
                         {% endif %}
-                    </div>
+                    {% endif %}
+                </div>
+                {% if validation %}
                     <div class="scoplement">
                         <div>Validation du RCUE</div>
                         <div>enregistrée le {{
@@ -137,18 +139,27 @@
 {% endfor %}
 </div>
 
+<div class="recap_ects">
+{{"%g"|format(ects_total)}} ECTS validés.
+</div>
+
 {% if sco.formsemestre.can_edit_jury() %}
-<div style="padding-bottom: 16px;">
+<div class="link_edit">
     {% if edit %}
         <a class="stdlink" href="{{url_for('notes.validation_rcues',
-            scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id, etudid=sco.etud.id
-        )}}">quitter le mode édition des RCUEs</a>
+            scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id, etudid=sco.etud.id)
+        }}">Quitter le mode édition des RCUEs</a>
     {% else %}
         <a class="stdlink" href="{{url_for('notes.validation_rcues_edit',
-            scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id, etudid=sco.etud.id
-        )}}">éditer les décisions d'RCUE antérieurs</a>
+            scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id, etudid=sco.etud.id)
+        }}">Éditer les décisions d'RCUE antérieurs</a>
     {% endif %}
-    </a>
+
+    <a class="stdlink" href="{{url_for('notes.formsemestre_validation_but',
+            scodoc_dept=g.scodoc_dept,
+            etudid=sco.etud.id,
+            formsemestre_id=sco.formsemestre.id)
+    }}">Page saisie jury</a>
 </div>
 {% endif %}
 
@@ -162,7 +173,11 @@ parcours <span class="parc">{{parcour.code}}</span>
 {% else %}
 tronc commun
 {% endif %}
-du référentiel de compétence {{formation.referentiel_competence.specialite}}
+du référentiel de compétence <a class="stdlink" href="{{
+    url_for('notes.refcomp_show',
+        scodoc_dept=g.scodoc_dept, refcomp_id=formation.referentiel_competence.id
+    )}}">{{formation.referentiel_competence.specialite}}
+(version {{formation.referentiel_competence.version_orebut}})</a>.
 </p>
 
 <p>Seuls les UEs et niveaux de ce référentiel sont montrés. Si le référentiel a
diff --git a/sco_version.py b/sco_version.py
index f21ff590c..82546ebf4 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -1,7 +1,7 @@
 # -*- mode: python -*-
 # -*- coding: utf-8 -*-
 
-SCOVERSION = "9.5.4"
+SCOVERSION = "9.5.5"
 
 SCONAME = "ScoDoc"
 
-- 
GitLab