diff --git a/app/scodoc/sco_edit_module.py b/app/scodoc/sco_edit_module.py
index 68166788e0..f99bb8a186 100644
--- a/app/scodoc/sco_edit_module.py
+++ b/app/scodoc/sco_edit_module.py
@@ -33,7 +33,7 @@ from flask import url_for, render_template
from flask import g, request
from flask_login import current_user
-from app import log
+from app import db, log
from app import models
from app.models import APO_CODE_STR_LEN
from app.models import Formation, Matiere, Module, UniteEns
@@ -421,7 +421,7 @@ def module_delete(module_id=None):
H = [
html_sco_header.sco_header(page_title="Suppression d'un module"),
- f"""
Suppression du module {module.titre} ({module.code})
""",
+ f"""Suppression du module {module.titre or "sans titre"} ({module.code})
""",
]
dest_url = url_for(
@@ -848,21 +848,13 @@ def module_count_moduleimpls(module_id):
def formation_add_malus_modules(formation_id, titre=None, redirect=True):
"""Création d'un module de "malus" dans chaque UE d'une formation"""
- from app.scodoc import sco_edit_ue
- ues = sco_edit_ue.ue_list(args={"formation_id": formation_id})
+ formation = Formation.query.get_or_404(formation_id)
- for ue in ues:
- # Un seul module de malus par UE:
- nb_mod_malus = len(
- [
- mod
- for mod in module_list(args={"ue_id": ue["ue_id"]})
- if mod["module_type"] == scu.ModuleType.MALUS
- ]
- )
- if nb_mod_malus == 0:
- ue_add_malus_module(ue["ue_id"], titre=titre)
+ for ue in formation.ues:
+ ue_add_malus_module(ue, titre=titre)
+
+ formation.invalidate_cached_sems()
if redirect:
return flask.redirect(
@@ -872,46 +864,58 @@ def formation_add_malus_modules(formation_id, titre=None, redirect=True):
)
-def ue_add_malus_module(ue_id, titre=None, code=None):
- """Add a malus module in this ue"""
- from app.scodoc import sco_edit_ue
+def ue_add_malus_module(ue: UniteEns, titre=None, code=None) -> int:
+ """Add a malus module in this ue.
+ If already exists, do nothing.
+ Returns id of malus module.
+ """
+ modules_malus = [m for m in ue.modules if m.module_type == scu.ModuleType.MALUS]
+ if len(modules_malus) > 0:
+ return modules_malus[0].id # déjà existant
- ue = sco_edit_ue.ue_list(args={"ue_id": ue_id})[0]
-
- if titre is None:
- titre = ""
- if code is None:
- code = "MALUS%d" % ue["numero"]
+ titre = titre or ""
+ code = code or f"MALUS{ue.numero}"
# Tout module doit avoir un semestre_id (indice 1, 2, ...)
- semestre_ids = sco_edit_ue.ue_list_semestre_ids(ue)
- if semestre_ids:
- semestre_id = semestre_ids[0]
+ if ue.semestre_idx is None:
+ semestre_ids = sorted(list(set([m.semestre_id for m in ue.modules])))
+ if len(semestre_ids) > 0:
+ semestre_id = semestre_ids[0]
+ else:
+ # c'est ennuyeux: dans ce cas, on pourrait demander à indiquer explicitement
+ # le semestre ? ou affecter le malus au semestre 1 ???
+ raise ScoValueError(
+ "Impossible d'ajouter un malus s'il n'y a pas d'autres modules"
+ )
else:
- # c'est ennuyeux: dans ce cas, on pourrait demander à indiquer explicitement
- # le semestre ? ou affecter le malus au semestre 1 ???
- raise ScoValueError(
- "Impossible d'ajouter un malus s'il n'y a pas d'autres modules"
- )
+ semestre_id = ue.semestre_idx
# Matiere pour placer le module malus
- Matlist = sco_edit_matiere.matiere_list(args={"ue_id": ue_id})
- numero = max([mat["numero"] for mat in Matlist]) + 10
- matiere_id = sco_edit_matiere.do_matiere_create(
- {"ue_id": ue_id, "titre": "Malus", "numero": numero}
- )
+ titre_matiere_malus = "Malus"
- module_id = do_module_create(
- {
- "titre": titre,
- "code": code,
- "coefficient": 0.0, # unused
- "ue_id": ue_id,
- "matiere_id": matiere_id,
- "formation_id": ue["formation_id"],
- "semestre_id": semestre_id,
- "module_type": scu.ModuleType.MALUS,
- },
- )
+ matieres_malus = [mat for mat in ue.matieres if mat.titre == titre_matiere_malus]
+ if len(matieres_malus) > 0:
+ # matière Malus déjà existante, l'utilise
+ matiere = matieres_malus[0]
+ else:
+ if ue.matieres.count() > 0:
+ numero = max([mat.numero for mat in ue.matieres]) + 10
+ else:
+ numero = 0
+ matiere = Matiere(ue_id=ue.id, titre=titre_matiere_malus, numero=numero)
+ db.session.add(matiere)
- return module_id
+ module = Module(
+ titre=titre,
+ code=code,
+ coefficient=0.0,
+ ue=ue,
+ matiere=matiere,
+ formation=ue.formation,
+ semestre_id=semestre_id,
+ module_type=scu.ModuleType.MALUS,
+ )
+ db.session.add(module)
+ db.session.commit()
+
+ return module.id