diff --git a/app/but/jury_but_validation_auto.py b/app/but/jury_but_validation_auto.py index 0208282d..97782ee1 100644 --- a/app/but/jury_but_validation_auto.py +++ b/app/but/jury_but_validation_auto.py @@ -9,14 +9,14 @@ from flask import g, url_for from app import db -from app.but import jury_but -from app.models import Identite, FormSemestre, ScolarNews +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 + 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. @@ -27,6 +27,8 @@ def formsemestre_validation_auto_but( 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]) @@ -40,10 +42,14 @@ def formsemestre_validation_auto_but( etud = Identite.get_etud(etudid) deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) if not dry_run: - nb_etud_modif += deca.record_all(only_validantes=only_adm) + 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, @@ -56,3 +62,28 @@ def formsemestre_validation_auto_but( ), ) 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 diff --git a/app/templates/but/formsemestre_validation_auto_but.j2 b/app/templates/but/formsemestre_validation_auto_but.j2 index 5ebd21d7..25bf07fe 100644 --- a/app/templates/but/formsemestre_validation_auto_but.j2 +++ b/app/templates/but/formsemestre_validation_auto_but.j2 @@ -32,6 +32,8 @@
  • N'enregistre pas de décision si l'étudiant a une ou plusieurs notes en ATTente.
  • L'assiduité n'est pas prise en compte.
  • +
  • Si l'étudiant remplit les conditions (a validé les 120 premiers ECTS du BUT) + alors lui enregistre un diplôme de "DUT en 120 ECTS".

    En conséquence, saisir ensuite manuellement les décisions manquantes,