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_login import current_user
from app import db
from app import db, log
from app.models import FormSemestre, Identite, ScolarEvent
import app.scodoc.sco_utils as scu
from app.scodoc import html_sco_header
@ -225,7 +225,7 @@ def menu_groups_choice(
submit_on_change=False,
default_deselect_others=True,
html_export=True,
change_event=None,
change_event=None, # XXX ???
):
"""menu pour selection groupes
group_ids est la liste des groupes actuellement sélectionnés
@ -369,6 +369,7 @@ class DisplayedGroupsInfos:
try:
group_ids = [int(g) for g in group_ids]
except ValueError as exc:
log(f"DisplayedGroupsInfos: invalid group_id '{group_ids}'")
raise ScoValueError(
"identifiant de groupe invalide (mettre à jour vos bookmarks ?)"
) from exc
@ -973,7 +974,7 @@ def tab_absences_html(groups_infos, etat=None):
scodoc_dept=g.scodoc_dept,
formsemestre_id=groups_infos.formsemestre_id,
)
+ "&"
+ "?"
+ 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>
<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="part">
@ -50,4 +56,24 @@
{% include "sco_timepicker.j2" %}
<script src="{{scu.STATIC_DIR}}/js/groups_view.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 %}

View File

@ -5,16 +5,15 @@ Nouvelles vues pour les groupes
from flask import render_template, request
from app import log
from app.decorators import (
scodoc,
permission_required,
)
from app.forms.scolar import groups_form
from app.models import (
FormSemestre,
)
from app.models import FormSemestre
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_permissions import Permission
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
@bp.route("/formulaire_feuille_appel", methods=["GET", "POST"])
@bp.route("/formulaire_feuille_appel/<int:formsemestre_id>", methods=["GET", "POST"])
@scodoc
@permission_required(Permission.ScoView)
def formulaire_feuille_appel():
def formulaire_feuille_appel(formsemestre_id: int):
"""Formulaire de feuille d'appel
GET : Affiche le formulaire de remplissage de la feuille d'appel
POST : Retourne la feuille d'appelle correspondante
GET Affiche le formulaire de remplissage de la feuille d'appel
POST (soumission) retourne la feuille d'appel correspondante
QUERY
-----
formsemestre_id:<int:formsemestre_id>
group_ids:<list:<int:group_id>>
"""
formsemestre_id: int = request.args.get("formsemestre_id")
try:
formsemestre_id = int(formsemestre_id)
except ValueError:
formsemestre_id = None
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
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 = groups_form.FeuilleAppelPreForm(
request.form
)
form = groups_form.FeuilleAppelPreForm(request.form, data=data)
groups_infos = DisplayedGroupsInfos(
group_ids,
@ -57,7 +57,7 @@ def formulaire_feuille_appel():
select_all_when_unspecified=True,
)
if request.method == "POST":
if form.validate_on_submit():
edt_params: dict = {
"date": form.date.data or "",
"heure": form.heure.data or "",
@ -65,14 +65,6 @@ def formulaire_feuille_appel():
"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(
groups_infos.formsemestre,
groups_infos.groups_titles,
@ -90,4 +82,5 @@ def formulaire_feuille_appel():
form=form,
group_name=groups_infos.groups_titles,
grp=menu_groups_choice(groups_infos, html_export=False),
formsemestre_id=formsemestre_id,
)