diff --git a/app/models/formations.py b/app/models/formations.py
index e2eadf4609..39ad45083b 100644
--- a/app/models/formations.py
+++ b/app/models/formations.py
@@ -63,7 +63,7 @@ class Formation(db.Model):
"titre complet pour affichage"
return f"""Formation {self.titre} ({self.acronyme}) [version {self.version}] code {self.formation_code}"""
- def to_dict(self, with_refcomp_attrs=False):
+ def to_dict(self, with_refcomp_attrs=False, with_departement=True):
"""As a dict.
Si with_refcomp_attrs, ajoute attributs permettant de retrouver le ref. de comp.
"""
@@ -73,7 +73,8 @@ class Formation(db.Model):
e.pop("referentiel_competence")
e["code_specialite"] = e["code_specialite"] or ""
e["commentaire"] = e["commentaire"] or ""
- e["departement"] = self.departement.to_dict()
+ if with_departement and self.departement:
+ e["departement"] = self.departement.to_dict()
e["formation_id"] = self.id # ScoDoc7 backward compat
if with_refcomp_attrs and self.referentiel_competence:
e["refcomp_version_orebut"] = self.referentiel_competence.version_orebut
diff --git a/app/scodoc/sco_edit_formation.py b/app/scodoc/sco_edit_formation.py
index 6209a2be44..11c31436c0 100644
--- a/app/scodoc/sco_edit_formation.py
+++ b/app/scodoc/sco_edit_formation.py
@@ -30,6 +30,7 @@
"""
import flask
from flask import g, url_for, request
+import sqlalchemy
from app import db
from app import log
@@ -167,7 +168,9 @@ def formation_edit(formation_id=None, create=False):
submitlabel = "Modifier les valeurs"
H = [
html_sco_header.sco_header(page_title="Modification d'une formation"),
- """
Modification de la formation %(acronyme)s
""" % initvalues,
+ f"""Modification de la formation {formation.acronyme}
+ version {formation.version}
+
""",
]
if is_locked:
H.append(
@@ -260,15 +263,17 @@ def formation_edit(formation_id=None, create=False):
"acronyme": tf[2]["acronyme"],
"titre": tf[2]["titre"],
"version": version,
+ "dept_id": g.scodoc_dept_id,
}
- ndb.quote_dict(args)
- others = sco_formations.formation_list(args=args)
- if others and ((len(others) > 1) or others[0]["formation_id"] != formation_id):
+ other_formations: list[Formation] = Formation.query.filter_by(**args).all()
+ if other_formations and (
+ (len(other_formations) > 1) or other_formations[0].id != formation_id
+ ):
return (
"\n".join(H)
+ tf_error_message(
f"""Valeurs incorrectes: il existe déjà une formation avec même titre,
acronyme et version.
"""
@@ -328,11 +333,24 @@ def do_formation_edit(args):
del args["type_parcours"]
for field in formation.__dict__:
- if field and field[0] != "_" and field in args:
- setattr(formation, field, args[field])
+ if field in args:
+ value = args[field].strip() if isinstance(args[field], str) else args[field]
+ if field and field[0] != "_":
+ setattr(formation, field, value)
db.session.add(formation)
- db.session.commit()
+ try:
+ db.session.commit()
+ except sqlalchemy.exc.IntegrityError as exc:
+ db.session.rollback()
+ raise ScoValueError(
+ "On ne peut pas créer deux formations avec mêmes acronymes, titres et versions !",
+ dest_url=url_for(
+ "notes.formation_edit",
+ scodoc_dept=g.scodoc_dept,
+ formation_id=formation.id,
+ ),
+ ) from exc
formation.invalidate_cached_sems()
diff --git a/app/scodoc/sco_formations.py b/app/scodoc/sco_formations.py
index a109cf5e9f..b9a44d3a36 100644
--- a/app/scodoc/sco_formations.py
+++ b/app/scodoc/sco_formations.py
@@ -52,7 +52,6 @@ from app.scodoc import codes_cursus
from app.scodoc import sco_edit_matiere
from app.scodoc import sco_edit_module
from app.scodoc import sco_edit_ue
-from app.scodoc import sco_formations
from app.scodoc import sco_formsemestre
from app.scodoc import sco_preferences
from app.scodoc import sco_tag_module
@@ -93,7 +92,6 @@ def formation_list(formation_id=None, args={}): ### XXX obsolete, à supprimer
args = {"formation_id": formation_id}
cnx = ndb.GetDBConnexion()
r = _formationEditor.list(cnx, args=args)
- # log('%d formations found' % len(r))
return r