diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 90978a23e..821f564b4 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 392e2a877..d6fdc7d6e 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 56a1eae55..db7de789a 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 7ac2834a9..c32d0cca8 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"""