forked from ScoDoc/ScoDoc
Fix: assiduité: heures des assiduités crées dans log et journal étudiant
This commit is contained in:
parent
0895d7b195
commit
d97cb6f309
@ -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
|
||||||
----
|
----
|
||||||
|
@ -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,
|
||||||
|
@ -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:
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user