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

+ +
+ {{ form.hidden_tag() }} + {{ form.date.label }} : {{ form.date }} +
+ {{ form.submit }} {{ form.cancel }} +
+
+ +{% 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)