BUT: Ajout warning si niveau comp. associé à plusieurs UEs

This commit is contained in:
Emmanuel Viennet 2024-08-22 18:07:38 +02:00
parent cb0c9d8f53
commit 17d9b8daa9
3 changed files with 29 additions and 9 deletions

View File

@ -632,17 +632,22 @@ def formation_semestre_niveaux_warning(formation: Formation, semestre_idx: int)
def ue_associee_au_niveau_du_parcours(
ues_possibles: list[UniteEns], niveau: ApcNiveau, sem_name: str = "S"
) -> UniteEns:
"L'UE associée à ce niveau, ou None"
) -> tuple[UniteEns, str]:
"""L'UE associée à ce niveau, ou None.
Renvoie aussi un message d'avertissement en cas d'associations multiples
(en principe un niveau ne doit être associé qu'à une seule UE)
"""
ues = [ue for ue in ues_possibles if ue.niveau_competence_id == niveau.id]
msg = ""
if len(ues) > 1:
msg = f"""{' et '.join(ue.acronyme for ue in ues)} associées au niveau {niveau} / {sem_name}. Utilisez le cas échéant l'item "Déassocier"."""
# plusieurs UEs associées à ce niveau: élimine celles sans parcours
ues_pair_avec_parcours = [ue for ue in ues if ue.parcours]
if ues_pair_avec_parcours:
ues = ues_pair_avec_parcours
ues_avec_parcours = [ue for ue in ues if ue.parcours]
if ues_avec_parcours:
ues = ues_avec_parcours
if len(ues) > 1:
log(f"_niveau_ues: {len(ues)} associées au niveau {niveau} / {sem_name}")
return ues[0] if ues else None
return ues[0] if ues else None, msg
def parcour_formation_competences(
@ -700,6 +705,7 @@ def parcour_formation_competences(
"ue_impair": None,
"ues_pair": [],
"ues_impair": [],
"warning": "",
}
# Toutes les UEs de la formation dans ce parcours ou tronc commun
ues = [
@ -715,10 +721,10 @@ def parcour_formation_competences(
ues_impair_possibles = [ue for ue in ues if ue.semestre_idx == (2 * annee - 1)]
# UE associée au niveau dans ce parcours
ue_pair = ue_associee_au_niveau_du_parcours(
ue_pair, warning_pair = ue_associee_au_niveau_du_parcours(
ues_pair_possibles, niveau, f"S{2*annee}"
)
ue_impair = ue_associee_au_niveau_du_parcours(
ue_impair, warning_impair = ue_associee_au_niveau_du_parcours(
ues_impair_possibles, niveau, f"S{2*annee-1}"
)
@ -736,6 +742,7 @@ def parcour_formation_competences(
for ue in ues_impair_possibles
if (not ue.niveau_competence) or ue.niveau_competence.id == niveau.id
],
"warning": ", ".join(filter(None, [warning_pair, warning_impair])),
}
competences = [

View File

@ -162,25 +162,35 @@ option.non_associe {
div.ue_validation_code {
display: inline-block;
}
div.ue_validation_code div.code {
margin-left: 12px;
}
select.validation_rcue {
color: black;
display: inline-block;
margin-left: 32px;
}
div.recap_ects, div.link_edit {
div.recap_ects,
div.link_edit {
margin-top: 8px;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 16px;
font-weight: bold;
}
div.recap_ects {
background-color: var(--col-c3-2);
padding: 4px;
}
.link_edit a {
padding-right: 48px;
}
.niveau-warning {
font-weight: bold;
}

View File

@ -99,6 +99,9 @@
{% endif %}
</span>
{{niv['niveau'].libelle if niv['niveau'] else ''}}
{% if niv["warning"] %}
<div class="niveau-warning">{{scu.EMO_WARNING|safe}} {{niv["warning"]}}</div>
{% endif %}
</div>
<div class="ue impair u{{annee}}1">
{{ menu_ue(niv, "impair", 2*annee-1) }}