diff --git a/app/api/formations.py b/app/api/formations.py
index 3274cb226..2712a2c28 100644
--- a/app/api/formations.py
+++ b/app/api/formations.py
@@ -321,6 +321,8 @@ def set_ue_parcours(ue_id: int):
]
log(f"set_ue_parcours: ue_id={ue.id} parcours_ids={parcours_ids}")
ok, error_message = ue.set_parcours(parcours)
+ if not ok:
+ return json_error(404, error_message)
return {"status": ok, "message": error_message}
diff --git a/app/models/ues.py b/app/models/ues.py
index e301530bd..96074bdb9 100644
--- a/app/models/ues.py
+++ b/app/models/ues.py
@@ -325,7 +325,8 @@ class UniteEns(db.Model):
if self.niveau_competence_id is not None:
return (
False,
- f"{self.acronyme} déjà associée à un niveau de compétences",
+ f"""{self.acronyme} déjà associée à un niveau de compétences ({
+ self.id}, {self.niveau_competence_id})""",
)
if (
niveau.competence.referentiel.id
@@ -358,6 +359,7 @@ class UniteEns(db.Model):
Si un niveau est déjà associé, vérifie sa cohérence.
Renvoie (True, "") si ok, sinon (False, error_message)
"""
+ msg = ""
# Le niveau est-il dans tous ces parcours ? Sinon, l'enlève
prev_niveau = self.niveau_competence
if (
@@ -366,6 +368,7 @@ class UniteEns(db.Model):
and self.niveau_competence.id not in self._parcours_niveaux_ids(parcours)
):
self.niveau_competence = None
+ msg = " (niveau compétence désassocié !)"
if parcours and self.niveau_competence:
ok, error_message = self.check_niveau_unique_dans_parcours(
@@ -381,12 +384,12 @@ class UniteEns(db.Model):
# Invalidation du cache
self.formation.invalidate_cached_sems()
log(f"ue.set_parcours( {self}, {parcours} )")
- return True, ""
+ return True, "parcours enregistrés" + msg
def add_parcour(self, parcour: ApcParcours) -> tuple[bool, str]:
"""Ajoute ce parcours à ceux de l'UE"""
if parcour.id in {p.id for p in self.parcours}:
- return True, ""
+ return True, "" # déjà présent
if parcour.referentiel.id != self.formation.referentiel_competence.id:
return False, "Le parcours n'appartient pas au référentiel de la formation"
diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py
index fa169c680..88691b9c2 100644
--- a/app/scodoc/sco_formations.py
+++ b/app/scodoc/sco_formations.py
@@ -127,7 +127,7 @@ def formation_export_dict(
ue_dict["apc_niveau_libelle"] = ue.niveau_competence.libelle
ue_dict["apc_niveau_annee"] = ue.niveau_competence.annee
ue_dict["apc_niveau_ordre"] = ue.niveau_competence.ordre
- # Et le parcour:
+ # Et les parcours:
if ue.parcours:
ue_dict["parcours"] = [
parcour.to_dict(with_annees=False) for parcour in ue.parcours
@@ -268,8 +268,8 @@ def _formation_retreive_refcomp(f_dict: dict) -> int:
def _formation_retreive_apc_niveau(
referentiel_competence_id: int, ue_dict: dict
) -> int:
- """Recherche dans le ref. de comp. un niveau pour cette UE
- utilise comme clé (libelle, annee, ordre)
+ """Recherche dans le ref. de comp. un niveau pour cette UE.
+ Utilise (libelle, annee, ordre) comme clé.
"""
libelle = ue_dict.get("apc_niveau_libelle")
annee = ue_dict.get("apc_niveau_annee")
@@ -367,6 +367,8 @@ def formation_import_xml(doc: str, import_tags=True, use_local_refcomp=False):
assert ue
if xml_ue_id:
ues_old2new[xml_ue_id] = ue_id
+ # parcours BUT
+ # TODO XXX
# élément optionnel présent dans les exports BUT:
ue_reference = ue_info[1].get("reference")
if ue_reference:
diff --git a/app/scodoc/sco_preferences.py b/app/scodoc/sco_preferences.py
index 6340d6e8b..b4acf3bdd 100644
--- a/app/scodoc/sco_preferences.py
+++ b/app/scodoc/sco_preferences.py
@@ -111,9 +111,7 @@ get_base_preferences(formsemestre_id)
"""
import flask
-from flask import flash, g, request
-
-# from flask_login import current_user
+from flask import current_app, flash, g, request, url_for
from app.models import Departement
from app.scodoc import sco_cache
@@ -2234,7 +2232,6 @@ class SemPreferences:
raise ScoValueError(
"sem_preferences.edit doit etre appele sur un semestre !"
) # a bug !
- sem = sco_formsemestre.get_formsemestre(self.formsemestre_id)
H = [
html_sco_header.html_sem_header(
"Préférences du semestre",
diff --git a/app/templates/but/parcour_formation.j2 b/app/templates/but/parcour_formation.j2
index e46bba2a7..496448ddf 100644
--- a/app/templates/but/parcour_formation.j2
+++ b/app/templates/but/parcour_formation.j2
@@ -2,8 +2,8 @@
{% block styles %}
{{super()}}
-
-
+
+
{% endblock %}
{% macro menu_ue(niv, sem="pair", sem_idx=0) -%}
@@ -37,7 +37,7 @@
{% if niv['ue_'+sem] %}
{{ niv['ue_'+sem].acronyme }}
{% else %}
- {{sco.scu.EMO_WARNING|safe}} non associé
+ {{scu.EMO_WARNING|safe}} non associé
{% endif %}
{% endif %}
{% endif %}
diff --git a/app/templates/formsemestre_header.j2 b/app/templates/formsemestre_header.j2
index a76858232..20822079a 100644
--- a/app/templates/formsemestre_header.j2
+++ b/app/templates/formsemestre_header.j2
@@ -14,23 +14,23 @@
{% if sco.sem.modalite %} en {{sco.sem.modalite}}{% endif %}
{{sco.scu.MONTH_NAMES_ABBREV[ sco.sem.date_debut.month - 1]}}
- {{sco.sem.date_debut.year}} - {{sco.scu.MONTH_NAMES_ABBREV[sco.sem.date_fin.month - 1]}}
+ au {{sco.sem.date_fin.strftime('%d/%m/%Y')}} ">{{scu.MONTH_NAMES_ABBREV[ sco.sem.date_debut.month - 1]}}
+ {{sco.sem.date_debut.year}} - {{scu.MONTH_NAMES_ABBREV[sco.sem.date_fin.month - 1]}}
{{sco.sem.date_fin.year}}
{{sco.sem.responsables_str()}}
{{sco.sem.inscriptions|length}} inscrits{% if
not sco.sem.etat %}{{sco.scu.icontag("lock_img", border="0", title="Semestre
+ formsemestre_id=sco.sem.id)}}">{{scu.icontag("lock_img", border="0", title="Semestre
verrouillé")|safe}}{% endif %}
{% if sco.prefs["bul_display_publication"] %}
{% if sco.sem.bul_hide_xml %}
- {{ sco.scu.icontag("hide_img", border="0", title="Bulletins NON publiés")|safe}}
+ {{ scu.icontag("hide_img", border="0", title="Bulletins NON publiés")|safe}}
{% else %}
- {{ sco.scu.icontag("eye_img", border="0", title="Bulletins publiés")|safe }}
+ {{ scu.icontag("eye_img", border="0", title="Bulletins publiés")|safe }}
{% endif %}
{% endif %}
diff --git a/sco_version.py b/sco_version.py
index eed783211..e43776aa8 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
-SCOVERSION = "9.4.71"
+SCOVERSION = "9.4.74"
SCONAME = "ScoDoc"