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
et permet de les effacer une par une. {% if not read_only %}
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)