diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 913297cc1..401f8993c 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -206,6 +206,7 @@ class DecisionsProposeesAnnee(DecisionsProposees): ): super().__init__(etud=etud) self.formsemestre_id = formsemestre.id + "l'id du formsemestre utilisé pour construire ce deca" formsemestre_impair, formsemestre_pair = self.comp_formsemestres(formsemestre) assert ( (formsemestre_pair is None) @@ -461,22 +462,9 @@ class DecisionsProposeesAnnee(DecisionsProposees): if (formsemestre is None) or (not formsemestre.formation.is_apc()): ues = [] else: - formation: Formation = formsemestre.formation - # Parcour dans lequel l'étudiant est inscrit, et liste des UEs - if res.etuds_parcour_id[etudid] is None: - # pas de parcour: prend toutes les UEs (non bonus) - ues = [ue for ue in res.etud_ues(etudid) if ue.type == UE_STANDARD] - ues.sort(key=lambda u: u.numero) - else: - parcour = ApcParcours.query.get(res.etuds_parcour_id[etudid]) - if parcour is not None: - self.parcour = parcour - ues = ( - formation.query_ues_parcour(parcour) - .filter_by(semestre_idx=formsemestre.semestre_id) - .order_by(UniteEns.numero) - .all() - ) + parcour, ues = list_ue_parcour_etud(formsemestre, self.etud, res) + if parcour is not None: + self.parcour = parcour ues_sems.append(ues) return ues_sems @@ -689,30 +677,40 @@ class DecisionsProposeesAnnee(DecisionsProposees): # s'il n'y a pas de code, efface dec.record(code, no_overwrite=True) - def erase(self): + def erase(self, only_one_sem=False): """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. """ - for dec_ue in self.decisions_ues.values(): - dec_ue.erase() - for dec_rcue in self.decisions_rcue_by_niveau.values(): - dec_rcue.erase() - if self.formsemestre_impair: + if only_one_sem: + # N'efface que les autorisations venant de ce semestre, + # et les validations de ses UEs ScolarAutorisationInscription.delete_autorisation_etud( - self.etud.id, self.formsemestre_impair.id + self.etud.id, self.formsemestre_id ) - if self.formsemestre_pair: - ScolarAutorisationInscription.delete_autorisation_etud( - self.etud.id, self.formsemestre_pair.id + for dec_ue in self.decisions_ues.values(): + if dec_ue.formsemestre.id == self.formsemestre_id: + dec_ue.erase() + else: + for dec_ue in self.decisions_ues.values(): + dec_ue.erase() + for dec_rcue in self.decisions_rcue_by_niveau.values(): + dec_rcue.erase() + if self.formsemestre_impair: + ScolarAutorisationInscription.delete_autorisation_etud( + self.etud.id, self.formsemestre_impair.id + ) + if self.formsemestre_pair: + ScolarAutorisationInscription.delete_autorisation_etud( + self.etud.id, self.formsemestre_pair.id + ) + validations = ApcValidationAnnee.query.filter_by( + etudid=self.etud.id, + formsemestre_id=self.formsemestre_impair.id, + ordre=self.annee_but, ) - validations = ApcValidationAnnee.query.filter_by( - etudid=self.etud.id, - formsemestre_id=self.formsemestre_impair.id, - ordre=self.annee_but, - ) - for validation in validations: - db.session.delete(validation) + for validation in validations: + db.session.delete(validation) db.session.flush() self.invalidate_formsemestre_cache() @@ -757,6 +755,26 @@ class DecisionsProposeesAnnee(DecisionsProposees): return line_sep.join(validations) +def list_ue_parcour_etud( + formsemestre: FormSemestre, etud: Identite, res: ResultatsSemestreBUT +) -> tuple[ApcParcours, list[UniteEns]]: + """Parcour dans lequel l'étudiant est inscrit, et liste des UEs pour ce semestre""" + if res.etuds_parcour_id[etud.id] is None: + parcour = None + # pas de parcour: prend toutes les UEs (non bonus) + ues = [ue for ue in res.etud_ues(etud.id) if ue.type == UE_STANDARD] + ues.sort(key=lambda u: u.numero) + else: + parcour = ApcParcours.query.get(res.etuds_parcour_id[etud.id]) + ues = ( + formsemestre.formation.query_ues_parcour(parcour) + .filter_by(semestre_idx=formsemestre.semestre_id) + .order_by(UniteEns.numero) + .all() + ) + return parcour, ues + + class DecisionsProposeesRCUE(DecisionsProposees): """Liste des codes de décisions que l'on peut proposer pour le RCUE de cet étudiant dans cette année. @@ -995,8 +1013,8 @@ class DecisionsProposeesUE(DecisionsProposees): etudid=self.etud.id, msg=f"Validation UE {self.ue.id}", ) - log(f"DecisionsProposeesUE: recording {self.validation}") db.session.add(self.validation) + log(f"DecisionsProposeesUE: recording {self.validation}") sco_cache.invalidate_formsemestre(formsemestre_id=self.formsemestre.id) self.recorded = True diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py index fa5171200..1aa72d1e9 100644 --- a/app/but/jury_but_view.py +++ b/app/but/jury_but_view.py @@ -6,13 +6,28 @@ """Jury BUT: affichage/formulaire """ -from flask import g, url_for -from app.models.etudiants import Identite -from app.scodoc import sco_utils as scu +import re + +import flask +from flask import flash, url_for +from flask import g, request + +from app import db +from app.but import jury_but from app.but.jury_but import DecisionsProposeesAnnee, DecisionsProposeesUE -from app.models import FormSemestre, FormSemestreInscription, UniteEns +from app.comp import res_sem +from app.comp.res_but import ResultatsSemestreBUT +from app.models import ( + FormSemestre, + FormSemestreInscription, + Identite, + UniteEns, + ScolarAutorisationInscription, +) +from app.scodoc import html_sco_header from app.scodoc.sco_exceptions import ScoValueError +from app.scodoc import sco_utils as scu def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str: @@ -29,17 +44,19 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str: erase_span = "" H.append( - f"""