Jury BUT: décisions lorsque démission sur un semestre

This commit is contained in:
Emmanuel Viennet 2022-10-04 21:56:10 +02:00
parent 678959c76a
commit 75c5256ba9
4 changed files with 45 additions and 8 deletions

View File

@ -233,6 +233,17 @@ class DecisionsProposeesAnnee(DecisionsProposees):
self.rcues_annee = []
"RCUEs de l'année"
self.inscription_etat = etud.inscription_etat(formsemestre_last.id)
"état de l'inscription dans le semestre le plus avancé (pair si année complète)"
self.inscription_etat_pair = (
etud.inscription_etat(formsemestre_pair.id)
if formsemestre_pair is not None
else None
)
self.inscription_etat_impair = (
etud.inscription_etat(formsemestre_impair.id)
if formsemestre_impair is not None
else None
)
if self.formsemestre_impair is not None:
self.validation = ApcValidationAnnee.query.filter_by(
@ -262,7 +273,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
self.ues_impair, self.ues_pair = self.compute_ues_annee() # pylint: disable=all
self.decisions_ues = {
ue.id: DecisionsProposeesUE(
etud, formsemestre_impair, ue, self.inscription_etat
etud, formsemestre_impair, ue, self.inscription_etat_impair
)
for ue in self.ues_impair
}
@ -270,7 +281,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
self.decisions_ues.update(
{
ue.id: DecisionsProposeesUE(
etud, formsemestre_pair, ue, self.inscription_etat
etud, formsemestre_pair, ue, self.inscription_etat_pair
)
for ue in self.ues_pair
}
@ -453,7 +464,6 @@ class DecisionsProposeesAnnee(DecisionsProposees):
"""UEs à valider cette année pour cet étudiant, selon son parcours.
Ramène [ listes des UE du semestre impair, liste des UE du semestre pair ].
"""
etudid = self.etud.id
ues_sems = []
for (formsemestre, res) in (
(self.formsemestre_impair, self.res_impair),
@ -607,7 +617,10 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def record(self, code: str, no_overwrite=False):
"""Enregistre le code de l'année, et au besoin l'autorisation d'inscription.
Si no_overwrite, ne fait rien si un code est déjà enregistré.
Si l'étudiant est DEM ou DEF, ne fait rien.
"""
if self.inscription_etat != scu.INSCRIT:
return
if code and not code in self.codes:
raise ScoValueError(
f"code annee <tt>{html.escape(code)}</tt> invalide pour formsemestre {html.escape(self.formsemestre)}"
@ -664,7 +677,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
sco_cache.invalidate_formsemestre(formsemestre_id=self.formsemestre_pair.id)
def record_all(self):
"""Enregistre les codes qui n'ont pas été spécifiés par le formulaire, et sont donc en mode "automatique" """
"""Enregistre les codes qui n'ont pas été spécifiés par le formulaire,
et sont donc en mode "automatique"
"""
decisions = (
list(self.decisions_ues.values())
+ list(self.decisions_rcue_by_niveau.values())
@ -681,6 +696,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
"""Efface les décisions de jury de cet étudiant
pour cette année: décisions d'UE, de RCUE, d'année,
et autorisations d'inscription émises.
Efface même si étudiant DEM ou DEF.
"""
if only_one_sem:
# N'efface que les autorisations venant de ce semestre,
@ -831,6 +847,10 @@ class DecisionsProposeesRCUE(DecisionsProposees):
def record(self, code: str, no_overwrite=False):
"""Enregistre le code"""
if self.rcue is None:
return # pas de RCUE a enregistrer
if self.inscription_etat != scu.INSCRIT:
return
if code and not code in self.codes:
raise ScoValueError(
f"code UE invalide pour ue_id={self.ue.id}: {html.escape(code)}"
@ -845,6 +865,9 @@ class DecisionsProposeesRCUE(DecisionsProposees):
if code is None:
self.validation = None
else:
# log(
# f"RCUE.record(etudid={self.etud.id}, ue1_id={self.rcue.ue_1.id}, ue2_id={self.rcue.ue_2.id}, code={code} )"
# )
self.validation = ApcValidationRCUE(
etudid=self.etud.id,
formsemestre_id=self.rcue.formsemestre_2.id,
@ -940,7 +963,7 @@ class DecisionsProposeesUE(DecisionsProposees):
self.rcue: RegroupementCoherentUE = None
"Le rcue auquel est rattaché cette UE, ou None"
self.inscription_etat = inscription_etat
"inscription: I, DEM, DEF"
"inscription: I, DEM, DEF dans le semestre de cette UE"
if ue.type == sco_codes.UE_SPORT:
self.explanation = "UE bonus, pas de décision de jury"
self.codes = [] # aucun code proposé

View File

@ -82,7 +82,8 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append(
_gen_but_niveau_ue(
dec_rcue.rcue.ue_1,
dec_rcue.rcue.moy_ue_1,
deca.decisions_ues[dec_rcue.rcue.ue_1.id].moy_ue,
# dec_rcue.rcue.moy_ue_1,
deca.decisions_ues[dec_rcue.rcue.ue_1.id],
disabled=read_only,
)
@ -91,7 +92,8 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append(
_gen_but_niveau_ue(
dec_rcue.rcue.ue_2,
dec_rcue.rcue.moy_ue_2,
deca.decisions_ues[dec_rcue.rcue.ue_2.id].moy_ue,
# dec_rcue.rcue.moy_ue_2,
deca.decisions_ues[dec_rcue.rcue.ue_2.id],
disabled=read_only,
)

View File

@ -81,6 +81,12 @@ NOTES_ATTENTE = -1002.0 # note "en attente" (se calcule comme une note neutrali
INSCRIT = "I"
DEMISSION = "D"
DEF = "DEF"
ETATS_INSCRIPTION = {
INSCRIT: "Inscrit",
DEMISSION: "Démission",
DEF: "Défaillant",
}
# Types de modules
class ModuleType(IntEnum):

View File

@ -2370,6 +2370,12 @@ def formsemestre_validation_but(
niveaux mais {len(deca.decisions_rcue_by_niveau)} regroupements RCUE.</div>"""
if deca.parcour is None:
warning += """<div class="warning">L'étudiant n'est pas inscrit à un parcours.</div>"""
if deca.formsemestre_impair and deca.inscription_etat_impair != scu.INSCRIT:
etat_ins = scu.ETATS_INSCRIPTION.get(deca.inscription_etat_impair, "inconnu?")
warning += f"""<div class="warning">{etat_ins} en S{deca.formsemestre_impair.semestre_id}"""
if deca.formsemestre_pair and deca.inscription_etat_pair != scu.INSCRIT:
etat_ins = scu.ETATS_INSCRIPTION.get(deca.inscription_etat_pair, "inconnu?")
warning += f"""<div class="warning">{etat_ins} en S{deca.formsemestre_pair.semestre_id}"""
H.append(
f"""
<div>
@ -2409,7 +2415,7 @@ def formsemestre_validation_but(
vos codes d'UE/RCUE/Année !</em>
</input>
</div>
<div class="but_buttons">
<input type="submit" value="Enregistrer ces décisions">
</div>