Fix formulaire_feuille_appel. A vérifier/simplifier ?

This commit is contained in:
Emmanuel Viennet 2024-08-23 17:59:55 +02:00
parent 6ab027dffe
commit ce80b9f765
4 changed files with 56 additions and 34 deletions

View File

@ -53,4 +53,6 @@ class FeuilleAppelPreForm(FlaskForm):
}, },
) )
submit = SubmitField("Télécharger la liste d'émargement") submit = SubmitField(
"Télécharger la liste d'émargement", id="btn-submit", name="btn-submit"
)

View File

@ -39,7 +39,7 @@ from urllib.parse import parse_qs
from flask import url_for, g, render_template, request from flask import url_for, g, render_template, request
from flask_login import current_user from flask_login import current_user
from app import db from app import db, log
from app.models import FormSemestre, Identite, ScolarEvent from app.models import FormSemestre, Identite, ScolarEvent
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.scodoc import html_sco_header from app.scodoc import html_sco_header
@ -225,7 +225,7 @@ def menu_groups_choice(
submit_on_change=False, submit_on_change=False,
default_deselect_others=True, default_deselect_others=True,
html_export=True, html_export=True,
change_event=None, change_event=None, # XXX ???
): ):
"""menu pour selection groupes """menu pour selection groupes
group_ids est la liste des groupes actuellement sélectionnés group_ids est la liste des groupes actuellement sélectionnés
@ -369,6 +369,7 @@ class DisplayedGroupsInfos:
try: try:
group_ids = [int(g) for g in group_ids] group_ids = [int(g) for g in group_ids]
except ValueError as exc: except ValueError as exc:
log(f"DisplayedGroupsInfos: invalid group_id '{group_ids}'")
raise ScoValueError( raise ScoValueError(
"identifiant de groupe invalide (mettre à jour vos bookmarks ?)" "identifiant de groupe invalide (mettre à jour vos bookmarks ?)"
) from exc ) from exc
@ -973,7 +974,7 @@ def tab_absences_html(groups_infos, etat=None):
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
formsemestre_id=groups_infos.formsemestre_id, formsemestre_id=groups_infos.formsemestre_id,
) )
+ "&" + "?"
+ groups_infos.groups_query_args + groups_infos.groups_query_args
) )

View File

@ -19,7 +19,13 @@
<h2>Préparation de la feuille d'émargement : <span style="color:crimson">{{group_name}}</span></h2> <h2>Préparation de la feuille d'émargement : <span style="color:crimson">{{group_name}}</span></h2>
<div class="scobox"> <div class="scobox">
<form action="" method="post"> <form
id="feuille_emargement"
action="{{request.base_url}}"
method="post"
onsubmit="serializeGroupIds(event)"
>
{{ form.hidden_tag() }}
<div class="infos-button">Groupes&nbsp;: {{grp|safe}}</div> <div class="infos-button">Groupes&nbsp;: {{grp|safe}}</div>
<div class="part"> <div class="part">
@ -50,4 +56,24 @@
{% include "sco_timepicker.j2" %} {% include "sco_timepicker.j2" %}
<script src="{{scu.STATIC_DIR}}/js/groups_view.js"></script> <script src="{{scu.STATIC_DIR}}/js/groups_view.js"></script>
<script src="{{scu.STATIC_DIR}}/libjs/purl.js"></script> <script src="{{scu.STATIC_DIR}}/libjs/purl.js"></script>
<script>
function serializeGroupIds(event) {
// Dealing with multiselect
event.preventDefault();
var form = document.getElementById("feuille_emargement");
var groupIdsField = form.elements["group_ids"];
// Check if the group_ids field exists and is an array
if (groupIdsField && Array.isArray(groupIdsField.value)) {
// Convert the array to a comma-separated string
var serializedValue = groupIdsField.value.join(',');
// Replace the field's value with the serialized string
groupIdsField.value = serializedValue;
}
// Now submit the form
form.submit();
}
</script>
{% endblock scripts %} {% endblock scripts %}

View File

