Affichage des ECTS sur validation_rcues et parcour_formation. Closes 656.

This commit is contained in:
Emmanuel Viennet 2023-10-19 22:24:56 +02:00
parent 85005419ae
commit 66b8542d56
6 changed files with 53 additions and 23 deletions

View File

@ -461,7 +461,7 @@ def formsemestre_warning_apc_setup(
} }
if niveaux_ids != ues_niveaux_ids: if niveaux_ids != ues_niveaux_ids:
H.append( H.append(
f"""Parcours {parcour.code if parcour else "Tronc commun"} : f"""Parcours {parcour.code if parcour else "Tronc commun"} :
{len(ues_niveaux_ids)} UE avec niveaux {len(ues_niveaux_ids)} UE avec niveaux
mais {len(niveaux_ids)} niveaux à valider ! mais {len(niveaux_ids)} niveaux à valider !
""" """
@ -473,7 +473,7 @@ def formsemestre_warning_apc_setup(
<ul> <ul>
<li>{ '</li><li>'.join(H) }</li> <li>{ '</li><li>'.join(H) }</li>
</ul> </ul>
<p class="help">Vérifiez les parcours cochés pour ce semestre, <p class="help">Vérifiez les parcours cochés pour ce semestre,
et les associations entre UE et niveaux <a class="stdlink" href="{ et les associations entre UE et niveaux <a class="stdlink" href="{
url_for("notes.parcour_formation", scodoc_dept=g.scodoc_dept, formation_id=formsemestre.formation.id) url_for("notes.parcour_formation", scodoc_dept=g.scodoc_dept, formation_id=formsemestre.formation.id)
}">dans la formation.</a> }">dans la formation.</a>
@ -497,7 +497,9 @@ def ue_associee_au_niveau_du_parcours(
return ues[0] if ues else None return ues[0] if ues else None
def parcour_formation_competences(parcour: ApcParcours, formation: Formation) -> list: def parcour_formation_competences(
parcour: ApcParcours, formation: Formation
) -> tuple[list[dict], float]:
""" """
[ [
{ {
@ -514,7 +516,8 @@ def parcour_formation_competences(parcour: ApcParcours, formation: Formation) ->
} }
} }
} }
] ],
ects_parcours (somme des ects des UEs associées)
""" """
refcomp: ApcReferentielCompetences = formation.referentiel_competence refcomp: ApcReferentielCompetences = formation.referentiel_competence
@ -538,7 +541,7 @@ def parcour_formation_competences(parcour: ApcParcours, formation: Formation) ->
if len(niveaux) > 0: if len(niveaux) > 0:
if len(niveaux) > 1: if len(niveaux) > 1:
log( log(
f"""_niveau_ues: plus d'un niveau pour {competence} f"""_niveau_ues: plus d'un niveau pour {competence}
annee {annee} {("parcours " + parcour.code) if parcour else ""}""" annee {annee} {("parcours " + parcour.code) if parcour else ""}"""
) )
niveau = niveaux[0] niveau = niveaux[0]
@ -598,4 +601,17 @@ def parcour_formation_competences(parcour: ApcParcours, formation: Formation) ->
else refcomp.competences.order_by(ApcCompetence.numero) else refcomp.competences.order_by(ApcCompetence.numero)
) )
] ]
return competences ects_parcours = sum(
sum(
(ni["ue_impair"].ects or 0) if ni["ue_impair"] else 0
for ni in cp["niveaux"].values()
)
for cp in competences
) + sum(
sum(
(ni["ue_pair"].ects or 0) if ni["ue_pair"] else 0
for ni in cp["niveaux"].values()
)
for cp in competences
)
return competences, ects_parcours

View File

