APC: associations UE/Niveaux: empeche modif si RCUE enregistrés

This commit is contained in:
Emmanuel Viennet 2024-07-08 12:33:48 +02:00
parent 08d6349672
commit e230118c59
3 changed files with 43 additions and 16 deletions

View File

@ -328,14 +328,12 @@ def desassoc_ue_niveau(ue_id: int):
if g.scodoc_dept: if g.scodoc_dept:
query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id) query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id)
ue: UniteEns = query.first_or_404() ue: UniteEns = query.first_or_404()
ue.niveau_competence = None ok, error_message = ue.set_niveau_competence(None)
db.session.add(ue) if not ok:
db.session.commit() if g.scodoc_dept: # "usage web"
# Invalidation du cache flash(error_message, "error")
ue.formation.invalidate_cached_sems() return json_error(404, error_message)
log(f"desassoc_ue_niveau: {ue}") if g.scodoc_dept: # "usage web"
if g.scodoc_dept:
# "usage web"
flash(f"UE {ue.acronyme} dé-associée") flash(f"UE {ue.acronyme} dé-associée")
return {"status": 0} return {"status": 0}

View File

@ -250,15 +250,19 @@ def _build_decisions_rcue_list(decisions_rcue: dict) -> list[str]:
validation_by_competence = defaultdict(list) validation_by_competence = defaultdict(list)
for validation in decisions_rcue: for validation in decisions_rcue:
if validation: if validation:
# Attention, certaines validations de RCUE peuvent ne plus être associées
# à un niveau de compétence si l'UE a été déassociée (ce qui ne devrait pas être fait)
competence_id = ( competence_id = (
validation.get("niveau", {}).get("competence", {}).get("id_orebut") (validation.get("niveau") or {}).get("competence") or {}
) ).get("id_orebut")
validation_by_competence[competence_id].append(validation) validation_by_competence[competence_id].append(validation)
# Tri des listes de validation par numéro de compétence # Tri des listes de validation par numéro de compétence
validations_niveaux = sorted( validations_niveaux = sorted(
validation_by_competence.values(), validation_by_competence.values(),
key=lambda v: ( key=lambda v: (
v[0].get("niveau", {}).get("competence", {}).get("numero", 0) if v else -1 ((v[0].get("niveau") or {}).get("competence") or {}).get("numero", 0)
if v
else -1
), ),
) )
titres_rcues = [] titres_rcues = []
@ -266,14 +270,14 @@ def _build_decisions_rcue_list(decisions_rcue: dict) -> list[str]:
for validations in validations_niveaux: for validations in validations_niveaux:
if validations: if validations:
v = validations[0] v = validations[0]
titre_competence = ( titre_competence = ((v.get("niveau") or {}).get("competence", {})).get(
v.get("niveau", {}).get("competence", {}).get("titre", "sans titre") "titre", "sans titre ! A vérifier !"
) )
titres_rcues.append( titres_rcues.append(
f"""{titre_competence} : """ f"""{titre_competence} : """
+ ", ".join( + ", ".join(
[ [
f"niveau {v.get('niveau',empty).get('ordre','?')} {v.get('code', '?')}" f"niveau {((v.get('niveau') or empty).get('ordre') or '?')} {v.get('code', '?')}"
for v in validations for v in validations
] ]
) )

View File

@ -396,7 +396,21 @@ class UniteEns(models.ScoDocModel):
return True, "" return True, ""
def set_niveau_competence(self, niveau: ApcNiveau) -> tuple[bool, str]: def is_used_in_validation_rcue(self) -> bool:
"""Vrai si cette UE est utilisée dans une validation enregistrée d'RCUE."""
from app.models.but_validations import ApcValidationRCUE
return (
ApcValidationRCUE.query.filter(
db.or_(
ApcValidationRCUE.ue1_id == self.id,
ApcValidationRCUE.ue2_id == self.id,
)
).count()
> 0
)
def set_niveau_competence(self, niveau: ApcNiveau | None) -> tuple[bool, str]:
"""Associe cette UE au niveau de compétence indiqué. """Associe cette UE au niveau de compétence indiqué.
Le niveau doit être dans l'un des parcours de l'UE (si elle n'est pas Le niveau doit être dans l'un des parcours de l'UE (si elle n'est pas
de tronc commun). de tronc commun).
@ -404,7 +418,12 @@ class UniteEns(models.ScoDocModel):
Sinon, raises ScoFormationConflict. Sinon, raises ScoFormationConflict.
Si niveau est None, désassocie. Si niveau est None, désassocie.
Returns True if (de)association done, False on error.
Si l'UE est utilisée dans un validation de RCUE, on ne peut plus la changer de niveau.
Returns
- True if (de)association done, False on error.
- Error message (string)
""" """
# Sanity checks # Sanity checks
if not self.formation.referentiel_competence: if not self.formation.referentiel_competence:
@ -412,6 +431,12 @@ class UniteEns(models.ScoDocModel):
False, False,
"La formation n'est pas associée à un référentiel de compétences", "La formation n'est pas associée à un référentiel de compétences",
) )
# UE utilisée dans des validations RCUE ?
if self.is_used_in_validation_rcue():
return (
False,
"UE utilisée dans un RCUE validé: son niveau ne peut plus être modifié",
)
if niveau is not None: if niveau is not None:
if self.niveau_competence_id is not None: if self.niveau_competence_id is not None:
return ( return (