DUT après jury BUT: calcul automatique. Closes #577

This commit is contained in:
Emmanuel Viennet 2024-07-07 22:28:38 +02:00
parent e63cdba1f6
commit b58ab93fee
2 changed files with 37 additions and 4 deletions

View File

@ -9,14 +9,14 @@
from flask import g, url_for from flask import g, url_for
from app import db from app import db
from app.but import jury_but from app.but import jury_but, jury_dut120
from app.models import Identite, FormSemestre, ScolarNews from app.models import Identite, FormSemestre, ScolarNews, ValidationDUT120
from app.scodoc import sco_cache from app.scodoc import sco_cache
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
def formsemestre_validation_auto_but( 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]]: ) -> tuple[int, list[jury_but.DecisionsProposeesAnnee]]:
"""Calcul automatique des décisions de jury sur une "année" BUT. """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 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) (mode à n'utiliser que pour les tests unitaires vérifiant la saisie des jurys)
Enregistre aussi le DUT120.
Returns: Returns:
- En mode normal, (nombre d'étudiants pour lesquels on a enregistré au moins un code, []]) - En mode normal, (nombre d'étudiants pour lesquels on a enregistré au moins un code, []])
- En mode dry_run, (0, list[DecisionsProposeesAnnee]) - En mode dry_run, (0, list[DecisionsProposeesAnnee])
@ -40,10 +42,14 @@ def formsemestre_validation_auto_but(
etud = Identite.get_etud(etudid) etud = Identite.get_etud(etudid)
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
if not dry_run: 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: else:
decas.append(deca) decas.append(deca)
if modified:
nb_etud_modif += 1
db.session.commit() db.session.commit()
ScolarNews.add( ScolarNews.add(
typ=ScolarNews.NEWS_JURY, typ=ScolarNews.NEWS_JURY,
@ -56,3 +62,28 @@ def formsemestre_validation_auto_but(
), ),
) )
return nb_etud_modif, decas 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

View File

@ -32,6 +32,8 @@
<li>N'enregistre pas de décision si l'étudiant a une ou plusieurs notes en ATTente. <li>N'enregistre pas de décision si l'étudiant a une ou plusieurs notes en ATTente.
</li> </li>
<li>L'assiduité n'est <b>pas</b> prise en compte. </li> <li>L'assiduité n'est <b>pas</b> prise en compte. </li>
<li>Si l'étudiant remplit les conditions (a validé les 120 premiers ECTS du BUT)
alors lui enregistre un diplôme de "<b>DUT en 120 ECTS</b>".
</ul> </ul>
<p> <p>
En conséquence, saisir ensuite <b>manuellement les décisions manquantes</b>, En conséquence, saisir ensuite <b>manuellement les décisions manquantes</b>,