Suppression de toutes les décisions de jury d'un semestre

This commit is contained in:
Emmanuel Viennet 2023-01-30 15:30:25 -03:00
parent c7585f0425
commit e68cf29a17
4 changed files with 58 additions and 24 deletions

View File

@ -841,6 +841,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
et autorisations d'inscription émises. et autorisations d'inscription émises.
Efface même si étudiant DEM ou DEF. Efface même si étudiant DEM ou DEF.
Si à cheval, n'efface que pour le semestre d'origine du deca. Si à cheval, n'efface que pour le semestre d'origine du deca.
(commite la session.)
""" """
if only_one_sem or self.a_cheval: if only_one_sem or self.a_cheval:
# N'efface que les autorisations venant de ce semestre, # N'efface que les autorisations venant de ce semestre,

View File

@ -166,9 +166,15 @@ def formsemestre_recapcomplet(
H.append("<p>") H.append("<p>")
if mode_jury: if mode_jury:
H.append( H.append(
f"""<a class="stdlink" href="{url_for('notes.formsemestre_validation_auto', f"""<p><a class="stdlink" href="{url_for('notes.formsemestre_validation_auto',
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id) scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id)
}">Calcul automatique des décisions du jury</a></p>""" }">Calcul automatique des décisions du jury</a>
</p><a class="stdlink" href="{url_for('notes.formsemestre_jury_but_erase',
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id, only_one_sem=1)
}">Effacer <em>toutes</em> les décisions de jury du semestre</a>
<p>
</p>
"""
) )
else: else:
H.append( H.append(

View File

@ -7,7 +7,7 @@
<h2>{{ title }}</h2> <h2>{{ title }}</h2>
<div style="margin-top: 16px;"> <div style="margin-top: 16px;">
{{ explanation }} {{ explanation|safe }}
</div> </div>
<div style="margin-top: 16px;"> <div style="margin-top: 16px;">
<form method="post"> <form method="post">

View File

@ -2831,6 +2831,11 @@ def formsemestre_jury_but_recap(formsemestre_id: int, selected_etudid: int = Non
) )
@bp.route(
"/formsemestre_jury_but_erase/<int:formsemestre_id>",
methods=["GET", "POST"],
defaults={"etudid": None},
)
@bp.route( @bp.route(
"/formsemestre_jury_but_erase/<int:formsemestre_id>/<int:etudid>", "/formsemestre_jury_but_erase/<int:formsemestre_id>/<int:etudid>",
methods=["GET", "POST"], methods=["GET", "POST"],
@ -2842,14 +2847,25 @@ def formsemestre_jury_but_erase(
): ):
"""Supprime la décision de jury BUT pour cette année. """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 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) 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) formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
if not formsemestre.formation.is_apc(): if not formsemestre.formation.is_apc():
raise ScoValueError("semestre non BUT") raise ScoValueError("semestre non BUT")
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) etud: Identite = Identite.query.get_or_404(etudid)
if not sco_permissions_check.can_validate_sem(formsemestre_id): etuds = [etud]
raise ScoValueError("opération non autorisée")
dest_url = url_for( dest_url = url_for(
"notes.formsemestre_validation_but", "notes.formsemestre_validation_but",
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
@ -2857,27 +2873,38 @@ def formsemestre_jury_but_erase(
etudid=etudid, etudid=etudid,
) )
if request.method == "POST": if request.method == "POST":
with sco_cache.DeferredSemCacheManager():
for etud in etuds:
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
deca.erase(only_one_sem=only_one_sem) deca.erase(only_one_sem=only_one_sem)
db.session.commit()
log(f"formsemestre_jury_but_erase({formsemestre_id}, {etudid})") log(f"formsemestre_jury_but_erase({formsemestre_id}, {etudid})")
flash( flash(
(
"décisions de jury du semestre effacées" "décisions de jury du semestre effacées"
if only_one_sem if only_one_sem
else "décisions de jury des semestres de l'année BUT effacées" 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 redirect(dest_url)
return render_template( return render_template(
"confirm_dialog.html", "confirm_dialog.html",
title=f"Effacer les validations de jury de {etud.nomprenom} ?", title=f"""Effacer les validations de jury {
explanation=f"""Les validations d'UE et autorisations de passage ("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.""" du semestre S{formsemestre.semestre_id} seront effacées."""
if only_one_sem if only_one_sem
else """Ses validations de toutes les UE, RCUE (compétences) et année else """Les validations de toutes les UE, RCUE (compétences) et année
issues de cette année scolaire seront effacées. issues de cette année scolaire seront effacées.
Les décisions des années scolaires précédentes ne seront pas modifiées. Les décisions des années scolaires précédentes ne seront pas modifiées.
""", """
)
+ """<div class="warning">Cette opération est irréversible !</div>""",
cancel_url=dest_url, cancel_url=dest_url,
) )