Améliore saisie 'automatique' des décisions BUT

This commit is contained in:
Emmanuel Viennet 2023-01-11 16:42:56 -03:00
parent 48e40e79ba
commit bec34f708b
4 changed files with 32 additions and 12 deletions

View File

@ -92,6 +92,7 @@ from app.models.validations import ScolarFormSemestreValidation
from app.scodoc import sco_cache
from app.scodoc import sco_codes_parcours as sco_codes
from app.scodoc.sco_codes_parcours import (
BUT_CODES_ORDERED,
CODES_RCUE_VALIDES,
CODES_UE_VALIDES,
RED,
@ -757,20 +758,38 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def record_all(self, no_overwrite: bool = True):
"""Enregistre les codes qui n'ont pas été spécifiés par le formulaire,
et sont donc en mode "automatique"
et sont donc en mode "automatique".
- Si "à cheval", ne modifie pas les codes UE de l'année scolaire précédente.
- Pour les RCUE: n'enregistre que si la nouvelle décision est plus favorable que l'ancienne.
"""
decisions = (
list(self.decisions_ues.values())
+ list(self.decisions_rcue_by_niveau.values())
+ [self]
)
for dec in decisions:
if not dec.recorded:
# Toujours valider dans l'ordre UE, RCUE, Année:
annee_scolaire = self.formsemestre.annee_scolaire()
# UEs
for dec_ue in self.decisions_ues.values():
if (
not dec_ue.recorded
) and dec_ue.formsemestre.annee_scolaire() == annee_scolaire:
# rappel: le code par défaut est en tête
code = dec.codes[0] if dec.codes else None
code = dec_ue.codes[0] if dec_ue.codes else None
# enregistre le code jury seulement s'il n'y a pas déjà de code
# (no_overwrite=True) sauf en mode test yaml
dec.record(code, no_overwrite=no_overwrite)
dec_ue.record(code, no_overwrite=no_overwrite)
# RCUE : enregistre seulement si pas déjà validé "mieux"
for dec_rcue in self.decisions_rcue_by_niveau.values():
code = dec_rcue.codes[0] if dec_rcue.codes else None
if (not dec_rcue.recorded) and (
(not dec_rcue.validation)
or BUT_CODES_ORDERED.get(dec_rcue.validation.code, 0)
< BUT_CODES_ORDERED.get(code, 0)
):
dec_rcue.record(code, no_overwrite=no_overwrite)
# Année:
if not self.recorded:
# rappel: le code par défaut est en tête
code = self.codes[0] if self.codes else None
# enregistre le code jury seulement s'il n'y a pas déjà de code
# (no_overwrite=True) sauf en mode test yaml
self.record(code, no_overwrite=no_overwrite)
def erase(self, only_one_sem=False):
"""Efface les décisions de jury de cet étudiant

View File

@ -19,6 +19,8 @@ def formsemestre_validation_auto_but(
formsemestre: FormSemestre, only_adm: bool = True, no_overwrite: bool = True
) -> int:
"""Calcul automatique des décisions de jury sur une année BUT.
Ne modifie 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 ADM (de droit).
Si only_adm est faux, on enregistre la première décision proposée par ScoDoc
(mode à n'utiliser que pour les tests)

View File

@ -191,7 +191,6 @@ Etudiants:
decisions_rcues: # on repère ici les RCUE par l'acronyme de leur 1ere UE (donc du S1)
"UE11":
code_valide: CMP
decision_jury: CMP
rcue:
moy_rcue: 10.75
est_compensable: True

View File

@ -423,7 +423,7 @@ def _check_decisions_rcues(
):
"Vérifie les décisions d'RCUEs"
for acronyme, dec_rcue_att in decisions_rcues_att.items():
# retrouve la décision RCUE à partir de l'acronyme de la 1er UE
# retrouve la décision RCUE à partir de l'acronyme de la 1ère UE
rcues_d = [
dec_rcue
for dec_rcue in decisions_rcues