diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py index e6ac86e3a..b1f6faa68 100644 --- a/app/scodoc/sco_formsemestre_edit.py +++ b/app/scodoc/sco_formsemestre_edit.py @@ -28,13 +28,16 @@ """Form choix modules / responsables et creation formsemestre """ import flask -from flask import url_for, g, request +from flask import url_for, flash +from flask import g, request from flask_login import current_user from app import db from app.auth.models import User from app.models import APO_CODE_STR_LEN, SHORT_STR_LEN -from app.models import ModuleImpl, Evaluation, EvaluationUEPoids +from app.models import Module, ModuleImpl, Evaluation, EvaluationUEPoids +from app.models.formations import Formation +from app.models.formsemestre import FormSemestre import app.scodoc.notesdb as ndb import app.scodoc.sco_utils as scu from app.scodoc import sco_cache @@ -65,9 +68,9 @@ from app.scodoc import sco_preferences from app.scodoc import sco_users -def _default_sem_title(F): - """Default title for a semestre in formation F""" - return F["titre"] +def _default_sem_title(formation): + """Default title for a semestre in formation""" + return formation.titre def formsemestre_createwithmodules(): @@ -140,6 +143,7 @@ def do_formsemestre_createwithmodules(edit=False): if edit: formsemestre_id = int(vals["formsemestre_id"]) sem = sco_formsemestre.get_formsemestre(formsemestre_id) + formsemestre = FormSemestre.query.get_or_404(formsemestre_id) if not current_user.has_permission(Permission.ScoImplement): if not edit: # il faut ScoImplement pour creer un semestre @@ -161,26 +165,25 @@ def do_formsemestre_createwithmodules(edit=False): allowed_user_names = list(uid2display.values()) + [""] # formation_id = int(vals["formation_id"]) - F = sco_formations.formation_list(args={"formation_id": formation_id}) - if not F: + formation = Formation.query.get(formation_id) + if formation is None: raise ScoValueError("Formation inexistante !") - F = F[0] if not edit: - initvalues = {"titre": _default_sem_title(F)} + initvalues = {"titre": _default_sem_title(formation)} semestre_id = int(vals["semestre_id"]) - sem_module_ids = set() + module_ids_set = set() else: # setup form init values initvalues = sem semestre_id = initvalues["semestre_id"] # add associated modules to tf-checked: - ams = sco_moduleimpl.moduleimpl_list(formsemestre_id=formsemestre_id) - sem_module_ids = set([x["module_id"] for x in ams]) - initvalues["tf-checked"] = ["MI" + str(x["module_id"]) for x in ams] - for x in ams: - initvalues["MI" + str(x["module_id"])] = uid2display.get( - x["responsable_id"], - f"inconnu numéro {x['responsable_id']} resp. de {x['moduleimpl_id']} !", + module_ids_existing = [modimpl.module.id for modimpl in formsemestre.modimpls] + module_ids_set = set(module_ids_existing) + initvalues["tf-checked"] = ["MI" + str(x) for x in module_ids_existing] + for modimpl in formsemestre.modimpls: + initvalues[f"MI{modimpl.module.id}"] = uid2display.get( + modimpl.responsable_id, + f"inconnu numéro {modimpl.responsable_id} resp. de {modimpl.id} !", ) initvalues["responsable_id"] = uid2display.get( @@ -192,15 +195,20 @@ def do_formsemestre_createwithmodules(edit=False): ) # Liste des ID de semestres - if F["type_parcours"] is not None: - parcours = sco_codes_parcours.get_parcours_from_code(F["type_parcours"]) + if formation.type_parcours is not None: + parcours = sco_codes_parcours.get_parcours_from_code(formation.type_parcours) NB_SEM = parcours.NB_SEM else: NB_SEM = 10 # fallback, max 10 semestres if NB_SEM == 1: semestre_id_list = [-1] else: - semestre_id_list = [-1] + list(range(1, NB_SEM + 1)) + if edit and formation.is_apc(): + # en APC, ne permet pas de changer de semestre + semestre_id_list = [formsemestre.semestre_id] + else: + semestre_id_list = [-1] + list(range(1, NB_SEM + 1)) + semestre_id_labels = [] for sid in semestre_id_list: if sid == -1: @@ -319,7 +327,7 @@ def do_formsemestre_createwithmodules(edit=False): "explanation": """n'indiquez pas les dates, ni le semestre, ni la modalité dans le titre: ils seront automatiquement ajoutés """ - % _default_sem_title(F), + % _default_sem_title(formation), }, ), ( @@ -340,6 +348,9 @@ def do_formsemestre_createwithmodules(edit=False): "title": "Semestre dans la formation", "allowed_values": semestre_id_list, "labels": semestre_id_labels, + "explanation": "en BUT, on ne peut pas modifier le semestre après création" + if formation.is_apc() + else "", }, ), ) @@ -549,7 +560,12 @@ def do_formsemestre_createwithmodules(edit=False): ) ) for mod in mods: - if mod["semestre_id"] == semestre_id: + if mod["semestre_id"] == semestre_id and ( + (not edit) # creation => tous modules + or (not formation.is_apc()) # pas BUT, on peux mixer les semestres + or (semestre_id == formsemestre.semestre_id) # module du semestre + or (mod["module_id"] in module_ids_set) # module déjà présent + ): nbmod += 1 if edit: select_name = "%s!group_id" % mod["module_id"] @@ -560,7 +576,7 @@ def do_formsemestre_createwithmodules(edit=False): else: return "" - if mod["module_id"] in sem_module_ids: + if mod["module_id"] in module_ids_set: disabled = "disabled" else: disabled = "" @@ -684,12 +700,13 @@ def do_formsemestre_createwithmodules(edit=False): msg = '
Formation %(titre)s (%(acronyme)s), version %(version)s, code %(formation_code)s
' - % F - + msg - + str(tf[1]) - ) + return f"""Formation {formation.titre} ({formation.acronyme}), version {formation.version}, code {formation.formation_code} +
+ {msg} + {tf[1]} + """ elif tf[0] == -1: return "