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_permission_required as permission_required
from app.decorators import scodoc
from app.formations import edit_module
from app.models import APO_CODE_STR_LEN
from app.scodoc.sco_utils import json_error
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)
module: Module = query.first_or_404()
args = request.get_json(force=True) # may raise 400 Bad Request
module.from_dict(args)
db.session.commit()
edit_module.do_module_edit(args, module=module)
db.session.refresh(module)
log(f"API module_edit: module_id={module.id} args={args}")
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_login import current_user
from app import db
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
@ -98,14 +98,42 @@ def module_delete(module_id=None):
return flask.redirect(dest_url)
def do_module_edit(vals: dict) -> None:
"edit a module"
def do_module_edit(vals: dict, module: Module | None = None) -> None:
"""edit a module (donné par module ou vals["module_id"]).
Gère les changements d'UEs.
commit et inval cache.
"""
# 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
modif = module.from_dict(vals)
if modif:
module.formation.invalidate_cached_sems()
db.session.commit()
def module_create(
@ -735,9 +763,8 @@ def module_edit(
tf[2]["app_critiques"], formation.referentiel_competence
)
# Check unicité code module dans la formation
# ??? TODO
#
# Le check unicité code module dans la formation
# est fait par Module.from_dict
do_module_edit(tf[2])
# Modifie les parcours
if form_parcours is not None and formation.referentiel_competence:

View File

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

View File

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

View File

@ -1694,11 +1694,13 @@ def confirm_dialog(
if add_headers:
formsemestre = (
FormSemestre.get_formsemestre(parameters["formsemestre_id"])
if "formsemestre_id" in parameters
if parameters.get("formsemestre_id")
else None
)
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(
template,

View File

@ -27,7 +27,7 @@ done
source "$SCRIPT_DIR"/.env
export FLASK_ENV=test_api
export FLASK_DEBUG=1
export FLASK_DEBUG=1
tools/create_database.sh --drop SCODOC_TEST_API
flask db upgrade
flask sco-db-init --erase
@ -39,7 +39,7 @@ flask edit-role LecteurAPI -a ScoView
flask user-role "$API_USER" -a LecteurAPI
if [ -z "$PORT" ]
then
then
flask run --host 0.0.0.0
else
flask run --host 0.0.0.0 -p "$PORT"

View File

@ -388,14 +388,6 @@ def test_api_module_edit(api_admin_headers):
assert module["heures_cours"] == 16
assert module["semestre_id"] == 1
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:
formation_id = module["formation_id"]
module = POST(