Fix: assiduité: heures des assiduités crées dans log et journal étudiant

This commit is contained in:
Emmanuel Viennet 2024-10-28 22:16:06 +01:00
parent 0895d7b195
commit d97cb6f309
5 changed files with 42 additions and 9 deletions

View File

@ -650,7 +650,9 @@ def assiduites_formsemestre_count(
@permission_required(Permission.AbsChange) @permission_required(Permission.AbsChange)
def assiduite_create(etudid: int = None, nip=None, ine=None): def assiduite_create(etudid: int = None, nip=None, ine=None):
""" """
Enregistrement d'assiduités pour un étudiant (etudid) Enregistrement d'assiduités pour un étudiant (etudid).
Si les heures n'ont pas de timezone, elles sont exprimées dans celle du serveur.
DATA DATA
---- ----

View File

@ -124,19 +124,25 @@ class Assiduite(ScoDocModel):
return data return data
def __str__(self) -> str: def __str__(self) -> str:
"chaine pour journaux et debug (lisible par humain français)" "chaine pour journaux et debug (lisible par humain français, en timezone serveur)"
try: try:
etat_str = EtatAssiduite(self.etat).name.lower().capitalize() etat_str = EtatAssiduite(self.etat).name.lower().capitalize()
except ValueError: except ValueError:
etat_str = "Invalide" etat_str = "Invalide"
# passe en timezone serveur
d_deb = self.date_debut.astimezone(scu.TIME_ZONE)
d_fin = self.date_fin.astimezone(scu.TIME_ZONE)
return f"""{etat_str} { return f"""{etat_str} {
"just." if self.est_just else "non just." "just." if self.est_just else "non just."
} de { } de {
self.date_debut.strftime("%d/%m/%Y %Hh%M") d_deb.strftime("%d/%m/%Y %Hh%M")
} à { } à {
self.date_fin.strftime("%d/%m/%Y %Hh%M") d_fin.strftime("%d/%m/%Y %Hh%M")
}""" }"""
def __repr__(self) -> str:
return f"<Assiduite {self.id}: {self.__str__()}>"
@classmethod @classmethod
def create_assiduite( def create_assiduite(
cls, cls,

View File

@ -432,7 +432,6 @@ def localize_datetime(date: datetime.datetime) -> datetime.datetime:
Tente de mettre l'offset de la timezone du serveur (ex : UTC+1) Tente de mettre l'offset de la timezone du serveur (ex : UTC+1)
Si erreur, mettra l'offset UTC Si erreur, mettra l'offset UTC
""" """
new_date: datetime.datetime = date new_date: datetime.datetime = date
if new_date.tzinfo is None: if new_date.tzinfo is None:
try: try:

View File

@ -5,7 +5,7 @@
function get_etudid_from_elem(e) { function get_etudid_from_elem(e) {
// renvoie l'etudid, obtenu a partir de l'id de l'element // renvoie l'etudid, obtenu a partir de l'id de l'element
// qui est soit de la forme xxxx-etudid, soit tout simplement etudid // qui est soit de la forme xxxx-etudid, soit tout simplement etudid
var etudid = e.id.split("-")[1]; let etudid = e.id.split("-")[1];
if (etudid == undefined) { if (etudid == undefined) {
return e.id; return e.id;
} else { } else {

View File

@ -5,9 +5,11 @@ Ecrit par HARTMANN Matthias
""" """
import datetime
from random import randint from random import randint
from types import NoneType from types import NoneType
from app.scodoc import sco_utils as scu
from tests.api.setup_test_api import ( from tests.api.setup_test_api import (
GET, GET,
POST, POST,
@ -265,15 +267,39 @@ def test_route_create(api_admin_headers):
) )
check_fields(res, BATCH_FIELD) check_fields(res, BATCH_FIELD)
assert len(res["success"]) == 1 assert len(res["success"]) == 1
TO_REMOVE.append(res["success"][0]["message"]["assiduite_id"]) TO_REMOVE.append(res["success"][0]["message"]["assiduite_id"])
data = GET( data_get = GET(
path=f'/assiduite/{res["success"][0]["message"]["assiduite_id"]}', path=f'/assiduite/{res["success"][0]["message"]["assiduite_id"]}',
headers=api_admin_headers, headers=api_admin_headers,
dept=DEPT_ACRONYM, dept=DEPT_ACRONYM,
) )
check_fields(data, fields=ASSIDUITES_FIELDS) check_fields(data_get, fields=ASSIDUITES_FIELDS)
# la date de début est sans fournie sans timezone, mais celle renvoyé avec.
# Compare en ajoutant la timezone serveur:
assert scu.localize_datetime(
datetime.datetime.fromisoformat(data["date_debut"])
) == datetime.datetime.fromisoformat(data_get["date_debut"])
# Création avec timezone (comme le fait assiduite.js)
data["date_debut"] = "2024-10-28T10:00:00.000Z"
data["date_fin"] = "2024-10-28T12:00:00.000Z"
res = POST(
f"/assiduite/{ETUDID}/create", [data], api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
assert len(res["success"]) == 1
TO_REMOVE.append(res["success"][0]["message"]["assiduite_id"])
data_get = GET(
path=f'/assiduite/{res["success"][0]["message"]["assiduite_id"]}',
headers=api_admin_headers,
dept=DEPT_ACRONYM,
)
check_fields(data_get, fields=ASSIDUITES_FIELDS)
assert scu.localize_datetime(
datetime.datetime.fromisoformat(data["date_debut"])
) == datetime.datetime.fromisoformat(data_get["date_debut"])
# Absence avec module
data2 = create_data("absent", "04", MODULE, "desc") data2 = create_data("absent", "04", MODULE, "desc")
res = POST( res = POST(
f"/assiduite/{ETUDID}/create", [data2], api_admin_headers, dept=DEPT_ACRONYM f"/assiduite/{ETUDID}/create", [data2], api_admin_headers, dept=DEPT_ACRONYM