Correctif pour changement de l'UE d'un module. Autorisé aussi via API. + bug fix.

This commit is contained in:
Emmanuel Viennet 2025-01-16 23:58:52 +01:00
parent f34996c8a7
commit c4d45ae358
7 changed files with 44 additions and 21 deletions

View File

@ -21,6 +21,7 @@ from app import db, log
from app.api import api_bp as bp, api_web_bp from app.api import api_bp as bp, api_web_bp
from app.api import api_permission_required as permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc from app.decorators import scodoc
from app.formations import edit_module
from app.models import APO_CODE_STR_LEN from app.models import APO_CODE_STR_LEN
from app.scodoc.sco_utils import json_error from app.scodoc.sco_utils import json_error
from app.models import ( from app.models import (
@ -493,8 +494,7 @@ def formation_module_edit(module_id: int):
query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id) query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id)
module: Module = query.first_or_404() module: Module = query.first_or_404()
args = request.get_json(force=True) # may raise 400 Bad Request args = request.get_json(force=True) # may raise 400 Bad Request
module.from_dict(args) edit_module.do_module_edit(args, module=module)
db.session.commit()
db.session.refresh(module) db.session.refresh(module)
log(f"API module_edit: module_id={module.id} args={args}") log(f"API module_edit: module_id={module.id} args={args}")
r = module.to_dict(convert_objects=True, with_parcours_ids=True) r = module.to_dict(convert_objects=True, with_parcours_ids=True)

View File

@ -33,7 +33,7 @@ from flask import flash, url_for, render_template
from flask import g, request from flask import g, request
from flask_login import current_user from flask_login import current_user
from app import db from app import db, log
from app import models from app import models
from app.models import APO_CODE_STR_LEN from app.models import APO_CODE_STR_LEN
from app.models import Formation, Matiere, Module, UniteEns from app.models import Formation, Matiere, Module, UniteEns
@ -98,14 +98,42 @@ def module_delete(module_id=None):
return flask.redirect(dest_url) return flask.redirect(dest_url)
def do_module_edit(vals: dict) -> None: def do_module_edit(vals: dict, module: Module | None = None) -> None:
"edit a module" """edit a module (donné par module ou vals["module_id"]).
Gère les changements d'UEs.
commit et inval cache.
"""
# check # check
module = Module.get_instance(vals["module_id"]) if module is None:
module: Module = Module.get_instance(vals["module_id"])
# Changement d'UE ?
if (
not module.is_locked()
and "ue_id" in vals
and vals["ue_id"]
and vals["ue_id"] != module.ue_id
):
# Affecte le module à la première matière de l'UE destination
ue_dest = UniteEns.get_ue(vals["ue_id"])
log(f"do_module_edit: changing UE of {module} to {ue_dest}")
mat_dest = ue_dest.matieres.first()
if not mat_dest:
log("do_module_edit: creating new Matiere in dest UE")
mat_dest = Matiere.create_from_dict(
{
"ue_id": ue_dest.id,
"titre": ue_dest.titre or "",
"numero": 1,
}
)
db.session.add(mat_dest)
module.matiere = mat_dest
module.ue = ue_dest
# edit # edit
modif = module.from_dict(vals) modif = module.from_dict(vals)
if modif: if modif:
module.formation.invalidate_cached_sems() module.formation.invalidate_cached_sems()
db.session.commit()
def module_create( def module_create(
@ -735,9 +763,8 @@ def module_edit(
tf[2]["app_critiques"], formation.referentiel_competence tf[2]["app_critiques"], formation.referentiel_competence
) )
# Check unicité code module dans la formation # Le check unicité code module dans la formation
# ??? TODO # est fait par Module.from_dict
#
do_module_edit(tf[2]) do_module_edit(tf[2])
# Modifie les parcours # Modifie les parcours
if form_parcours is not None and formation.referentiel_competence: if form_parcours is not None and formation.referentiel_competence:

View File

@ -216,6 +216,7 @@ class FormSemestre(models.ScoDocModel):
except (TypeError, ValueError): except (TypeError, ValueError):
if accept_none: if accept_none:
return None return None
log("get_formsemestre: formsemestre_id invalide")
abort(404, "formsemestre_id invalide") abort(404, "formsemestre_id invalide")
dept_id = ( dept_id = (

View File

@ -183,6 +183,7 @@ class Module(models.ScoDocModel):
matiere = db.session.get(Matiere, new_matiere_id) matiere = db.session.get(Matiere, new_matiere_id)
if matiere is None or matiere.ue_id != self.ue_id: if matiere is None or matiere.ue_id != self.ue_id:
log("Module.from_dict: invalid matiere")
raise ScoValueError("invalid matiere") raise ScoValueError("invalid matiere")
modified = super().from_dict( modified = super().from_dict(

View File

@ -1694,11 +1694,13 @@ def confirm_dialog(
if add_headers: if add_headers:
formsemestre = ( formsemestre = (
FormSemestre.get_formsemestre(parameters["formsemestre_id"]) FormSemestre.get_formsemestre(parameters["formsemestre_id"])
if "formsemestre_id" in parameters if parameters.get("formsemestre_id")
else None else None
) )
etud = ( etud = (
Identite.get_etud(parameters["etudid"]) if "etudid" in parameters else None Identite.get_etud(parameters["etudid"])
if parameters.get("etudid")
else None
) )
return render_template( return render_template(
template, template,

View File

@ -388,14 +388,6 @@ def test_api_module_edit(api_admin_headers):
assert module["heures_cours"] == 16 assert module["heures_cours"] == 16
assert module["semestre_id"] == 1 assert module["semestre_id"] == 1
assert module["abbrev"] == "ALLO" assert module["abbrev"] == "ALLO"
# tente de changer l'UE: ne devrait rien faire:
ue_id = module["ue_id"]
module = POST(
f"/formation/module/{module_id}/edit",
{"ue_id": 666},
api_admin_headers,
)
assert module["ue_id"] == ue_id
# tente de changer la formation: ne devrait rien faire: # tente de changer la formation: ne devrait rien faire:
formation_id = module["formation_id"] formation_id = module["formation_id"]
module = POST( module = POST(