diff --git a/app/but/jury_but.py b/app/but/jury_but.py index d4e7dd8cf..bf39b7128 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -1009,7 +1009,7 @@ class DecisionsProposeesRCUE(DecisionsProposees): sco_codes.DEM if inscription_etat == scu.DEMISSION else sco_codes.DEF ] return - self.validation = rcue.query_validations().first() + self.validation: ApcValidationRCUE = rcue.query_validations().first() if self.validation is not None: self.code_valide = self.validation.code if rcue.est_compensable(): @@ -1379,30 +1379,36 @@ class DecisionsProposeesUE(DecisionsProposees): inscription_etat: str = scu.INSCRIT, ): self.paire = paire + self.formsemestre = formsemestre + "Le formsemestre courant auquel appartient l'UE, ou None si validation antérieure" + self.rcue: RegroupementCoherentUE = rcue + "Le rcue auquel est rattaché cette UE, ou None" self.ue: UniteEns = rcue.ue_2 if paire else rcue.ue_1 self.inscription_etat = inscription_etat # Une UE peut être validée plusieurs fois en cas de redoublement # (qu'elle soit capitalisée ou non) # mais ici on a restreint au formsemestre donc une seule (prend la première) - validation = ScolarFormSemestreValidation.query.filter_by( - etudid=etud.id, formsemestre_id=formsemestre.id, ue_id=self.ue.id << XXX - ).first() + + self.cur_validation = ( + rcue.validation_ue_cur_pair if paire else rcue.validation_ue_cur_impair + ) + "validation dans le formsemestre courant" + autre_validation = ( + rcue.validation_ue_best_pair if paire else rcue.validation_ue_best_impair + ) + "validation antérieure ou capitalisée" + # la validation à afficher est celle "en cours", sauf si UE antérieure + validation = self.cur_validation if self.formsemestre else autre_validation super().__init__( etud=etud, code_valide=validation.code if validation is not None else None, ) self.validation = validation - "validation dans le formsemestre courant" - self.formsemestre = formsemestre - self.rcue: RegroupementCoherentUE = rcue - "Le rcue auquel est rattaché cette UE, ou None" + "validation dans le formsemestre courant ou à défaut celle enregistrée" + # Editable ou pas ? # si ue courante, éditable. - self.editable = ( - (self.rcue.ue_cur_pair is not None) - if paire - else (self.rcue.ue_cur_impair is not None) - ) + self.editable = self.cur_validation is not None res: ResultatsSemestreBUT = ( self.rcue.res_pair if paire else self.rcue.res_impair ) @@ -1427,8 +1433,9 @@ class DecisionsProposeesUE(DecisionsProposees): # Moyenne de l'UE ? ue_status = self.rcue.ue_status_pair if paire else self.rcue.ue_status_impair - self.moy_ue = ue_status["cur_moy_ue"] - self.moy_ue_with_cap = ue_status["moy"] + if ue_status: + self.moy_ue = ue_status["cur_moy_ue"] + self.moy_ue_with_cap = ue_status["moy"] self.ue_status = ue_status self.codes = [self.codes[0]] + sorted(self.codes[1:]) @@ -1440,6 +1447,11 @@ class DecisionsProposeesUE(DecisionsProposees): """Calcul des .codes attribuables et de l'explanation associée""" if self.inscription_etat != scu.INSCRIT: return + # Si UE validée antérieure, on ne peut pas changer le code + if not self.formsemestre: + self.codes = [self.validation.code] if self.validation else [] + self.explanation = "enregistrée" + return if ( self.moy_ue > (sco_codes.CursusBUT.BARRE_MOY - sco_codes.NOTES_TOLERANCE) ) or self.formsemestre.modalite == "EXT": @@ -1499,6 +1511,8 @@ class DecisionsProposeesUE(DecisionsProposees): def erase(self): """Efface la décision de jury de cet étudiant pour cette UE""" # par prudence, on requete toutes les validations, en cas de doublons + if not self.formsemestre: + return # antérieure, rien à effacer validations = ScolarFormSemestreValidation.query.filter_by( etudid=self.etud.id, formsemestre_id=self.formsemestre.id, ue_id=self.ue.id ) diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py index cfb778152..f2ead5ac2 100644 --- a/app/but/jury_but_view.py +++ b/app/but/jury_but_view.py @@ -199,12 +199,40 @@ def _gen_but_niveau_ue( """ + elif dec_ue.formsemestre is None: + # Validation d'UE antérieure (semestre hors année scolaire courante) + if dec_ue.validation: + moy_ue_str = f"""{scu.fmt_note(dec_ue.validation.moy_ue)}""" + scoplement = f"""
+
+ UE {ue.acronyme} antérieure + validée {dec_ue.validation.code} + le {dec_ue.validation.event_date.strftime("%d/%m/%Y")} + +
+
Non reprise dans l'année en cours
+
+ """ + else: + moy_ue_str = """-""" + scoplement = """
+
+ Pas d'UE en cours ou validée dans cette compétence de ce côté. +
+
+ """ else: moy_ue_str = f"""{scu.fmt_note(dec_ue.moy_ue)}""" if dec_ue.code_valide: - scoplement = f"""
-
Code {dec_ue.code_valide} enregistré le {dec_ue.validation.event_date.strftime("%d/%m/%Y")} + date_str = ( + f"""enregistré le {dec_ue.validation.event_date.strftime("%d/%m/%Y")} à {dec_ue.validation.event_date.strftime("%Hh%M")} + """ + if dec_ue.validation and dec_ue.validation.event_date + else "" + ) + scoplement = f"""
+
Code {dec_ue.code_valide} {date_str}
"""