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)