diff --git a/app/forms/assiduite/ajout_assiduite_etud.py b/app/forms/assiduite/ajout_assiduite_etud.py
index 44b7f9c7e..deeec72c5 100644
--- a/app/forms/assiduite/ajout_assiduite_etud.py
+++ b/app/forms/assiduite/ajout_assiduite_etud.py
@@ -161,3 +161,30 @@ class AjoutJustificatifEtudForm(AjoutAssiOrJustForm):
validators=[DataRequired(message="This field is required.")],
)
fichiers = MultipleFileField(label="Ajouter des fichiers")
+
+
+class ChoixDateForm(FlaskForm):
+ def __init__(self, *args, **kwargs):
+ "Init form, adding a filed for our error messages"
+ super().__init__(*args, **kwargs)
+ self.ok = True
+ self.error_messages: list[str] = [] # used to report our errors
+
+ def set_error(self, err_msg, field=None):
+ "Set error message both in form and field"
+ self.ok = False
+ self.error_messages.append(err_msg)
+ if field:
+ field.errors.append(err_msg)
+
+ date = StringField(
+ "Date",
+ validators=[validators.Length(max=10)],
+ render_kw={
+ "class": "datepicker",
+ "size": 10,
+ "id": "date",
+ },
+ )
+ submit = SubmitField("Enregistrer")
+ cancel = SubmitField("Annuler", render_kw={"formnovalidate": True})
diff --git a/app/templates/assiduites/pages/choix_date.j2 b/app/templates/assiduites/pages/choix_date.j2
new file mode 100644
index 000000000..d743ac15e
--- /dev/null
+++ b/app/templates/assiduites/pages/choix_date.j2
@@ -0,0 +1,30 @@
+{% extends "sco_page.j2" %}
+{% import 'wtf.j2' as wtf %}
+
+{% block styles %}
+ {{super()}}
+
+{% endblock %}
+
+{% block app_content %}
+ {% for err_msg in form.error_messages %}
+
+ {{ err_msg }}
+
+ {% endfor %}
+ La date courante n'est pas dans le semestre ({{deb}} -> {{fin}})
+ Choissez une autre date
+
+
+
+{% endblock app_content %}
+{% block scripts %}
+{{ super() }}
+
+{% endblock scripts %}
\ No newline at end of file
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index bc9760b4b..152c266bc 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -43,6 +43,7 @@ from app.forms.assiduite.ajout_assiduite_etud import (
AjoutAssiOrJustForm,
AjoutAssiduiteEtudForm,
AjoutJustificatifEtudForm,
+ ChoixDateForm,
)
from app.models import (
Assiduite,
@@ -891,6 +892,56 @@ def calendrier_assi_etud():
).build()
+@bp.route("/choix_date", methods=["GET", "POST"])
+@scodoc
+@permission_required(Permission.AbsChange)
+def choix_date() -> str:
+ formsemestre_id = request.args.get("formsemestre_id")
+ formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
+
+ group_ids = request.args.get("group_ids")
+ moduleimpl_id = request.args.get("moduleimpl_id")
+ form = ChoixDateForm(request.form)
+
+ if form.validate_on_submit():
+ if form.cancel.data:
+ return redirect(url_for("scodoc.index"))
+ # Vérifier si date dans semestre
+ ok: bool = False
+ try:
+ date: datetime.date = datetime.datetime.strptime(
+ form.date.data, "%d/%m/%Y"
+ ).date()
+ if date < formsemestre.date_debut or date > formsemestre.date_fin:
+ form.set_error(
+ "La date sélectionnée n'est pas dans le semestre.", form.date
+ )
+ else:
+ ok = True
+ except ValueError:
+ form.set_error("Date invalide", form.date)
+
+ if ok:
+ return redirect(
+ url_for(
+ "assiduites.signal_assiduites_group",
+ scodoc_dept=g.scodoc_dept,
+ formsemestre_id=formsemestre_id,
+ group_ids=group_ids,
+ moduleimpl_id=moduleimpl_id,
+ jour=date.isoformat(),
+ )
+ )
+
+ return render_template(
+ "assiduites/pages/choix_date.j2",
+ form=form,
+ sco=ScoData(formsemestre=formsemestre),
+ deb=formsemestre.date_debut.strftime("%d/%m/%Y"),
+ fin=formsemestre.date_fin.strftime("%d/%m/%Y"),
+ )
+
+
@bp.route("/signal_assiduites_group")
@scodoc
@permission_required(Permission.AbsChange)
@@ -962,15 +1013,15 @@ def signal_assiduites_group():
real_date = scu.is_iso_formated(date, True).date()
if real_date < formsemestre.date_debut or real_date > formsemestre.date_fin:
- # Si le jour est hors semestre, indiquer une erreur
-
- # Formatage des dates pour le message d'erreur
- real_str = real_date.strftime("%d/%m/%Y")
- form_deb = formsemestre.date_debut.strftime("%d/%m/%Y")
- form_fin = formsemestre.date_fin.strftime("%d/%m/%Y")
- raise ScoValueError(
- f"Impossible de saisir l'assiduité pour le {real_str}"
- + f" : Jour en dehors du semestre ( {form_deb} → {form_fin}) "
+ # Si le jour est hors semestre, renvoyer vers choix date
+ return redirect(
+ url_for(
+ "assiduites.choix_date",
+ formsemestre_id=formsemestre_id,
+ group_ids=group_ids,
+ moduleimpl_id=moduleimpl_id,
+ scodoc_dept=g.scodoc_dept,
+ )
)
# --- Restriction en fonction du moduleimpl_id ---
@@ -1571,7 +1622,7 @@ def _action_modifier_assiduite(assi: Assiduite):
assi.description = form["description"]
possible_moduleimpl_id: str = form["moduleimpl_select"]
-
+
# Raise ScoValueError (si None et force module | Etudiant non inscrit | Module non reconnu)
assi.set_moduleimpl(possible_moduleimpl_id)