1
0
forked from ScoDoc/ScoDoc

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,
] + self.codes
explanation += f" et {self.nb_rcues_under_8} < 8"
else:
self.codes = [
sco_codes.RED,
sco_codes.NAR,
sco_codes.PAS1NCI,
sco_codes.ADJ,
sco_codes.PASD, # voir #488 (discutable, conventions locales)
] + self.codes
else: # autres cas: non admis, non passage, non dem, pas la moitié des rcue:
if formsemestre.semestre_id % 2 and self.formsemestre_pair is None:
# Si jury sur un seul semestre impair, ne propose pas redoublement
# et efface décision éventuellement existante
codes = [None]
else:
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
} 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)
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 paire, S_pair est l'origine, et S_impair l'antérieur
@ -524,9 +534,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
return None, None
if formsemestre.semestre_id % 2:
idx_autre = formsemestre.semestre_id + 1
idx_autre = formsemestre.semestre_id + 1 # impair, autre = suivant
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:
autre_formsemestre = None
@ -610,6 +620,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def next_semestre_ids(self, code: str) -> set[int]:
"""Les indices des semestres dans lequels l'étudiant est autorisé
à 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
# 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,
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")
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:
"""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 le code est None, efface le code déjà enregistré.
Si mark_recorded est vrai, positionne self.recorded
"""
if self.inscription_etat != scu.INSCRIT:
@ -746,7 +760,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
return True
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:
return
if self.inscription_etat != scu.INSCRIT:

View File

@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
SCOVERSION = "9.6.83"
SCOVERSION = "9.6.84"
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
# Contrib Pascal B.
# 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:
@ -1407,3 +1407,25 @@ Etudiants:
notes_modules: # combinaison pour avoir ADM ADM ADM AJ
"PF4": 12
"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"):
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:
but_check_decisions_ues(deca.decisions_ues, deca_att["decisions_ues"])