2022-04-29 08:17:04 +02:00
|
|
|
##############################################################################
|
|
|
|
# ScoDoc
|
2023-12-31 23:04:06 +01:00
|
|
|
# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved.
|
2022-04-29 08:17:04 +02:00
|
|
|
# See LICENSE
|
|
|
|
##############################################################################
|
|
|
|
|
|
|
|
"""
|
|
|
|
Edition associations UE <-> Ref. Compétence
|
|
|
|
"""
|
2023-04-11 13:48:57 +02:00
|
|
|
from flask import g, url_for
|
|
|
|
|
2023-03-30 00:00:14 +02:00
|
|
|
from app.models import ApcReferentielCompetences, UniteEns
|
2023-02-12 13:36:47 +01:00
|
|
|
from app.scodoc import codes_cursus
|
2022-04-29 08:17:04 +02:00
|
|
|
|
|
|
|
|
2023-04-11 23:56:50 +02:00
|
|
|
def form_ue_choix_parcours(ue: UniteEns) -> str:
|
|
|
|
"""Form. HTML pour associer une UE à ses parcours.
|
2023-03-30 00:00:14 +02:00
|
|
|
Le menu select lui même est vide et rempli en JS par appel à get_ue_niveaux_options_html
|
2022-10-30 16:07:06 +01:00
|
|
|
"""
|
2023-02-12 13:36:47 +01:00
|
|
|
if ue.type != codes_cursus.UE_STANDARD:
|
2022-06-23 15:33:01 +02:00
|
|
|
return ""
|
2022-04-29 08:17:04 +02:00
|
|
|
ref_comp = ue.formation.referentiel_competence
|
|
|
|
if ref_comp is None:
|
2024-03-31 10:21:44 +02:00
|
|
|
return f"""<div class="scobox ue_advanced">
|
2022-05-22 03:26:39 +02:00
|
|
|
<div class="warning">Pas de référentiel de compétence associé à cette formation !</div>
|
2023-12-31 23:04:06 +01:00
|
|
|
<div><a class="stdlink" href="{ url_for('notes.refcomp_assoc_formation',
|
2022-05-22 03:26:39 +02:00
|
|
|
scodoc_dept=g.scodoc_dept, formation_id=ue.formation.id)
|
|
|
|
}">associer un référentiel de compétence</a>
|
|
|
|
</div>
|
|
|
|
</div>"""
|
2022-10-30 16:07:06 +01:00
|
|
|
|
2023-04-11 23:56:50 +02:00
|
|
|
H = [
|
|
|
|
"""
|
2024-03-31 10:21:44 +02:00
|
|
|
<div class="scobox ue_advanced">
|
|
|
|
<div class="scobox-title">Parcours du BUT</div>
|
2023-04-11 23:56:50 +02:00
|
|
|
"""
|
|
|
|
]
|
|
|
|
# Choix des parcours
|
|
|
|
ue_pids = [p.id for p in ue.parcours]
|
2024-04-12 01:10:42 +02:00
|
|
|
H.append(
|
|
|
|
"""
|
|
|
|
<div class="help">
|
|
|
|
Cocher tous les parcours dans lesquels cette UE est utilisée,
|
|
|
|
même si vous n'offrez pas ce parcours dans votre département.
|
|
|
|
Sans quoi, les UEs de Tronc Commun ne seront pas reconnues.
|
|
|
|
Ne cocher aucun parcours est équivalent à tous les cocher.
|
|
|
|
</div>
|
|
|
|
<form id="choix_parcours" style="margin-top: 12px;">
|
|
|
|
"""
|
|
|
|
)
|
2023-05-14 17:35:06 +02:00
|
|
|
|
|
|
|
ects_differents = {
|
|
|
|
ue.get_ects(parcour, only_parcours=True) for parcour in ref_comp.parcours
|
|
|
|
} != {None}
|
2023-04-11 23:56:50 +02:00
|
|
|
for parcour in ref_comp.parcours:
|
2023-05-14 17:35:06 +02:00
|
|
|
ects_parcour_txt = (
|
|
|
|
f" ({ue.get_ects(parcour):.3g} ects)" if ects_differents else ""
|
|
|
|
)
|
2023-04-11 23:56:50 +02:00
|
|
|
H.append(
|
2023-12-31 23:04:06 +01:00
|
|
|
f"""<label><input type="checkbox" name="{parcour.id}" value="{parcour.id}"
|
2023-04-11 23:56:50 +02:00
|
|
|
{'checked' if parcour.id in ue_pids else ""}
|
|
|
|
onclick="set_ue_parcour(this);"
|
2024-07-17 14:58:49 +02:00
|
|
|
data-setter="{url_for("apiweb.ue_set_parcours",
|
2023-05-14 17:35:06 +02:00
|
|
|
scodoc_dept=g.scodoc_dept, ue_id=ue.id)}"
|
|
|
|
>{parcour.code}{ects_parcour_txt}</label>"""
|
2023-04-11 23:56:50 +02:00
|
|
|
)
|
|
|
|
H.append("""</form>""")
|
|
|
|
#
|
|
|
|
H.append(
|
|
|
|
f"""
|
2023-04-11 13:48:57 +02:00
|
|
|
<ul>
|
|
|
|
<li>
|
|
|
|
<a class="stdlink" href="{
|
2023-12-31 23:04:06 +01:00
|
|
|
url_for("notes.ue_parcours_ects",
|
2023-04-11 13:48:57 +02:00
|
|
|
scodoc_dept=g.scodoc_dept, ue_id=ue.id)
|
|
|
|
}">définir des ECTS différents dans chaque parcours</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
2023-04-03 17:46:31 +02:00
|
|
|
</div>
|
|
|
|
"""
|
2023-04-11 23:56:50 +02:00
|
|
|
)
|
|
|
|
return "\n".join(H)
|
2023-04-03 17:46:31 +02:00
|
|
|
|
|
|
|
|
2022-10-30 16:07:06 +01:00
|
|
|
def get_ue_niveaux_options_html(ue: UniteEns) -> str:
|
|
|
|
"""fragment html avec les options du menu de sélection du
|
|
|
|
niveau de compétences associé à une UE.
|
|
|
|
|
|
|
|
Si l'UE n'a pas de parcours associé: présente les niveaux
|
|
|
|
de tous les parcours.
|
|
|
|
Si l'UE a un parcours: seulement les niveaux de ce parcours.
|
|
|
|
"""
|
|
|
|
ref_comp: ApcReferentielCompetences = ue.formation.referentiel_competence
|
|
|
|
if ref_comp is None:
|
|
|
|
return ""
|
|
|
|
# Les niveaux:
|
|
|
|
annee = ue.annee() # 1, 2, 3
|
2023-04-03 17:46:31 +02:00
|
|
|
parcours, niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(annee, ue.parcours)
|
2022-04-29 08:17:04 +02:00
|
|
|
|
2022-06-23 15:04:08 +02:00
|
|
|
# Les niveaux déjà associés à d'autres UE du même semestre
|
2022-10-30 16:07:06 +01:00
|
|
|
autres_ues = ue.formation.ues.filter_by(semestre_idx=ue.semestre_idx)
|
2022-06-23 15:04:08 +02:00
|
|
|
niveaux_autres_ues = {
|
|
|
|
oue.niveau_competence_id for oue in autres_ues if oue.id != ue.id
|
|
|
|
}
|
2022-04-29 08:17:04 +02:00
|
|
|
options = []
|
2022-06-23 15:04:08 +02:00
|
|
|
if niveaux_by_parcours["TC"]: # TC pour Tronc Commun
|
2022-04-29 08:17:04 +02:00
|
|
|
options.append("""<optgroup label="Tronc commun">""")
|
|
|
|
for n in niveaux_by_parcours["TC"]:
|
|
|
|
options.append(
|
2022-10-30 16:07:06 +01:00
|
|
|
f"""<option value="{n.id}" {
|
|
|
|
'selected' if ue.niveau_competence == n else ''}
|
2023-03-30 00:00:14 +02:00
|
|
|
>{n.annee} {n.competence.titre} / {n.competence.titre_long}
|
2022-06-23 15:04:08 +02:00
|
|
|
niveau {n.ordre}</option>"""
|
2022-04-29 08:17:04 +02:00
|
|
|
)
|
|
|
|
options.append("""</optgroup>""")
|
2022-10-30 16:07:06 +01:00
|
|
|
for parcour in parcours:
|
2022-04-29 08:17:04 +02:00
|
|
|
if len(niveaux_by_parcours[parcour.id]):
|
|
|
|
options.append(f"""<optgroup label="Parcours {parcour.libelle}">""")
|
|
|
|
for n in niveaux_by_parcours[parcour.id]:
|
2022-06-23 15:04:08 +02:00
|
|
|
if n.id in niveaux_autres_ues:
|
|
|
|
disabled = "disabled"
|
|
|
|
else:
|
|
|
|
disabled = ""
|
2022-04-29 08:17:04 +02:00
|
|
|
options.append(
|
2022-06-23 15:04:08 +02:00
|
|
|
f"""<option value="{n.id}" {'selected'
|
|
|
|
if ue.niveau_competence == n else ''}
|
2023-03-30 00:00:14 +02:00
|
|
|
{disabled}>{n.annee} {n.competence.titre} / {n.competence.titre_long}
|
2022-06-23 15:04:08 +02:00
|
|
|
niveau {n.ordre}</option>"""
|
2022-04-29 08:17:04 +02:00
|
|
|
)
|
|
|
|
options.append("""</optgroup>""")
|
2022-10-30 16:07:06 +01:00
|
|
|
return (
|
|
|
|
f"""<option value="" {'selected' if ue.niveau_competence is None else ''}>aucun</option>"""
|
|
|
|
+ "\n".join(options)
|
|
|
|
)
|