From 26b59ee54792d1156ee8d1559fe74017c6d8b56a Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet <emmanuel.viennet@gmail.com> Date: Mon, 15 Jul 2024 13:45:02 +0200 Subject: [PATCH] =?UTF-8?q?Page=20d=C3=A9tail=20validations=20accessible?= =?UTF-8?q?=20=C3=A0=20tous,=20plus=20de=20d=C3=A9tails.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/but/jury_edit_manual.py | 8 +- app/scodoc/sco_page_etud.py | 21 ++-- app/static/css/jury_delete_manual.css | 12 +- app/templates/jury/jury_delete_manual.j2 | 137 +++++++++++++++-------- app/views/jury_validations.py | 2 +- 5 files changed, 119 insertions(+), 61 deletions(-) diff --git a/app/but/jury_edit_manual.py b/app/but/jury_edit_manual.py index 704376b8..beea5e9b 100644 --- a/app/but/jury_edit_manual.py +++ b/app/but/jury_edit_manual.py @@ -10,6 +10,7 @@ Non spécifique au BUT. """ from flask import render_template +from flask_login import current_user import sqlalchemy as sa from app.models import ( @@ -21,13 +22,13 @@ from app.models import ( UniteEns, ValidationDUT120, ) +from app.scodoc.sco_permissions import Permission from app.views import ScoData def jury_delete_manual(etud: Identite): - """Vue (réservée au chef de dept.) - présentant *toutes* les décisions de jury concernant cet étudiant - et permettant de les supprimer une à une. + """Vue présentant *toutes* les décisions de jury concernant cet étudiant + et permettant (si permission) de les supprimer une à une. """ sem_vals = ScolarFormSemestreValidation.query.filter_by( etudid=etud.id, ue_id=None @@ -68,4 +69,5 @@ def jury_delete_manual(etud: Identite): annee_but_vals=annee_but_vals, sco=ScoData(), title=f"Toutes les décisions de jury enregistrées pour {etud.html_link_fiche()}", + read_only=not current_user.has_permission(Permission.EtudInscrit), ) diff --git a/app/scodoc/sco_page_etud.py b/app/scodoc/sco_page_etud.py index 6c8b08b2..162c0af8 100644 --- a/app/scodoc/sco_page_etud.py +++ b/app/scodoc/sco_page_etud.py @@ -302,21 +302,26 @@ def fiche_etud(etudid=None): }">Visualiser les compétences BUT</a> </span> """ - if current_user.has_permission(Permission.EtudInscrit): - info[ - "link_inscrire_ailleurs" - ] = f"""<span class="link_bul_pdf"><a class="stdlink" href="{ + info["link_inscrire_ailleurs"] = ( + f"""<span class="link_bul_pdf"><a class="stdlink" href="{ url_for("notes.formsemestre_inscription_with_modules_form", scodoc_dept=g.scodoc_dept, etudid=etudid) }">Inscrire à un autre semestre</a></span> + """ + if current_user.has_permission(Permission.EtudInscrit) + else "" + ) + can_edit_jury = current_user.has_permission(Permission.EtudInscrit) + info[ + "link_inscrire_ailleurs" + ] += f""" <span class="link_bul_pdf"><a class="stdlink" href="{ url_for("notes.jury_delete_manual", - scodoc_dept=g.scodoc_dept, etudid=etudid) - }">Éditer toutes décisions de jury</a></span> + scodoc_dept=g.scodoc_dept, etudid=etudid, + read_only=not can_edit_jury) + }">{'Éditer' if can_edit_jury else 'Détail de'} toutes décisions de jury</a></span> """ - else: - info["link_inscrire_ailleurs"] = "" info[ "link_bilan_ects" ] = f"""<span class="link_bul_pdf"><a class="stdlink" href="{ diff --git a/app/static/css/jury_delete_manual.css b/app/static/css/jury_delete_manual.css index 3805c619..478167eb 100644 --- a/app/static/css/jury_delete_manual.css +++ b/app/static/css/jury_delete_manual.css @@ -1,6 +1,7 @@ -div.jury_decisions_list div { +div.jury_decisions_list>div { font-size: 120%; font-weight: bold; + margin-top: 16px; } span.parcours { @@ -20,4 +21,13 @@ div.ue_list_etud_validations div.total_ects { div.ue_list_etud_validations ul li.new_semestre, div.ue_list_etud_validations ul li:first-child { margin-top: 16px; +} + +details { + margin-left: 16px; +} + +div.validation-details { + margin-left: 32px; + margin-bottom: 16px; } \ No newline at end of file diff --git a/app/templates/jury/jury_delete_manual.j2 b/app/templates/jury/jury_delete_manual.j2 index 7eef8072..413d4aee 100644 --- a/app/templates/jury/jury_delete_manual.j2 +++ b/app/templates/jury/jury_delete_manual.j2 @@ -12,121 +12,160 @@ <p class="help"> Cette page liste toutes les décisions de jury connus de ScoDoc concernant cet étudiant -et permet de les effacer une par une. +{% if not read_only %} + et permet de les effacer une par une. +{% endif %} </p> +{% if not read_only %} <p class="help"> <b>Attention</b>, il vous appartient de vérifier la cohérence du résultat ! En principe, <b>l'usage de cette page devrait rester exceptionnel</b>. Aucune annulation n'est ici possible (vous devrez re-saisir les décisions via les pages de saisie de jury habituelles). </p> +{% endif %} + +<div class="scobox"> + {% if sem_vals.first() %} <div class="jury_decisions_list jury_decisions_sems"> <div>Décisions de semestres</div> - <ul> {% for v in sem_vals %} - <li>{{v.html()|safe}} - <form> - <button - data-v_id="{{v.id}}" data-type="validation_formsemestre" data-etudid="{{etud.id}}" - >effacer</button></form> - </li> + <details> + <summary>{{v.html()|safe}}</summary> + <div class="validation-details"> + {% if not read_only %} + <form class="inline-form"> + <button + data-v_id="{{v.id}}" data-type="validation_formsemestre" data-etudid="{{etud.id}}" + >effacer validation</button></form> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if ue_vals.first() %} <div class="jury_decisions_list jury_decisions_ues"> <div>Décisions d'UEs</div> - <ul> {% for v in ue_vals %} - <li>{{v.html(detail=True)|safe}} + <details> + <summary>{{v.html(detail=True)|safe}}</summary> + <div class="validation-details"> + <b>UE {{v.ue.acronyme}}</b> en + <a class="discretelink" href="{{ + url_for('notes.ue_table', scodoc_dept=g.scodoc_dept, + formation_id=v.ue.formation.id, semestre_idx=v.ue.semestre_idx) + }}">{{v.ue.formation.html()|safe}}</a> + {% if v.ue.formation.is_apc() %} + <div>Référentiel : + {{ v.ue.formation.referentiel_competence.get_title() + if v.ue.formation.referentiel_competence else '<em>pas de référentiel</em>' }} + </div> + {% endif %} + {% if not read_only %} <form class="inline-form"> <button data-v_id="{{v.id}}" data-type="validation_ue" data-etudid="{{etud.id}}" - >effacer</button> + >effacer validation d'UE</button> </form> - </li> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if rcue_vals.first() %} <div class="jury_decisions_list jury_decisions_rcues"> <div>Décisions de RCUE (niveaux de compétences)</div> - <ul> {% for v in rcue_vals %} - <li>{{v.html()|safe}} - <form> - <button data-v_id="{{v.id}}" data-type="validation_rcue" data-etudid="{{etud.id}}" - >effacer</button> - </form> - </li> + <details> + <summary>{{v.html()|safe}}</summary> + <div class="validation-details"> + {% if not read_only %} + <form class="inline-form"> + <button data-v_id="{{v.id}}" data-type="validation_rcue" data-etudid="{{etud.id}}" + >effacer validation RCUE</button> + </form> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if annee_but_vals.first() %} <div class="jury_decisions_list jury_decisions_annees_but"> <div>Décisions d'années BUT</div> - <ul> {% for v in annee_but_vals %} - <li>{{v.html()|safe}} - <form> - <button data-v_id="{{v.id}}" data-type="validation_annee_but" data-etudid="{{etud.id}}" - >effacer</button> - </form> - </li> + <details> + <summary>{{v.html()|safe}}</summary> + <div class="validation-details"> + {% if not read_only %} + <form class="inline-form"> + <button data-v_id="{{v.id}}" data-type="validation_annee_but" data-etudid="{{etud.id}}" + >effacer décision année</button> + </form> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if dut120_vals.count() %} <div class="jury_decisions_list jury_decisions_dut120"> <div>Diplôme de DUT en 120 ECTS (dans un parcours BUT)</div> - <ul> {% for v in dut120_vals %} - <li>{{v.html()|safe}} - <form> - <button data-v_id="{{v.id}}" data-type="validation_dut120" data-etudid="{{etud.id}}" - >effacer</button> - </form> - </li> + <details> + <summary>{{v.html()|safe}}</summary> + <div class="validation-details"> + {% if not read_only %} + <form> + <button data-v_id="{{v.id}}" data-type="validation_dut120" data-etudid="{{etud.id}}" + >effacer diplôme DUT120</button> + </form> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if autorisations.first() %} <div class="jury_decisions_list jury_decisions_autorisation_inscription"> <div>Autorisations d'inscriptions (passages)</div> - <ul> + {% for v in autorisations %} - <li>{{v.html()|safe}} - <form> - <button data-v_id="{{v.id}}" data-type="autorisation_inscription" data-etudid="{{etud.id}}" - >effacer</button> + <details> + <summary>{{v.html()|safe}}</summary> + <div class="validation-details"> + {% if not read_only %} + <form class="validation-details"> + <button data-v_id="{{v.id}}" data-type="autorisation_inscription" data-etudid="{{etud.id}}" + >effacer autorisation</button> </form> - </li> + {% endif %} + </div> + </details> {% endfor %} - </ul> </div> {% endif %} {% if not( sem_vals.first() or ue_vals.first() or rcue_vals.first() - or annee_but_vals.first() or autorisations.first()) + or annee_but_vals.first() or autorisations.first() or dut120_vals.first() ) %} <div> <p class="fontred">aucune décision enregistrée</p> </div> {% endif %} -<div> - <p>retour à la fiche de {{etud.html_link_fiche()|safe}} +</div> + +<div class="scobox"> + <p>Retour à la fiche de {{etud.html_link_fiche()|safe}} </p> </div> @@ -136,6 +175,7 @@ pages de saisie de jury habituelles). {% block scripts %} {{super()}} +{% if not read_only %} <script> document.addEventListener('DOMContentLoaded', () => { const buttons = document.querySelectorAll('.jury_decisions_list button'); @@ -165,4 +205,5 @@ document.addEventListener('DOMContentLoaded', () => { }); }); </script> +{% endif %} {% endblock %} diff --git a/app/views/jury_validations.py b/app/views/jury_validations.py index 3da7823c..8b5285ec 100644 --- a/app/views/jury_validations.py +++ b/app/views/jury_validations.py @@ -900,7 +900,7 @@ def erase_decisions_annee_formation(etudid: int, formation_id: int, annee: int): methods=["GET", "POST"], ) @scodoc -@permission_required(Permission.EtudInscrit) +@permission_required(Permission.ScoView) def jury_delete_manual(etudid: int): """Efface toute les décisions d'une année pour cet étudiant""" etud = Identite.get_etud(etudid) -- GitLab