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 = [] self.rcues_annee = []
"RCUEs de l'année" "RCUEs de l'année"
self.inscription_etat = etud.inscription_etat(formsemestre_last.id) 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: if self.formsemestre_impair is not None:
self.validation = ApcValidationAnnee.query.filter_by( 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.ues_impair, self.ues_pair = self.compute_ues_annee() # pylint: disable=all
self.decisions_ues = { self.decisions_ues = {
ue.id: DecisionsProposeesUE( ue.id: DecisionsProposeesUE(
etud, formsemestre_impair, ue, self.inscription_etat etud, formsemestre_impair, ue, self.inscription_etat_impair
) )
for ue in self.ues_impair for ue in self.ues_impair
} }
@ -270,7 +281,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
self.decisions_ues.update( self.decisions_ues.update(
{ {
ue.id: DecisionsProposeesUE( ue.id: DecisionsProposeesUE(
etud, formsemestre_pair, ue, self.inscription_etat etud, formsemestre_pair, ue, self.inscription_etat_pair
) )
for ue in self.ues_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. """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 ]. Ramène [ listes des UE du semestre impair, liste des UE du semestre pair ].
""" """
etudid = self.etud.id
ues_sems = [] ues_sems = []
for (formsemestre, res) in ( for (formsemestre, res) in (
(self.formsemestre_impair, self.res_impair), (self.formsemestre_impair, self.res_impair),
@ -607,7 +617,10 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def record(self, code: str, no_overwrite=False): def record(self, code: str, no_overwrite=False):
"""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 no_overwrite, ne fait rien si un code est déjà enregistré. 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: if code and not code in self.codes:
raise ScoValueError( raise ScoValueError(
f"code annee <tt>{html.escape(code)}</tt> invalide pour formsemestre {html.escape(self.formsemestre)}" 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) sco_cache.invalidate_formsemestre(formsemestre_id=self.formsemestre_pair.id)
def record_all(self): 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 = ( decisions = (
list(self.decisions_ues.values()) list(self.decisions_ues.values())
+ list(self.decisions_rcue_by_niveau.values()) + list(self.decisions_rcue_by_niveau.values())
@ -681,6 +696,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
"""Efface les décisions de jury de cet étudiant """Efface les décisions de jury de cet étudiant
pour cette année: décisions d'UE, de RCUE, d'année, pour cette année: décisions d'UE, de RCUE, d'année,
et autorisations d'inscription émises. et autorisations d'inscription émises.
Efface même si étudiant DEM ou DEF.
""" """
if only_one_sem: if only_one_sem:
# N'efface que les autorisations venant de ce semestre, # N'efface que les autorisations venant de ce semestre,
@ -831,6 +847,10 @@ class DecisionsProposeesRCUE(DecisionsProposees):
def record(self, code: str, no_overwrite=False): def record(self, code: str, no_overwrite=False):
"""Enregistre le code""" """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: if code and not code in self.codes:
raise ScoValueError( raise ScoValueError(
f"code UE invalide pour ue_id={self.ue.id}: {html.escape(code)}" f"code UE invalide pour ue_id={self.ue.id}: {html.escape(code)}"
@ -845,6 +865,9 @@ class DecisionsProposeesRCUE(DecisionsProposees):
if code is None: if code is None:
self.validation = None self.validation = None
else: 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( self.validation = ApcValidationRCUE(
etudid=self.etud.id, etudid=self.etud.id,
formsemestre_id=self.rcue.formsemestre_2.id, formsemestre_id=self.rcue.formsemestre_2.id,
@ -940,7 +963,7 @@ class DecisionsProposeesUE(DecisionsProposees):
self.rcue: RegroupementCoherentUE = None self.rcue: RegroupementCoherentUE = None
"Le rcue auquel est rattaché cette UE, ou None" "Le rcue auquel est rattaché cette UE, ou None"
self.inscription_etat = inscription_etat 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: if ue.type == sco_codes.UE_SPORT:
self.explanation = "UE bonus, pas de décision de jury" self.explanation = "UE bonus, pas de décision de jury"
self.codes = [] # aucun code proposé self.codes = [] # aucun code proposé

View File

@ -82,7 +82,8 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append( H.append(
_gen_but_niveau_ue( _gen_but_niveau_ue(
dec_rcue.rcue.ue_1, 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], deca.decisions_ues[dec_rcue.rcue.ue_1.id],
disabled=read_only, disabled=read_only,
) )
@ -91,7 +92,8 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append( H.append(
_gen_but_niveau_ue( _gen_but_niveau_ue(
dec_rcue.rcue.ue_2, 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], deca.decisions_ues[dec_rcue.rcue.ue_2.id],
disabled=read_only, disabled=read_only,
) )

View File

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

View File

@ -2370,6 +2370,12 @@ def formsemestre_validation_but(
niveaux mais {len(deca.decisions_rcue_by_niveau)} regroupements RCUE.</div>""" niveaux mais {len(deca.decisions_rcue_by_niveau)} regroupements RCUE.</div>"""
if deca.parcour is None: if deca.parcour is None:
warning += """<div class="warning">L'étudiant n'est pas inscrit à un parcours.</div>""" 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( H.append(
f""" f"""
<div> <div>