From 1e3dbe26c57eaae00a72684b2ba1a0d44cb9f95e Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Fri, 10 Feb 2023 23:43:16 +0100 Subject: [PATCH] Jurys avec notes en ATTente. #592 --- app/but/jury_but.py | 17 ++++++++++++++++- app/comp/res_common.py | 6 ++++++ .../but/formsemestre_validation_auto_but.j2 | 2 ++ app/views/notes.py | 7 +++++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 90978a23..821f564b 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -779,6 +779,16 @@ class DecisionsProposeesAnnee(DecisionsProposees): if self.formsemestre_pair is not None: sco_cache.invalidate_formsemestre(formsemestre_id=self.formsemestre_pair.id) + def has_notes_en_attente(self) -> bool: + "Vrai si l'étudiant a au moins une note en attente dans le semestre origine de ce deca" + res = ( + self.res_pair + if self.formsemestre_pair + and (self.formsemestre.id == self.formsemestre_pair.id) + else self.res_impair + ) + return res and self.etud.id in res.get_etudids_attente() + def record_all( self, no_overwrite: bool = True, only_validantes: bool = False ) -> bool: @@ -787,11 +797,16 @@ class DecisionsProposeesAnnee(DecisionsProposees): - 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. - Si only_validantes, n'enregistre que des décisions "validantes" de droit: ADM ou CMP. + Si only_validantes, n'enregistre que des décisions "validantes" de droit: ADM ou CMP, + et seulement si l'étudiant n'a pas de notes en ATTente. Return: True si au moins un code modifié et enregistré. """ modif = False + # Vérification notes en attente dans formsemestre origine + if only_validantes and self.has_notes_en_attente(): + return False + # Toujours valider dans l'ordre UE, RCUE, Année annee_scolaire = self.formsemestre.annee_scolaire() # UEs diff --git a/app/comp/res_common.py b/app/comp/res_common.py index 392e2a87..d6fdc7d6 100644 --- a/app/comp/res_common.py +++ b/app/comp/res_common.py @@ -172,6 +172,12 @@ class ResultatsSemestre(ResultatsCache): if m.module.module_type == scu.ModuleType.SAE ] + def get_etudids_attente(self) -> set[int]: + """L'ensemble des etudids ayant au moins une note en ATTente""" + return set().union( + *[mr.etudids_attente for mr in self.modimpls_results.values()] + ) + # --- JURY... def load_validations(self) -> ValidationsSemestre: """Load validations, set attribute and return value""" diff --git a/app/templates/but/formsemestre_validation_auto_but.j2 b/app/templates/but/formsemestre_validation_auto_but.j2 index 56a1eae5..db7de789 100644 --- a/app/templates/but/formsemestre_validation_auto_but.j2 +++ b/app/templates/but/formsemestre_validation_auto_but.j2 @@ -17,6 +17,8 @@
  • N'enregistre que les décisions validantes de droit: ADM ou CMP.
  • +
  • N'enregistre pas de décision si l'étudiant a une ou plusieurs notes en ATTente. +
  • L'assiduité n'est pas prise en compte.
  • diff --git a/app/views/notes.py b/app/views/notes.py index 7ac2834a..c32d0cca 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -2473,10 +2473,13 @@ def formsemestre_validation_but( ) if deca.formsemestre_impair and deca.inscription_etat_impair != scu.INSCRIT: etat_ins = scu.ETATS_INSCRIPTION.get(deca.inscription_etat_impair, "inconnu?") - warning += f"""
    {etat_ins} en S{deca.formsemestre_impair.semestre_id}""" + warning += f"""
    {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"""
    {etat_ins} en S{deca.formsemestre_pair.semestre_id}""" + warning += f"""
    {etat_ins} en S{deca.formsemestre_pair.semestre_id}
    """ + if deca.has_notes_en_attente(): + warning += f"""
    {etud.nomprenom} a des notes en ATTente. + Vous devriez régler cela avant de statuer en jury !
    """ H.append( f"""