forked from ScoDoc/ScoDoc
APC: associations UE/Niveaux: empeche modif si RCUE enregistrés
This commit is contained in:
parent
08d6349672
commit
e230118c59
@ -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}
|
||||||
|
|
||||||
|
@ -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
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -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 (
|
||||||
|
Loading…
Reference in New Issue
Block a user