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_cache
from app.scodoc import sco_codes_parcours as sco_codes from app.scodoc import sco_codes_parcours as sco_codes
from app.scodoc.sco_codes_parcours import ( from app.scodoc.sco_codes_parcours import (
BUT_CODES_ORDERED,
CODES_RCUE_VALIDES, CODES_RCUE_VALIDES,
CODES_UE_VALIDES, CODES_UE_VALIDES,
RED, RED,
@ -757,20 +758,38 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def record_all(self, no_overwrite: bool = True): def record_all(self, no_overwrite: bool = True):
"""Enregistre les codes qui n'ont pas été spécifiés par le formulaire, """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 = ( # Toujours valider dans l'ordre UE, RCUE, Année:
list(self.decisions_ues.values()) annee_scolaire = self.formsemestre.annee_scolaire()
+ list(self.decisions_rcue_by_niveau.values()) # UEs
+ [self] for dec_ue in self.decisions_ues.values():
) if (
for dec in decisions: not dec_ue.recorded
if not dec.recorded: ) and dec_ue.formsemestre.annee_scolaire() == annee_scolaire:
# rappel: le code par défaut est en tête # 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 # enregistre le code jury seulement s'il n'y a pas déjà de code
# (no_overwrite=True) sauf en mode test yaml # (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): def erase(self, only_one_sem=False):
"""Efface les décisions de jury de cet étudiant """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 formsemestre: FormSemestre, only_adm: bool = True, no_overwrite: bool = True
) -> int: ) -> int:
"""Calcul automatique des décisions de jury sur une année BUT. """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). 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 Si only_adm est faux, on enregistre la première décision proposée par ScoDoc
(mode à n'utiliser que pour les tests) (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) decisions_rcues: # on repère ici les RCUE par l'acronyme de leur 1ere UE (donc du S1)
"UE11": "UE11":
code_valide: CMP code_valide: CMP
decision_jury: CMP
rcue: rcue:
moy_rcue: 10.75 moy_rcue: 10.75
est_compensable: True est_compensable: True

View File

@ -423,7 +423,7 @@ def _check_decisions_rcues(
): ):
"Vérifie les décisions d'RCUEs" "Vérifie les décisions d'RCUEs"
for acronyme, dec_rcue_att in decisions_rcues_att.items(): 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 = [ rcues_d = [
dec_rcue dec_rcue
for dec_rcue in decisions_rcues for dec_rcue in decisions_rcues