forked from ScoDoc/ScoDoc
90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
##############################################################################
|
|
# ScoDoc
|
|
# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved.
|
|
# See LICENSE
|
|
##############################################################################
|
|
|
|
"""Jury BUT: calcul des décisions de jury annuelles "automatiques"
|
|
"""
|
|
from flask import g, url_for
|
|
|
|
from app import db
|
|
from app.but import jury_but, jury_dut120
|
|
from app.models import Identite, FormSemestre, ScolarNews, ValidationDUT120
|
|
from app.scodoc import sco_cache
|
|
from app.scodoc.sco_exceptions import ScoValueError
|
|
|
|
|
|
def formsemestre_validation_auto_but(
|
|
formsemestre: FormSemestre, only_adm: bool = True, dry_run=False, with_dut120=True
|
|
) -> tuple[int, list[jury_but.DecisionsProposeesAnnee]]:
|
|
"""Calcul automatique des décisions de jury sur une "année" BUT.
|
|
|
|
- N'enregistre jamais de décisions de l'année scolaire précédente, même
|
|
si on a des RCUE "à cheval".
|
|
- Normalement, only_adm est True et on n'enregistre que les décisions validantes
|
|
de droit: ADM ou CMP.
|
|
En revanche, si only_adm est faux, on enregistre la première décision proposée par ScoDoc
|
|
(mode à n'utiliser que pour les tests unitaires vérifiant la saisie des jurys)
|
|
|
|
Enregistre aussi le DUT120.
|
|
|
|
Returns:
|
|
- En mode normal, (nombre d'étudiants pour lesquels on a enregistré au moins un code, []])
|
|
- En mode dry_run, (0, list[DecisionsProposeesAnnee])
|
|
"""
|
|
if not formsemestre.formation.is_apc():
|
|
raise ScoValueError("fonction réservée aux formations BUT")
|
|
nb_etud_modif = 0
|
|
decas = []
|
|
with sco_cache.DeferredSemCacheManager():
|
|
for etudid in formsemestre.etuds_inscriptions:
|
|
etud = Identite.get_etud(etudid)
|
|
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
|
|
if not dry_run:
|
|
modified = deca.record_all(only_validantes=only_adm)
|
|
modified |= validation_dut120_auto(etud, formsemestre)
|
|
else:
|
|
decas.append(deca)
|
|
|
|
if modified:
|
|
nb_etud_modif += 1
|
|
|
|
db.session.commit()
|
|
ScolarNews.add(
|
|
typ=ScolarNews.NEWS_JURY,
|
|
obj=formsemestre.id,
|
|
text=f"""Calcul jury automatique du semestre {formsemestre.html_link_status()}""",
|
|
url=url_for(
|
|
"notes.formsemestre_status",
|
|
scodoc_dept=g.scodoc_dept,
|
|
formsemestre_id=formsemestre.id,
|
|
),
|
|
)
|
|
return nb_etud_modif, decas
|
|
|
|
|
|
def validation_dut120_auto(etud: Identite, formsemestre: FormSemestre) -> bool:
|
|
"""Si l'étudiant n'a pas déjà validé son DUT120 dans cette spécialité
|
|
et qu'il satisfait les confitions, l'enregistre.
|
|
Returns True si nouvelle décision enregistrée.
|
|
"""
|
|
refcomp = formsemestre.formation.referentiel_competence
|
|
if not refcomp:
|
|
raise ScoValueError("formation non associée à un référentiel de compétences")
|
|
validation = ValidationDUT120.query.filter_by(
|
|
etudid=etud.id, referentiel_competence_id=refcomp.id
|
|
).first()
|
|
if validation:
|
|
return False # déjà enregistré
|
|
if jury_dut120.etud_valide_dut120(etud, refcomp.id):
|
|
new_validation = ValidationDUT120(
|
|
etudid=etud.id,
|
|
referentiel_competence_id=refcomp.id,
|
|
formsemestre_id=formsemestre.id, # Replace with appropriate value
|
|
)
|
|
db.session.add(new_validation)
|
|
db.session.commit()
|
|
return True
|
|
return False # ne peut pas valider
|