forked from ScoDoc/ScoDoc
Assiduité : ajout_justif_etud : dates avec heures
This commit is contained in:
parent
1309043a98
commit
a7c7bd655d
@ -74,8 +74,6 @@ div.submit > input {
|
||||
|
||||
<div>
|
||||
{{ form.date_fin.label }} : {{ form.date_fin }}
|
||||
<span class="help">si le jour de fin est différent,
|
||||
les heures seront ignorées (journées complètes)</span>
|
||||
{{ render_field_errors(form, 'date_fin') }}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user