diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 7ab98972..273d1451 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -841,6 +841,7 @@ class DecisionsProposeesAnnee(DecisionsProposees): et autorisations d'inscription émises. Efface même si étudiant DEM ou DEF. Si à cheval, n'efface que pour le semestre d'origine du deca. + (commite la session.) """ if only_one_sem or self.a_cheval: # N'efface que les autorisations venant de ce semestre, diff --git a/app/scodoc/sco_recapcomplet.py b/app/scodoc/sco_recapcomplet.py index de629931..b9cea860 100644 --- a/app/scodoc/sco_recapcomplet.py +++ b/app/scodoc/sco_recapcomplet.py @@ -166,9 +166,15 @@ def formsemestre_recapcomplet( H.append("

") if mode_jury: H.append( - f"""Calcul automatique des décisions du jury

""" + }">Calcul automatique des décisions du jury +

Effacer toutes les décisions de jury du semestre +

+

+ """ ) else: H.append( diff --git a/app/templates/confirm_dialog.html b/app/templates/confirm_dialog.html index 8067f6c7..5ef4e160 100644 --- a/app/templates/confirm_dialog.html +++ b/app/templates/confirm_dialog.html @@ -7,7 +7,7 @@

{{ title }}

- {{ explanation }} + {{ explanation|safe }}
diff --git a/app/views/notes.py b/app/views/notes.py index 16bc0261..7b1eec23 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -2831,6 +2831,11 @@ def formsemestre_jury_but_recap(formsemestre_id: int, selected_etudid: int = Non ) +@bp.route( + "/formsemestre_jury_but_erase/", + methods=["GET", "POST"], + defaults={"etudid": None}, +) @bp.route( "/formsemestre_jury_but_erase//", methods=["GET", "POST"], @@ -2842,42 +2847,64 @@ def formsemestre_jury_but_erase( ): """Supprime la décision de jury BUT pour cette année. Si only_one_sem, n'efface que pour le formsemestre indiqué, pas les deux de l'année. + Si l'étudiant n'est pas spécifié, efface les décisions de tous les inscrits. """ only_one_sem = int(request.args.get("only_one_sem") or False) + if not sco_permissions_check.can_validate_sem(formsemestre_id): + raise ScoValueError("opération non autorisée") formsemestre = FormSemestre.query.get_or_404(formsemestre_id) if not formsemestre.formation.is_apc(): raise ScoValueError("semestre non BUT") - etud: Identite = Identite.query.get_or_404(etudid) - if not sco_permissions_check.can_validate_sem(formsemestre_id): - raise ScoValueError("opération non autorisée") - dest_url = url_for( - "notes.formsemestre_validation_but", - scodoc_dept=g.scodoc_dept, - formsemestre_id=formsemestre_id, - etudid=etudid, - ) + if etudid is None: + etud = None + etuds = formsemestre.get_inscrits(include_demdef=True) + dest_url = url_for( + "notes.formsemestre_saisie_jury", + scodoc_dept=g.scodoc_dept, + formsemestre_id=formsemestre_id, + ) + else: + etud: Identite = Identite.query.get_or_404(etudid) + etuds = [etud] + dest_url = url_for( + "notes.formsemestre_validation_but", + scodoc_dept=g.scodoc_dept, + formsemestre_id=formsemestre_id, + etudid=etudid, + ) if request.method == "POST": - deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) - deca.erase(only_one_sem=only_one_sem) - db.session.commit() - log(f"formsemestre_jury_but_erase({formsemestre_id}, {etudid})") + with sco_cache.DeferredSemCacheManager(): + for etud in etuds: + deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) + deca.erase(only_one_sem=only_one_sem) + log(f"formsemestre_jury_but_erase({formsemestre_id}, {etudid})") flash( - "décisions de jury du semestre effacées" - if only_one_sem - else "décisions de jury des semestres de l'année BUT effacées" + ( + "décisions de jury du semestre effacées" + if only_one_sem + else "décisions de jury des semestres de l'année BUT effacées" + ) + + f" pour {len(etuds)} étudiant{'s' if len(etuds) > 1 else ''}" ) return redirect(dest_url) return render_template( "confirm_dialog.html", - title=f"Effacer les validations de jury de {etud.nomprenom} ?", - explanation=f"""Les validations d'UE et autorisations de passage + title=f"""Effacer les validations de jury { + ("de" + etud.nomprenom) + if etud + else ("des " + str(len(etuds)) + " étudiants inscrits dans ce semestre") + } ?""", + explanation=( + f"""Les validations d'UE et autorisations de passage du semestre S{formsemestre.semestre_id} seront effacées.""" - if only_one_sem - else """Ses validations de toutes les UE, RCUE (compétences) et année + if only_one_sem + else """Les validations de toutes les UE, RCUE (compétences) et année issues de cette année scolaire seront effacées. Les décisions des années scolaires précédentes ne seront pas modifiées. - """, + """ + ) + + """
Cette opération est irréversible !
""", cancel_url=dest_url, )