From a7c7bd655db33f123b1b221d6418e4fa5bf15e40 Mon Sep 17 00:00:00 2001 From: Iziram Date: Mon, 25 Mar 2024 16:15:01 +0100 Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9=20:=20ajout=5Fjustif=5Fetud=20:?= =?UTF-8?q?=20dates=20avec=20heures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/ajout_justificatif_etud.j2 | 2 - app/views/assiduites.py | 86 +++++++++++-------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/app/templates/assiduites/pages/ajout_justificatif_etud.j2 b/app/templates/assiduites/pages/ajout_justificatif_etud.j2 index e9f725e0b..311d25c7e 100644 --- a/app/templates/assiduites/pages/ajout_justificatif_etud.j2 +++ b/app/templates/assiduites/pages/ajout_justificatif_etud.j2 @@ -74,8 +74,6 @@ div.submit > input {
{{ form.date_fin.label }} : {{ form.date_fin }} - si le jour de fin est différent, - les heures seront ignorées (journées complètes) {{ render_field_errors(form, 'date_fin') }}
diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 527d04043..cb776994e 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -299,7 +299,7 @@ def ajout_assiduite_etud() -> str | Response: def _get_dates_from_assi_form( form: AjoutAssiOrJustForm, - all_day: bool = False, + from_justif: bool = False, ) -> tuple[ bool, datetime.datetime | None, datetime.datetime | None, datetime.datetime | None ]: @@ -327,32 +327,15 @@ def _get_dates_from_assi_form( date_fin = None form.set_error("date fin invalide", form.date_fin) - if date_fin: - # ignore les heures si plusieurs jours - - # Assiduité : garde les heures inscritent dans le formulaire - # Justificatif : ignore les heures inscrites dans le formulaire (0h -> 23h59) - - heure_debut = ( - datetime.time.fromisoformat(debut_jour) - if not all_day - else datetime.time(0, 0, 0) - ) # 0h ou ConfigAssiduite.MorningTime - heure_fin = ( - datetime.time.fromisoformat(fin_jour) - if not all_day - else datetime.time(23, 59, 59) - ) # 23h59 ou ConfigAssiduite.AfternoonTime + if not from_justif and date_fin: + # Ne prends pas en compte les heures pour les assiduités sur plusieurs jours + heure_debut = datetime.time.fromisoformat(debut_jour) + heure_fin = datetime.time.fromisoformat(fin_jour) else: try: - if all_day: - heure_debut = datetime.time.fromisoformat( - form.heure_debut.data or "00:00" - ) - else: - heure_debut = datetime.time.fromisoformat( - form.heure_debut.data or debut_jour - ) + heure_debut = datetime.time.fromisoformat( + form.heure_debut.data or debut_jour + ) except ValueError: form.set_error("heure début invalide", form.heure_debut) if bool(form.heure_debut.data) != bool(form.heure_fin.data): @@ -360,10 +343,7 @@ def _get_dates_from_assi_form( "Les deux heures début et fin doivent être spécifiées, ou aucune" ) try: - if all_day: - heure_fin = datetime.time.fromisoformat(form.heure_fin.data or "23:59") - else: - heure_fin = datetime.time.fromisoformat(form.heure_fin.data or fin_jour) + heure_fin = datetime.time.fromisoformat(form.heure_fin.data or fin_jour) except ValueError: form.set_error("heure fin invalide", form.heure_fin) @@ -398,6 +378,19 @@ def _get_dates_from_assi_form( # Ajoute time zone serveur dt_debut_tz_server = scu.TIME_ZONE.localize(dt_debut) dt_fin_tz_server = scu.TIME_ZONE.localize(dt_fin) + + if from_justif: + cas: list[bool] = [ + # cas 1 (date de fin vide et pas d'heure de début) + not form.date_fin.data and not form.heure_debut.data, + # cas 2 (date de fin et pas d'heures) + form.date_fin.data != "" and not form.heure_debut.data, + ] + + if any(cas): + dt_debut_tz_server = dt_debut_tz_server.replace(hour=0, minute=0) + dt_fin_tz_server = dt_fin_tz_server.replace(hour=23, minute=59) + dt_entry_date_tz_server = ( scu.TIME_ZONE.localize(dt_entry_date) if dt_entry_date else None ) @@ -753,6 +746,34 @@ def ajout_justificatif_etud(): ) +def _verif_date_form_justif( + form: AjoutJustificatifEtudForm, deb: datetime.datetime, fin: datetime.datetime +) -> tuple[datetime.datetime, datetime.datetime]: + """Gère les cas suivants : + - si on indique seulement une date de debut : journée 0h-23h59 + - si on indique date de debut et heures : journée +heure deb/fin + (déjà géré par _get_dates_from_assi_form) + - Si on indique une date de début et de fin sans heures : Journées 0h-23h59 + - Si on indique une date de début et de fin avec heures : On fait un objet avec + datedeb/heuredeb + datefin/heurefin (déjà géré par _get_dates_from_assi_form) + """ + + cas: list[bool] = [ + # cas 1 + not form.date_fin.data and not form.heure_debut.data, + # cas 3 + form.date_fin.data != "" and not form.heure_debut.data, + ] + + if any(cas): + deb = deb.replace(hour=0, minute=0) + fin = fin.replace(hour=23, minute=59) + + print(f"DEBUG {cas=}") + + return deb, fin + + def _record_justificatif_etud( etud: Identite, form: AjoutJustificatifEtudForm, justif: Justificatif | None = None ) -> bool: @@ -769,7 +790,7 @@ def _record_justificatif_etud( dt_debut_tz_server, dt_fin_tz_server, dt_entry_date_tz_server, - ) = _get_dates_from_assi_form(form, all_day=True) + ) = _get_dates_from_assi_form(form, from_justif=True) if not ok: log("_record_justificatif_etud: dates invalides") form.set_error("Erreur: dates invalides") @@ -831,11 +852,6 @@ def _record_justificatif_etud( db.session.rollback() return False db.session.commit() - # FIX TEMPORAIRE: - # on reprend toutes les assiduités et tous les justificatifs - # pour utiliser le "reset" (remise en "non_just") des assiduités - # (à terme, il faudrait ne recalculer que les assiduités impactées) - # VOIR TODO dans compute_assiduites_justified justif.justifier_assiduites() scass.simple_invalidate_cache(justif.to_dict(), etud.id) flash(message)