Page détail validations accessible à tous, plus de détails.

This commit is contained in:
Emmanuel Viennet 2024-07-15 13:45:02 +02:00
parent 137afb21b6
commit 26b59ee547
5 changed files with 119 additions and 61 deletions

View File

@ -10,6 +10,7 @@ Non spécifique au BUT.
""" """
from flask import render_template from flask import render_template
from flask_login import current_user
import sqlalchemy as sa import sqlalchemy as sa
from app.models import ( from app.models import (
@ -21,13 +22,13 @@ from app.models import (
UniteEns, UniteEns,
ValidationDUT120, ValidationDUT120,
) )
from app.scodoc.sco_permissions import Permission
from app.views import ScoData from app.views import ScoData
def jury_delete_manual(etud: Identite): def jury_delete_manual(etud: Identite):
"""Vue (réservée au chef de dept.) """Vue présentant *toutes* les décisions de jury concernant cet étudiant
présentant *toutes* les décisions de jury concernant cet étudiant et permettant (si permission) de les supprimer une à une.
et permettant de les supprimer une à une.
""" """
sem_vals = ScolarFormSemestreValidation.query.filter_by( sem_vals = ScolarFormSemestreValidation.query.filter_by(
etudid=etud.id, ue_id=None etudid=etud.id, ue_id=None
@ -68,4 +69,5 @@ def jury_delete_manual(etud: Identite):
annee_but_vals=annee_but_vals, annee_but_vals=annee_but_vals,
sco=ScoData(), sco=ScoData(),
title=f"Toutes les décisions de jury enregistrées pour {etud.html_link_fiche()}", title=f"Toutes les décisions de jury enregistrées pour {etud.html_link_fiche()}",
read_only=not current_user.has_permission(Permission.EtudInscrit),
) )

View File

@ -302,21 +302,26 @@ def fiche_etud(etudid=None):
}">Visualiser les compétences BUT</a> }">Visualiser les compétences BUT</a>
</span> </span>
""" """
if current_user.has_permission(Permission.EtudInscrit): info["link_inscrire_ailleurs"] = (
info[ f"""<span class="link_bul_pdf"><a class="stdlink" href="{
"link_inscrire_ailleurs"
] = f"""<span class="link_bul_pdf"><a class="stdlink" href="{
url_for("notes.formsemestre_inscription_with_modules_form", url_for("notes.formsemestre_inscription_with_modules_form",
scodoc_dept=g.scodoc_dept, etudid=etudid) scodoc_dept=g.scodoc_dept, etudid=etudid)
}">Inscrire à un autre semestre</a></span> }">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="{ <span class="link_bul_pdf"><a class="stdlink" href="{
url_for("notes.jury_delete_manual", url_for("notes.jury_delete_manual",
scodoc_dept=g.scodoc_dept, etudid=etudid) scodoc_dept=g.scodoc_dept, etudid=etudid,
}">Éditer toutes décisions de jury</a></span> 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[ info[
"link_bilan_ects" "link_bilan_ects"
] = f"""<span class="link_bul_pdf"><a class="stdlink" href="{ ] = f"""<span class="link_bul_pdf"><a class="stdlink" href="{

View File

@ -1,6 +1,7 @@
div.jury_decisions_list div { div.jury_decisions_list>div {
font-size: 120%; font-size: 120%;
font-weight: bold; font-weight: bold;
margin-top: 16px;
} }
span.parcours { span.parcours {
@ -21,3 +22,12 @@ div.ue_list_etud_validations ul li.new_semestre,
div.ue_list_etud_validations ul li:first-child { div.ue_list_etud_validations ul li:first-child {
margin-top: 16px; margin-top: 16px;
} }
details {
margin-left: 16px;
}
div.validation-details {
margin-left: 32px;
margin-bottom: 16px;
}

View File

@ -12,121 +12,160 @@
<p class="help"> <p class="help">
Cette page liste toutes les décisions de jury connus de ScoDoc concernant cet étudiant Cette page liste toutes les décisions de jury connus de ScoDoc concernant cet étudiant
{% if not read_only %}
et permet de les effacer une par une. et permet de les effacer une par une.
{% endif %}
</p> </p>
{% if not read_only %}
<p class="help"> <p class="help">
<b>Attention</b>, il vous appartient de vérifier la cohérence du résultat ! <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>. 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 Aucune annulation n'est ici possible (vous devrez re-saisir les décisions via les
pages de saisie de jury habituelles). pages de saisie de jury habituelles).
</p> </p>
{% endif %}
<div class="scobox">
{% if sem_vals.first() %} {% if sem_vals.first() %}
<div class="jury_decisions_list jury_decisions_sems"> <div class="jury_decisions_list jury_decisions_sems">
<div>Décisions de semestres</div> <div>Décisions de semestres</div>
<ul>
{% for v in sem_vals %} {% for v in sem_vals %}
<li>{{v.html()|safe}} <details>
<form> <summary>{{v.html()|safe}}</summary>
<div class="validation-details">
{% if not read_only %}
<form class="inline-form">
<button <button
data-v_id="{{v.id}}" data-type="validation_formsemestre" data-etudid="{{etud.id}}" data-v_id="{{v.id}}" data-type="validation_formsemestre" data-etudid="{{etud.id}}"
>effacer</button></form> >effacer validation</button></form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if ue_vals.first() %} {% if ue_vals.first() %}
<div class="jury_decisions_list jury_decisions_ues"> <div class="jury_decisions_list jury_decisions_ues">
<div>Décisions d'UEs</div> <div>Décisions d'UEs</div>
<ul>
{% for v in ue_vals %} {% 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"> <form class="inline-form">
<button data-v_id="{{v.id}}" data-type="validation_ue" data-etudid="{{etud.id}}" <button data-v_id="{{v.id}}" data-type="validation_ue" data-etudid="{{etud.id}}"
>effacer</button> >effacer validation d'UE</button>
</form> </form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if rcue_vals.first() %} {% if rcue_vals.first() %}
<div class="jury_decisions_list jury_decisions_rcues"> <div class="jury_decisions_list jury_decisions_rcues">
<div>Décisions de RCUE (niveaux de compétences)</div> <div>Décisions de RCUE (niveaux de compétences)</div>
<ul>
{% for v in rcue_vals %} {% for v in rcue_vals %}
<li>{{v.html()|safe}} <details>
<form> <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}}" <button data-v_id="{{v.id}}" data-type="validation_rcue" data-etudid="{{etud.id}}"
>effacer</button> >effacer validation RCUE</button>
</form> </form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if annee_but_vals.first() %} {% if annee_but_vals.first() %}
<div class="jury_decisions_list jury_decisions_annees_but"> <div class="jury_decisions_list jury_decisions_annees_but">
<div>Décisions d'années BUT</div> <div>Décisions d'années BUT</div>
<ul>
{% for v in annee_but_vals %} {% for v in annee_but_vals %}
<li>{{v.html()|safe}} <details>
<form> <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}}" <button data-v_id="{{v.id}}" data-type="validation_annee_but" data-etudid="{{etud.id}}"
>effacer</button> >effacer décision année</button>
</form> </form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if dut120_vals.count() %} {% if dut120_vals.count() %}
<div class="jury_decisions_list jury_decisions_dut120"> <div class="jury_decisions_list jury_decisions_dut120">
<div>Diplôme de DUT en 120 ECTS (dans un parcours BUT)</div> <div>Diplôme de DUT en 120 ECTS (dans un parcours BUT)</div>
<ul>
{% for v in dut120_vals %} {% for v in dut120_vals %}
<li>{{v.html()|safe}} <details>
<summary>{{v.html()|safe}}</summary>
<div class="validation-details">
{% if not read_only %}
<form> <form>
<button data-v_id="{{v.id}}" data-type="validation_dut120" data-etudid="{{etud.id}}" <button data-v_id="{{v.id}}" data-type="validation_dut120" data-etudid="{{etud.id}}"
>effacer</button> >effacer diplôme DUT120</button>
</form> </form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if autorisations.first() %} {% if autorisations.first() %}
<div class="jury_decisions_list jury_decisions_autorisation_inscription"> <div class="jury_decisions_list jury_decisions_autorisation_inscription">
<div>Autorisations d'inscriptions (passages)</div> <div>Autorisations d'inscriptions (passages)</div>
<ul>
{% for v in autorisations %} {% for v in autorisations %}
<li>{{v.html()|safe}} <details>
<form> <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}}" <button data-v_id="{{v.id}}" data-type="autorisation_inscription" data-etudid="{{etud.id}}"
>effacer</button> >effacer autorisation</button>
</form> </form>
</li> {% endif %}
</div>
</details>
{% endfor %} {% endfor %}
</ul>
</div> </div>
{% endif %} {% endif %}
{% if not( {% if not(
sem_vals.first() or ue_vals.first() or rcue_vals.first() 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> <div>
<p class="fontred">aucune décision enregistrée</p> <p class="fontred">aucune décision enregistrée</p>
</div> </div>
{% endif %} {% endif %}
<div> </div>
<p>retour à la fiche de {{etud.html_link_fiche()|safe}}
<div class="scobox">
<p>Retour à la fiche de {{etud.html_link_fiche()|safe}}
</p> </p>
</div> </div>
@ -136,6 +175,7 @@ pages de saisie de jury habituelles).
{% block scripts %} {% block scripts %}
{{super()}} {{super()}}
{% if not read_only %}
<script> <script>
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const buttons = document.querySelectorAll('.jury_decisions_list button'); const buttons = document.querySelectorAll('.jury_decisions_list button');
@ -165,4 +205,5 @@ document.addEventListener('DOMContentLoaded', () => {
}); });
}); });
</script> </script>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -900,7 +900,7 @@ def erase_decisions_annee_formation(etudid: int, formation_id: int, annee: int):
methods=["GET", "POST"], methods=["GET", "POST"],
) )
@scodoc @scodoc
@permission_required(Permission.EtudInscrit) @permission_required(Permission.ScoView)
def jury_delete_manual(etudid: int): def jury_delete_manual(etudid: int):
"""Efface toute les décisions d'une année pour cet étudiant""" """Efface toute les décisions d'une année pour cet étudiant"""
etud = Identite.get_etud(etudid) etud = Identite.get_etud(etudid)