@ -43,16 +43,20 @@ def validation_rcues(etud: Identite, formsemestre: FormSemestre, edit: bool = Fa
raise ScoNoReferentielCompetences(formation=formation) raise ScoNoReferentielCompetences(formation=formation)
parcour = formsemestre.etuds_inscriptions[etud.id].parcour parcour = formsemestre.etuds_inscriptions[etud.id].parcour
# Si non inscrit à un parcours, prend toutes les compétences # Si non inscrit à un parcours, prend toutes les compétences
competences_parcour = cursus_but.parcour_formation_competences(parcour, formation) competences_parcour, ects_parcours = cursus_but.parcour_formation_competences(
parcour, formation
)
ue_validation_by_niveau = get_ue_validation_by_niveau(refcomp, etud) ue_validation_by_niveau = get_ue_validation_by_niveau(refcomp, etud)
rcue_validation_by_niveau = get_rcue_validation_by_niveau(refcomp, etud) rcue_validation_by_niveau = get_rcue_validation_by_niveau(refcomp, etud)
ects_total = sum((v.ects() for v in ue_validation_by_niveau.values())) ects_acquis = sum((v.ects() for v in ue_validation_by_niveau.values()))
return render_template( return render_template(
"but/validation_rcues.j2", "but/validation_rcues.j2",
competences_parcour=competences_parcour, competences_parcour=competences_parcour,
edit=edit, edit=edit,
ects_total=ects_total, ects_acquis=ects_acquis,
ects_parcours=ects_parcours,
formation=formation, formation=formation,
parcour=parcour, parcour=parcour,
rcue_validation_by_niveau=rcue_validation_by_niveau, rcue_validation_by_niveau=rcue_validation_by_niveau,

View File

@ -171,10 +171,16 @@ select.validation_rcue {
margin-left: 32px; margin-left: 32px;
} }
div.recap_ects, div.link_edit { div.recap_ects, div.link_edit {
margin-top: 8px;
margin-left: 16px; margin-left: 16px;
margin-right: 16px; margin-right: 16px;
margin-bottom: 16px; margin-bottom: 16px;
font-weight: bold;
}
div.recap_ects {
background-color: var(--col-c3-2);
padding: 4px;
} }
.link_edit a { .link_edit a {
padding-right: 48px; padding-right: 48px;
} }

View File

@ -51,19 +51,19 @@
{% for parc in formation.referentiel_competence.parcours %} {% for parc in formation.referentiel_competence.parcours %}
<div class="parc {{'focus' if parcour and parc.id == parcour.id else ''}}"> <div class="parc {{'focus' if parcour and parc.id == parcour.id else ''}}">
<a href="{{ <a href="{{
url_for('notes.parcour_formation', scodoc_dept=g.scodoc_dept, url_for('notes.parcour_formation', scodoc_dept=g.scodoc_dept,
parcour_id=parc.id, formation_id=formation.id ) parcour_id=parc.id, formation_id=formation.id )
}}">{{parc.code}}</a> }}">{{parc.code}}</a>
</div> </div>
{% endfor %} {% endfor %}
<div class="link"> <div class="link">
<a class="stdlink" target="_blank" rel="noopener noreferrer" href="{{ <a class="stdlink" target="_blank" rel="noopener noreferrer" href="{{
url_for('notes.refcomp_show', url_for('notes.refcomp_show',
scodoc_dept=g.scodoc_dept, refcomp_id=formation.referentiel_competence.id ) scodoc_dept=g.scodoc_dept, refcomp_id=formation.referentiel_competence.id )
}}">référentiel de compétences</a> }}">référentiel de compétences</a>
</div> </div>
<div class="link"><a class="stdlink" href="{{ <div class="link"><a class="stdlink" href="{{
url_for('notes.ue_table', url_for('notes.ue_table',
scodoc_dept=g.scodoc_dept, formation_id=formation.id ) scodoc_dept=g.scodoc_dept, formation_id=formation.id )
}}">formation</a> }}">formation</a>
</div> </div>
@ -83,7 +83,7 @@
</div> </div>
<div class="niveaux"> <div class="niveaux">
{% for annee, niv in comp['niveaux'].items() %} {% for annee, niv in comp['niveaux'].items() %}
<div class="niveau comp-c{{color_idx}}-{{annee}}" <div class="niveau comp-c{{color_idx}}-{{annee}}"
style="--color: var(--col-c{{color_idx}}-{{annee}});"> style="--color: var(--col-c{{color_idx}}-{{annee}});">
<div class="titre_niveau n{{annee}}"> <div class="titre_niveau n{{annee}}">
<span class="parcs"> <span class="parcs">
@ -112,6 +112,9 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="recap_ects">
{{"%g"|format(ects_parcours)}} ECTS dans ce parcours.
</div>
{% else %} {% else %}
<div> <div>
Choisissez un parcours... Choisissez un parcours...
@ -120,20 +123,20 @@ Choisissez un parcours...
{% if parcour %} {% if parcour %}
<div class="help"> <div class="help">
<p> Cette page représente le parcours <span class="parc">{{parcour.code}}</span> <p> Cette page représente le parcours <span class="parc">{{parcour.code}}</span>
du référentiel de compétence {{formation.referentiel_competence.specialite}}, et permet du référentiel de compétence {{formation.referentiel_competence.specialite}}, et permet
d'associer à chaque semestre d'un niveau de compétence une UE de la formation d'associer à chaque semestre d'un niveau de compétence une UE de la formation
<a class="stdlink" <a class="stdlink"
href="{{url_for('notes.ue_table', scodoc_dept=g.scodoc_dept, formation_id=formation.id ) href="{{url_for('notes.ue_table', scodoc_dept=g.scodoc_dept, formation_id=formation.id )
}}">{{formation.html()}} }}">{{formation.html()}}
</a>.</p> </a>.</p>
<p>Le symbole <span class="parc">TC</span> désigne un niveau du tronc commun <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> (c'est à dire présent dans tous les parcours de la spécialité). </p>
<p>Ce formulaire ne vérifie pas si l'UE est bien conçue pour ce parcours.</p> <p>Ce formulaire ne vérifie pas si l'UE est bien conçue pour ce parcours.</p>
<p>Les modifications sont enregistrées au fur et à mesure.</p> <p>Les modifications sont enregistrées au fur et à mesure.</p>
@ -186,4 +189,4 @@ function assoc_ue_niveau(event, niveau_id) {
} }
</script> </script>
{% endblock %} {% endblock %}

View File

@ -141,7 +141,7 @@
</div> </div>
<div class="recap_ects"> <div class="recap_ects">
{{"%g"|format(ects_total)}} ECTS validés. {{"%g"|format(ects_acquis)}} ECTS validés sur {{"%g"|format(ects_parcours)}}.
</div> </div>
{% if sco.formsemestre.can_edit_jury() %} {% if sco.formsemestre.can_edit_jury() %}

View File

@ -74,14 +74,15 @@ def parcour_formation(formation_id: int, parcour_id: int = None) -> str:
if parcour is None: if parcour is None:
raise ScoValueError("parcours invalide ou hors référentiel de formation") raise ScoValueError("parcours invalide ou hors référentiel de formation")
competences_parcour = ( competences_parcour, ects_parcours = (
cursus_but.parcour_formation_competences(parcour, formation) cursus_but.parcour_formation_competences(parcour, formation)
if parcour if parcour
else None else (None, 0.0)
) )
return render_template( return render_template(
"but/parcour_formation.j2", "but/parcour_formation.j2",
ects_parcours=ects_parcours,
formation=formation, formation=formation,
parcour=parcour, parcour=parcour,
competences_parcour=competences_parcour, competences_parcour=competences_parcour,