ScoDocMM/app/templates/but/validation_rcues.j2

256 lines
9.6 KiB
Django/Jinja

{% extends "sco_page.j2" %}
{% block styles %}
{{super()}}
<link href="{{scu.STATIC_DIR}}/css/refcomp_parcours_niveaux.css" rel="stylesheet" type="text/css" />
<link href="{{scu.STATIC_DIR}}/css/parcour_formation.css" rel="stylesheet" type="text/css" />
{% endblock %}
{% macro show_ue(niv, sem="pair", sem_idx=0) -%}
{% if niv['niveau'] %}
{# Affiche l'UE et sa décision de jury #}
{% if niv['ue_'+sem] %}
{{ niv['ue_'+sem].acronyme }}
{% set validation = ue_validation_by_niveau.get((niv['niveau'].id, sem)) %}
<div class="ue_validation_code with_scoplement">
<div class="code">
{% if validation %}
<b>{{validation.code}}</b>
{% else %}
-
{% endif %}
</div>
<div class="scoplement">
{% if validation %}
<div>Validation de {{niv['ue_'+sem].acronyme}}</div>
<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")
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 %}
</div>
</div>
{% else %}
<span class="fontred" title="Pas d'UE associée à ce niveau !">{{scu.EMO_WARNING|safe}} non associé</span>
{% endif %}
{% endif %}
{%- endmacro %}
{% block app_content %}
{# Résultats dans le parcours #}
<div class="parcour_formation">
<div class="titre_parcours">
Validations de {{sco.etud.html_link_fiche()|safe}}
{% if parcour %}
parcours {{parcour.code}} « {{parcour.libelle}} »
{% else %}
non inscrit{{sco.etud.e}} à un parcours de la spécialité
{% endif %}
</div>
{% for comp in competences_parcour %}
{% set color_idx = 1 + loop.index0 % 6 %}
<div class="competence comp-c{{color_idx}}">
<div class="titre_competence tc">
Compétence {{comp['competence'].numero}}&nbsp;: {{comp['competence'].titre}}
</div>
<div class="niveaux">
{% for annee, niv in comp['niveaux'].items() %}
<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">
{% if niv['niveau'].is_tronc_commun %}
<span class="parc">TC</span>
{% elif niv['niveau'].parcours|length > 1 %}
<span class="parc">
{% set virg = joiner(", ") %}
{% for p in niv['niveau'].parcours %}
{{ virg() }}{{p.code}}
{% endfor %}
</span>
{% endif %}
</span>
{{niv['niveau'].libelle if niv['niveau'] else ''}}
</div>
<div class="rcue" style="position: relative;">
<div class="rcue_validation_code with_scoplement">
{% set validation = rcue_validation_by_niveau.get(niv['niveau'].id) %}
<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 ''}}"
>
<option value="" disabled {{"selected" if not validation else ""}}>-</option>
{% for code in rcue_codes %}
<option value="{{code}}"
{% if validation and validation.code == code -%}
selected
{%- endif %}
>{{code}}</option>
{% endfor %}
</select>
{% endif %}
{% endif %}
</div>
{% if validation %}
<div class="scoplement">
<div>Validation du RCUE</div>
<div>enregistrée le {{
validation.date.strftime("%d/%m/%Y à %H:%M")
if validation.date else "-"
}}
</div>
<div>par le jury de {{validation.formsemestre.titre_annee()
if validation.formsemestre else "-"}}
</div>
</div>
{% endif %}
</div>
</div>
<div class="ue impair u{{annee}}1" style="position: relative;">
{{ show_ue(niv, "impair", 2*annee-1) }}
</div>
<div class="ue pair u{{annee}}1" style="position: relative;">
{{ show_ue(niv, "pair", 2*annee) }}
</div>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
<div class="recap_ects">
{{"%g"|format(ects_acquis)}} ECTS validés sur {{"%g"|format(ects_parcours)}}.
</div>
{% if sco.formsemestre.can_edit_jury() %}
<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>
{% 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>
{% endif %}
<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 %}
<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}}
dans le
{%if parcour %}
parcours <span class="parc">{{parcour.code}}</span>
{% else %}
tronc commun
{% endif %}
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
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>
{% if edit %}
<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,
formsemestre_id=sco.formsemestre.id)
}}">la page de jury</a>.
</p>
{% endif %}
</div>
<script>
function record_rcue_validation(event, niveau_id) {
let code = event.target.value;
let ue1_id = event.target.dataset.ue1_id;
let ue2_id = event.target.dataset.ue2_id;
const record_url = '{{
url_for(
"apiweb.validation_rcue_record",
scodoc_dept=g.scodoc_dept,
etudid=sco.etud.id
)
}}';
fetch(record_url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify( {
code : code,
ue1_id : ue1_id,
ue2_id : ue2_id,
// Optionnel:
formsemestre_id : {{sco.formsemestre.id}},
parcours_id : {{parcour.id if parcour else "null"}},
} )
})
.then(response => response.json())
.then(data => {
if (data.status) {
sco_message(data.message);
/* revert menu to initial state */
event.target.value = event.target.dataset.code;
} else {
sco_message("code jury enregistré");
}
});
}
</script>
{% endblock %}