@ -5,16 +5,15 @@ Nouvelles vues pour les groupes
from flask import render_template, request from flask import render_template, request
from app import log
from app.decorators import ( from app.decorators import (
scodoc, scodoc,
permission_required, permission_required,
) )
from app.forms.scolar import groups_form from app.forms.scolar import groups_form
from app.models import ( from app.models import FormSemestre
FormSemestre,
)
from app.scodoc.sco_excel import excel_feuille_listeappel from app.scodoc.sco_excel import excel_feuille_listeappel
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_groups_view import DisplayedGroupsInfos, menu_groups_choice from app.scodoc.sco_groups_view import DisplayedGroupsInfos, menu_groups_choice
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
from app.scodoc import sco_utils as scu from app.scodoc import sco_utils as scu
@ -22,34 +21,35 @@ from app.views import ScoData
from app.views import scolar_bp as bp from app.views import scolar_bp as bp
@bp.route("/formulaire_feuille_appel", methods=["GET", "POST"]) @bp.route("/formulaire_feuille_appel/<int:formsemestre_id>", methods=["GET", "POST"])
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def formulaire_feuille_appel(): def formulaire_feuille_appel(formsemestre_id: int):
"""Formulaire de feuille d'appel """Formulaire de feuille d'appel
GET : Affiche le formulaire de remplissage de la feuille d'appel GET Affiche le formulaire de remplissage de la feuille d'appel
POST : Retourne la feuille d'appelle correspondante POST (soumission) retourne la feuille d'appel correspondante
QUERY QUERY
----- -----
formsemestre_id:<int:formsemestre_id>
group_ids:<list:<int:group_id>> group_ids:<list:<int:group_id>>
""" """
formsemestre_id: int = request.args.get("formsemestre_id") formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
try:
formsemestre_id = int(formsemestre_id)
except ValueError:
formsemestre_id = None
formsemestre: FormSemestre = FormSemestre.get_formsemestre(formsemestre_id) if request.method == "GET":
group_ids: list[int] = request.args.getlist("group_ids")
data = {"group_ids": group_ids}
else:
group_ids_str = request.form.get("group_ids")
try:
group_ids = [int(gid) for gid in group_ids_str.split(",") if gid]
except ValueError as exc:
log(f"formulaire_feuille_appel: group_ids invalide: {group_ids_str[:100]}")
raise ScoValueError("groupes invalides") from exc
data = {}
group_ids: list[int] = request.args.getlist("group_ids") form = groups_form.FeuilleAppelPreForm(request.form, data=data)
form: groups_form.FeuilleAppelPreForm = groups_form.FeuilleAppelPreForm(
request.form
)
groups_infos = DisplayedGroupsInfos( groups_infos = DisplayedGroupsInfos(
group_ids, group_ids,
@ -57,7 +57,7 @@ def formulaire_feuille_appel():
select_all_when_unspecified=True, select_all_when_unspecified=True,
) )
if request.method == "POST": if form.validate_on_submit():
edt_params: dict = { edt_params: dict = {
"date": form.date.data or "", "date": form.date.data or "",
"heure": form.heure.data or "", "heure": form.heure.data or "",
@ -65,14 +65,6 @@ def formulaire_feuille_appel():
"ens": form.ens.data or "", "ens": form.ens.data or "",
} }
form_group_ids: list[str] = request.form.get("group_ids", "").split(",")
if form_group_ids:
groups_infos = DisplayedGroupsInfos(
form_group_ids,
formsemestre_id=formsemestre_id,
select_all_when_unspecified=True,
)
xls = excel_feuille_listeappel( xls = excel_feuille_listeappel(
groups_infos.formsemestre, groups_infos.formsemestre,
groups_infos.groups_titles, groups_infos.groups_titles,
@ -90,4 +82,5 @@ def formulaire_feuille_appel():
form=form, form=form,
group_name=groups_infos.groups_titles, group_name=groups_infos.groups_titles,
grp=menu_groups_choice(groups_infos, html_export=False), grp=menu_groups_choice(groups_infos, html_export=False),
formsemestre_id=formsemestre_id,
) )