{% 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(scu.DATEATIME_FMT) 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}} : {{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(scu.DATEATIME_FMT) 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 %}