diff --git a/app/but/jury_but.py b/app/but/jury_but.py index a95bb3df..bf0e75eb 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -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 diff --git a/app/but/jury_but_validation_auto.py b/app/but/jury_but_validation_auto.py index a3101b83..d5e308ab 100644 --- a/app/but/jury_but_validation_auto.py +++ b/app/but/jury_but_validation_auto.py @@ -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) diff --git a/tests/unit/cursus_but_geii_lyon.yaml b/tests/unit/cursus_but_geii_lyon.yaml index 8f4b0e57..1230273c 100644 --- a/tests/unit/cursus_but_geii_lyon.yaml +++ b/tests/unit/cursus_but_geii_lyon.yaml @@ -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 diff --git a/tests/unit/yaml_setup.py b/tests/unit/yaml_setup.py index 1c20fe31..12e9d0ce 100644 --- a/tests/unit/yaml_setup.py +++ b/tests/unit/yaml_setup.py @@ -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