forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -1,5 +1,6 @@
|
|||||||
<h2>Présence lors de l'évaluation {{eval.title}} </h2>
|
<h2>Présence du groupe {{group_title}} le {{date_debut.strftime("%d/%m/%Y")}}
|
||||||
<h3>Réalisé le {{eval.jour}} de {{eval.heure_debut}} à {{eval.heure_fin}}</h3>
|
de {{date_debut.strftime("%H:%M")}} à {{date_fin.strftime("%H:%M")}}
|
||||||
|
</h2>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -7,7 +8,7 @@
|
|||||||
Nom
|
Nom
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Assiduité
|
Présence
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -736,16 +736,13 @@ def visu_assiduites_group():
|
|||||||
@scodoc
|
@scodoc
|
||||||
@permission_required(Permission.ScoView)
|
@permission_required(Permission.ScoView)
|
||||||
def get_etat_abs_date():
|
def get_etat_abs_date():
|
||||||
evaluation = {
|
infos_date = {
|
||||||
"jour": request.args.get("jour"),
|
"jour": request.args.get("jour"),
|
||||||
"heure_debut": request.args.get("heure_debut"),
|
"heure_debut": request.args.get("heure_debut"),
|
||||||
"heure_fin": request.args.get("heure_fin"),
|
"heure_fin": request.args.get("heure_fin"),
|
||||||
"title": request.args.get("desc"),
|
"title": request.args.get("desc"),
|
||||||
}
|
}
|
||||||
date: str = evaluation["jour"]
|
|
||||||
group_ids: list[int] = request.args.get("group_ids", None)
|
group_ids: list[int] = request.args.get("group_ids", None)
|
||||||
etudiants: list[dict] = []
|
|
||||||
|
|
||||||
if group_ids is None:
|
if group_ids is None:
|
||||||
group_ids = []
|
group_ids = []
|
||||||
else:
|
else:
|
||||||
@ -760,10 +757,10 @@ def get_etat_abs_date():
|
|||||||
]
|
]
|
||||||
|
|
||||||
date_debut = scu.is_iso_formated(
|
date_debut = scu.is_iso_formated(
|
||||||
f"{evaluation['jour']}T{evaluation['heure_debut'].replace('h',':')}", True
|
f"{infos_date['jour']}T{infos_date['heure_debut'].replace('h',':')}", True
|
||||||
)
|
)
|
||||||
date_fin = scu.is_iso_formated(
|
date_fin = scu.is_iso_formated(
|
||||||
f"{evaluation['jour']}T{evaluation['heure_fin'].replace('h',':')}", True
|
f"{infos_date['jour']}T{infos_date['heure_fin'].replace('h',':')}", True
|
||||||
)
|
)
|
||||||
|
|
||||||
assiduites: Assiduite = Assiduite.query.filter(
|
assiduites: Assiduite = Assiduite.query.filter(
|
||||||
@ -773,15 +770,20 @@ def get_etat_abs_date():
|
|||||||
assiduites, Assiduite, date_debut, date_fin, False
|
assiduites, Assiduite, date_debut, date_fin, False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
etudiants: list[dict] = []
|
||||||
for etud in etuds:
|
for etud in etuds:
|
||||||
assi = assiduites.filter_by(etudid=etud["etudid"]).first()
|
assi = assiduites.filter_by(etudid=etud["etudid"]).first()
|
||||||
|
|
||||||
etat = ""
|
etat = ""
|
||||||
if assi != None and assi.etat != 0:
|
if assi is not None and assi.etat != 0:
|
||||||
etat = scu.EtatAssiduite.inverse().get(assi.etat).name
|
etat = scu.EtatAssiduite.inverse().get(assi.etat).name
|
||||||
|
|
||||||
etudiant = {
|
etudiant = {
|
||||||
"nom": f'<a href="{url_for("assiduites.calendrier_etud", scodoc_dept=g.scodoc_dept, etudid=etud["etudid"])}"><font color="#A00000">{etud["nomprenom"]}</font></a>',
|
"nom": f"""<a href="{url_for(
|
||||||
|
"assiduites.calendrier_etud",
|
||||||
|
scodoc_dept=g.scodoc_dept,
|
||||||
|
etudid=etud["etudid"])
|
||||||
|
}"><font color="#A00000">{etud["nomprenom"]}</font></a>""",
|
||||||
"etat": etat,
|
"etat": etat,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -790,7 +792,7 @@ def get_etat_abs_date():
|
|||||||
etudiants = list(sorted(etudiants, key=lambda x: x["nom"]))
|
etudiants = list(sorted(etudiants, key=lambda x: x["nom"]))
|
||||||
|
|
||||||
header: str = html_sco_header.sco_header(
|
header: str = html_sco_header.sco_header(
|
||||||
page_title=evaluation["title"],
|
page_title=infos_date["title"],
|
||||||
init_qtip=True,
|
init_qtip=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -799,7 +801,9 @@ def get_etat_abs_date():
|
|||||||
render_template(
|
render_template(
|
||||||
"assiduites/pages/etat_absence_date.j2",
|
"assiduites/pages/etat_absence_date.j2",
|
||||||
etudiants=etudiants,
|
etudiants=etudiants,
|
||||||
eval=evaluation,
|
group_title=groups_infos.groups_titles,
|
||||||
|
date_debut=date_debut,
|
||||||
|
date_fin=date_fin,
|
||||||
),
|
),
|
||||||
html_sco_header.sco_footer(),
|
html_sco_header.sco_footer(),
|
||||||
).build()
|
).build()
|
||||||
|
@ -13,6 +13,9 @@ from tests.api.setup_test_api import (
|
|||||||
APIError,
|
APIError,
|
||||||
api_headers,
|
api_headers,
|
||||||
api_admin_headers,
|
api_admin_headers,
|
||||||
|
check_failure_get,
|
||||||
|
check_failure_post,
|
||||||
|
check_fields,
|
||||||
)
|
)
|
||||||
|
|
||||||
ETUDID = 1
|
ETUDID = 1
|
||||||
@ -44,76 +47,6 @@ COUNT_FIELDS = {"compte": int, "journee": int, "demi": int, "heure": float}
|
|||||||
TO_REMOVE = []
|
TO_REMOVE = []
|
||||||
|
|
||||||
|
|
||||||
def check_fields(data: dict, fields: dict = None):
|
|
||||||
"""
|
|
||||||
Cette fonction permet de vérifier que le dictionnaire data
|
|
||||||
contient les bonnes clés et les bons types de valeurs.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data (dict): un dictionnaire (json de retour de l'api)
|
|
||||||
fields (dict, optional): Un dictionnaire représentant les clés et les types d'une réponse.
|
|
||||||
"""
|
|
||||||
if fields is None:
|
|
||||||
fields = ASSIDUITES_FIELDS
|
|
||||||
assert set(data.keys()) == set(fields.keys())
|
|
||||||
for key in data:
|
|
||||||
if key in ("moduleimpl_id", "desc", "user_id", "external_data"):
|
|
||||||
assert (
|
|
||||||
isinstance(data[key], fields[key]) or data[key] is None
|
|
||||||
), f"error [{key}:{type(data[key])}, {data[key]}, {fields[key]}]"
|
|
||||||
else:
|
|
||||||
assert isinstance(
|
|
||||||
data[key], fields[key]
|
|
||||||
), f"error [{key}:{type(data[key])}, {data[key]}, {fields[key]}]"
|
|
||||||
|
|
||||||
|
|
||||||
def check_failure_get(path: str, headers: dict, err: str = None):
|
|
||||||
"""
|
|
||||||
Cette fonction vérifiée que la requête GET renvoie bien un 404
|
|
||||||
|
|
||||||
Args:
|
|
||||||
path (str): la route de l'api
|
|
||||||
headers (dict): le token d'auth de l'api
|
|
||||||
err (str, optional): L'erreur qui est sensée être fournie par l'api.
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
APIError: Une erreur car la requête a fonctionné (mauvais comportement)
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
|
||||||
GET(path=path, headers=headers)
|
|
||||||
# ^ Renvoi un 404
|
|
||||||
except APIError as api_err:
|
|
||||||
if err is not None:
|
|
||||||
assert api_err.payload["message"] == err
|
|
||||||
else:
|
|
||||||
raise APIError("Le GET n'aurait pas du fonctionner")
|
|
||||||
|
|
||||||
|
|
||||||
def check_failure_post(path: str, headers: dict, data: dict, err: str = None):
|
|
||||||
"""
|
|
||||||
Cette fonction vérifiée que la requête POST renvoie bien un 404
|
|
||||||
|
|
||||||
Args:
|
|
||||||
path (str): la route de l'api
|
|
||||||
headers (dict): le token d'auth
|
|
||||||
data (dict): un dictionnaire (json) à envoyer
|
|
||||||
err (str, optional): L'erreur qui est sensée être fournie par l'api.
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
APIError: Une erreur car la requête a fonctionné (mauvais comportement)
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = POST_JSON(path=path, headers=headers, data=data)
|
|
||||||
# ^ Renvoi un 404
|
|
||||||
except APIError as api_err:
|
|
||||||
if err is not None:
|
|
||||||
assert api_err.payload["message"] == err
|
|
||||||
else:
|
|
||||||
raise APIError("Le GET n'aurait pas du fonctionner")
|
|
||||||
|
|
||||||
|
|
||||||
def create_data(etat: str, day: str, module: int = None, desc: str = None):
|
def create_data(etat: str, day: str, module: int = None, desc: str = None):
|
||||||
"""
|
"""
|
||||||
Permet de créer un dictionnaire assiduité
|
Permet de créer un dictionnaire assiduité
|
||||||
|
Loading…
Reference in New Issue
Block a user