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