BUT: Ne génère plus de code annuel lors de jurys de semestre impairs

This commit is contained in:
Emmanuel Viennet 2024-01-24 19:00:12 +01:00
parent ece689eb10
commit fc35974951
4 changed files with 68 additions and 28 deletions

View File

@ -380,14 +380,24 @@ class DecisionsProposeesAnnee(DecisionsProposees):
sco_codes.ADJ, sco_codes.ADJ,
] + self.codes ] + self.codes
explanation += f" et {self.nb_rcues_under_8} < 8" explanation += f" et {self.nb_rcues_under_8} < 8"
else: else: # autres cas: non admis, non passage, non dem, pas la moitié des rcue:
self.codes = [ if formsemestre.semestre_id % 2 and self.formsemestre_pair is None:
sco_codes.RED, # Si jury sur un seul semestre impair, ne propose pas redoublement
sco_codes.NAR, # et efface décision éventuellement existante
sco_codes.PAS1NCI, codes = [None]
sco_codes.ADJ, else:
sco_codes.PASD, # voir #488 (discutable, conventions locales) codes = []
] + self.codes self.codes = (
codes
+ [
sco_codes.RED,
sco_codes.NAR,
sco_codes.PAS1NCI,
sco_codes.ADJ,
sco_codes.PASD, # voir #488 (discutable, conventions locales)
]
+ self.codes
)
explanation += f""" et {self.nb_rcues_under_8 explanation += f""" et {self.nb_rcues_under_8
} niveau{'x' if self.nb_rcues_under_8 > 1 else ''} < 8""" } niveau{'x' if self.nb_rcues_under_8 > 1 else ''} < 8"""
@ -514,7 +524,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
"""Les deux formsemestres auquel est inscrit l'étudiant (ni DEM ni DEF) """Les deux formsemestres auquel est inscrit l'étudiant (ni DEM ni DEF)
du niveau auquel appartient formsemestre. du niveau auquel appartient formsemestre.
-> S_impair, S_pair -> S_impair, S_pair (de la même année scolaire)
Si l'origine est impair, S_impair est l'origine et S_pair est None Si l'origine est impair, S_impair est l'origine et S_pair est None
Si l'origine est paire, S_pair est l'origine, et S_impair l'antérieur Si l'origine est paire, S_pair est l'origine, et S_impair l'antérieur
@ -524,9 +534,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
return None, None return None, None
if formsemestre.semestre_id % 2: if formsemestre.semestre_id % 2:
idx_autre = formsemestre.semestre_id + 1 idx_autre = formsemestre.semestre_id + 1 # impair, autre = suivant
else: else:
idx_autre = formsemestre.semestre_id - 1 idx_autre = formsemestre.semestre_id - 1 # pair: autre = précédent
# Cherche l'autre semestre de la même année scolaire: # Cherche l'autre semestre de la même année scolaire:
autre_formsemestre = None autre_formsemestre = None
@ -610,6 +620,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def next_semestre_ids(self, code: str) -> set[int]: def next_semestre_ids(self, code: str) -> set[int]:
"""Les indices des semestres dans lequels l'étudiant est autorisé """Les indices des semestres dans lequels l'étudiant est autorisé
à poursuivre après le semestre courant. à poursuivre après le semestre courant.
code: code jury sur année BUT
""" """
# La poursuite d'études dans un semestre pair d'une même année # La poursuite d'études dans un semestre pair d'une même année
# est de droit pour tout étudiant. # est de droit pour tout étudiant.
@ -653,6 +664,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
Si les code_rcue et le code_annee ne sont pas fournis, Si les code_rcue et le code_annee ne sont pas fournis,
et qu'il n'y en a pas déjà, enregistre ceux par défaut. et qu'il n'y en a pas déjà, enregistre ceux par défaut.
Si le code_annee est None, efface le code déjà enregistré.
""" """
log("jury_but.DecisionsProposeesAnnee.record_form") log("jury_but.DecisionsProposeesAnnee.record_form")
code_annee = self.codes[0] # si pas dans le form, valeur par defaut code_annee = self.codes[0] # si pas dans le form, valeur par defaut
@ -697,6 +710,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def record(self, code: str, mark_recorded: bool = True) -> bool: def record(self, code: str, mark_recorded: bool = True) -> bool:
"""Enregistre le code de l'année, et au besoin l'autorisation d'inscription. """Enregistre le code de l'année, et au besoin l'autorisation d'inscription.
Si l'étudiant est DEM ou DEF, ne fait rien. Si l'étudiant est DEM ou DEF, ne fait rien.
Si le code est None, efface le code déjà enregistré.
Si mark_recorded est vrai, positionne self.recorded Si mark_recorded est vrai, positionne self.recorded
""" """
if self.inscription_etat != scu.INSCRIT: if self.inscription_etat != scu.INSCRIT:
@ -746,7 +760,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
return True return True
def record_autorisation_inscription(self, code: str): def record_autorisation_inscription(self, code: str):
"""Autorisation d'inscription dans semestre suivant""" """Autorisation d'inscription dans semestre suivant.
code: code jury sur année BUT
"""
if self.autorisations_recorded: if self.autorisations_recorded:
return return
if self.inscription_etat != scu.INSCRIT: if self.inscription_etat != scu.INSCRIT:

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.6.83" SCOVERSION = "9.6.84"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"

View File

@ -2,7 +2,7 @@
# Essais avec un BUT GEII, 2 UE en BUT1 / 4 UE en BUT2-BUT3 et 3 parcours # Essais avec un BUT GEII, 2 UE en BUT1 / 4 UE en BUT2-BUT3 et 3 parcours
# Contrib Pascal B. # Contrib Pascal B.
# Voir tests/unit/test_but_jury.py # Voir tests/unit/test_but_jury.py
# pytest --pdb -m lyon tests/unit/test_but_jury.py # pytest -x --pdb -m lyon tests/unit/test_but_jury.py
ReferentielCompetences: ReferentielCompetences:
@ -1407,3 +1407,25 @@ Etudiants:
notes_modules: # combinaison pour avoir ADM ADM ADM AJ notes_modules: # combinaison pour avoir ADM ADM ADM AJ
"PF4": 12 "PF4": 12
"SAE4AII": 8 "SAE4AII": 8
# Test code annuel après un seul semestre
geiiS10:
prenom: "etugeiiS100 un semestre"
civilite: M
formsemestres:
S1:
notes_modules: # on joue avec les SAE seulement car elles sont "diagonales"
"S1.1": 18.0000
"S1.2": 19.0000
attendu: # les codes jury que l'on doit vérifier
deca:
passage_de_droit: False
code_valide: "" # le code "annuel" BUT proposé en auto: aucun
nb_competences: 2
nb_rcue_annee: 0
decisions_ues:
"UE11":
code_valide: ADM
moy_ue: 18.0000
"UE12":
code_valide: ADM
moy_ue: 19.0000

View File

@ -242,7 +242,9 @@ def but_compare_decisions_annee(deca: DecisionsProposeesAnnee, deca_att: dict):
for attr in ("passage_de_droit", "code_valide", "nb_competences"): for attr in ("passage_de_droit", "code_valide", "nb_competences"):
if attr in deca_att: if attr in deca_att:
assert getattr(deca, attr) == deca_att[attr] assert getattr(deca, attr) == (
deca_att[attr] if deca_att[attr] != "" else None
)
if "decisions_ues" in deca_att: if "decisions_ues" in deca_att:
but_check_decisions_ues(deca.decisions_ues, deca_att["decisions_ues"]) but_check_decisions_ues(deca.decisions_ues, deca_att["decisions_ues"])