forked from ScoDoc/ScoDoc
WIP: API absences
This commit is contained in:
parent
46d99a5735
commit
62c65176b6
@ -8,9 +8,9 @@ from app.api import bp
|
|||||||
from app.api.errors import error_response
|
from app.api.errors import error_response
|
||||||
from app.api.auth import token_permission_required
|
from app.api.auth import token_permission_required
|
||||||
from app.api.tools import get_etu_from_etudid_or_nip_or_ine
|
from app.api.tools import get_etu_from_etudid_or_nip_or_ine
|
||||||
|
from app.scodoc import ndb
|
||||||
|
from app.scodoc import sco_abs
|
||||||
from app.scodoc.sco_abs import (
|
from app.scodoc.sco_abs import (
|
||||||
add_absence,
|
|
||||||
add_justif,
|
|
||||||
annule_absence,
|
annule_absence,
|
||||||
annule_justif,
|
annule_justif,
|
||||||
list_abs_date,
|
list_abs_date,
|
||||||
@ -33,32 +33,26 @@ def absences(etudid: int = None, nip: int = None, ine: int = None):
|
|||||||
"""
|
"""
|
||||||
if etudid is None:
|
if etudid is None:
|
||||||
# Récupération de l'étudiant
|
# Récupération de l'étudiant
|
||||||
try:
|
etud = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
||||||
etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
if etud is None:
|
||||||
etudid = etu.etudid
|
|
||||||
except AttributeError:
|
|
||||||
return error_response(
|
return error_response(
|
||||||
409,
|
409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
"Veuillez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
||||||
)
|
)
|
||||||
|
etudid = etud.etudid
|
||||||
|
|
||||||
# Récupération des absences de l'étudiant
|
# Récupération des absences de l'étudiant
|
||||||
abs = models.Absence.query.filter_by(etudid=etudid)
|
ndb.open_db_connection()
|
||||||
|
absences = sco_abs.list_abs_date(etudid)
|
||||||
# Si l'étudiant a au minimum une absence
|
for absence in absences:
|
||||||
if len(abs) > 0:
|
absence["jour"] = absence["jour"].isoformat()
|
||||||
# Mise en forme des données
|
return jsonify(absences)
|
||||||
data = [d.to_dict() for d in abs]
|
|
||||||
|
|
||||||
return jsonify(data)
|
|
||||||
|
|
||||||
return error_response(200, message="Aucune absence trouvé pour cet étudiant")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/absences/etudid/<int:etudid>/abs_just_only", methods=["GET"])
|
@bp.route("/absences/etudid/<int:etudid>/just", methods=["GET"])
|
||||||
@bp.route("/absences/nip/<int:nip>/abs_just_only", methods=["GET"])
|
@bp.route("/absences/nip/<int:nip>/just", methods=["GET"])
|
||||||
@bp.route("/absences/ine/<int:ine>/abs_just_only", methods=["GET"])
|
@bp.route("/absences/ine/<int:ine>/just", methods=["GET"])
|
||||||
@token_permission_required(Permission.APIView)
|
@token_permission_required(Permission.APIView)
|
||||||
def absences_justify(etudid: int = None, nip: int = None, ine: int = None):
|
def absences_justify(etudid: int = None, nip: int = None, ine: int = None):
|
||||||
"""
|
"""
|
||||||
@ -77,125 +71,117 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None):
|
|||||||
return error_response(
|
return error_response(
|
||||||
409,
|
409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
"Veuillez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Récupération des absences justifiées de l'étudiant
|
# Récupération des absences justifiées de l'étudiant
|
||||||
abs = models.Absence.query.filter_by(etudid=etudid, estjust=True)
|
absences = sco_abs.list_abs_date(etudid)
|
||||||
|
for absence in [absence for absence in absences if absence["estjust"]]:
|
||||||
# Si l'étudiant a au minimum une absence justifiées
|
absence["jour"] = absence["jour"].isoformat()
|
||||||
if len(abs) > 0:
|
return jsonify(absences)
|
||||||
# Mise en forme des données
|
|
||||||
data = [d.to_dict() for d in abs]
|
|
||||||
|
|
||||||
return jsonify(data)
|
|
||||||
|
|
||||||
return error_response(
|
|
||||||
200, message="Aucune absence justifié trouvé pour cet étudiant"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule?etudid=<int:etudid>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule?etudid=<int:etudid>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule?nip=<int:nip>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule?nip=<int:nip>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule?ine=<int:ine>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule?ine=<int:ine>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@token_permission_required(Permission.APIAbsChange)
|
# @token_permission_required(Permission.APIAbsChange)
|
||||||
def abs_annule(
|
# def abs_annule(
|
||||||
jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None
|
# jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None
|
||||||
):
|
# ):
|
||||||
"""
|
# """
|
||||||
Retourne un html
|
# Retourne un html
|
||||||
|
|
||||||
jour : la date de l'absence a annulé
|
# jour : la date de l'absence a annulé
|
||||||
matin : True ou False
|
# matin : True ou False
|
||||||
etudid : l'etudid d'un étudiant
|
# etudid : l'etudid d'un étudiant
|
||||||
nip: le code nip d'un étudiant
|
# nip: le code nip d'un étudiant
|
||||||
ine : le code ine d'un étudiant
|
# ine : le code ine d'un étudiant
|
||||||
"""
|
# """
|
||||||
# Fonction utilisée : app.scodoc.sco_abs.annule_absence()
|
# # Fonction utilisée : app.scodoc.sco_abs.annule_absence()
|
||||||
|
|
||||||
if etudid is None:
|
# if etudid is None:
|
||||||
# Récupération de l'étudiant
|
# # Récupération de l'étudiant
|
||||||
try:
|
# try:
|
||||||
etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
# etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
||||||
etudid = etu.etudid
|
# etudid = etu.etudid
|
||||||
except AttributeError:
|
# except AttributeError:
|
||||||
return error_response(
|
# return error_response(
|
||||||
409,
|
# 409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
# message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
# "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
||||||
)
|
# )
|
||||||
|
|
||||||
try:
|
# try:
|
||||||
# Utilisation de la fonction annule_absence
|
# # Utilisation de la fonction annule_absence
|
||||||
annule_absence(etudid, jour, matin)
|
# annule_absence(etudid, jour, matin)
|
||||||
except AttributeError:
|
# except AttributeError:
|
||||||
return error_response(
|
# return error_response(
|
||||||
409,
|
# 409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
# message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que le 'jour' et le 'matin' sont valides",
|
# "Veilliez vérifier que le 'jour' et le 'matin' sont valides",
|
||||||
)
|
# )
|
||||||
|
|
||||||
return error_response(200, message="OK")
|
# return error_response(200, message="OK")
|
||||||
|
|
||||||
|
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule_justif?etudid=<int:etudid>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule_justif?etudid=<int:etudid>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule_justif?nip=<int:nip>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule_justif?nip=<int:nip>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@bp.route(
|
# @bp.route(
|
||||||
"/absences/abs_annule_justif?ine=<int:ine>&jour=<string:jour>&matin=<string:matin>",
|
# "/absences/abs_annule_justif?ine=<int:ine>&jour=<string:jour>&matin=<string:matin>",
|
||||||
methods=["POST"],
|
# methods=["POST"],
|
||||||
)
|
# )
|
||||||
@token_permission_required(Permission.APIAbsChange)
|
# @token_permission_required(Permission.APIAbsChange)
|
||||||
def abs_annule_justif(
|
# def abs_annule_justif(
|
||||||
jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None
|
# jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None
|
||||||
):
|
# ):
|
||||||
"""
|
# """
|
||||||
Retourne un html
|
# Retourne un html
|
||||||
|
|
||||||
jour : la date de l'absence a annulé
|
# jour : la date de l'absence a annulé
|
||||||
matin : True ou False
|
# matin : True ou False
|
||||||
etudid : l'etudid d'un étudiant
|
# etudid : l'etudid d'un étudiant
|
||||||
nip: le code nip d'un étudiant
|
# nip: le code nip d'un étudiant
|
||||||
ine : le code ine d'un étudiant
|
# ine : le code ine d'un étudiant
|
||||||
"""
|
# """
|
||||||
# Fonction utilisée : app.scodoc.sco_abs.annule_justif()
|
# # Fonction utilisée : app.scodoc.sco_abs.annule_justif()
|
||||||
|
|
||||||
if etudid is None:
|
# if etudid is None:
|
||||||
# Récupération de l'étudiant
|
# # Récupération de l'étudiant
|
||||||
try:
|
# try:
|
||||||
etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
# etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine)
|
||||||
etudid = etu.etudid
|
# etudid = etu.etudid
|
||||||
except AttributeError:
|
# except AttributeError:
|
||||||
return error_response(
|
# return error_response(
|
||||||
409,
|
# 409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
# message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
# "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide",
|
||||||
)
|
# )
|
||||||
try:
|
# try:
|
||||||
# Utilisation de la fonction annule_justif
|
# # Utilisation de la fonction annule_justif
|
||||||
annule_justif(etudid, jour, matin)
|
# annule_justif(etudid, jour, matin)
|
||||||
except ValueError:
|
# except ValueError:
|
||||||
return error_response(
|
# return error_response(
|
||||||
409,
|
# 409,
|
||||||
message="La requête ne peut être traitée en l’état actuel.\n "
|
# message="La requête ne peut être traitée en l’état actuel.\n "
|
||||||
"Veilliez vérifier que le 'jour' et le 'matin' sont valides",
|
# "Veilliez vérifier que le 'jour' et le 'matin' sont valides",
|
||||||
)
|
# )
|
||||||
|
|
||||||
return error_response(200, message="OK")
|
# return error_response(200, message="OK")
|
||||||
|
|
||||||
|
|
||||||
@bp.route(
|
@bp.route(
|
||||||
@ -203,7 +189,7 @@ def abs_annule_justif(
|
|||||||
methods=["GET"],
|
methods=["GET"],
|
||||||
)
|
)
|
||||||
@token_permission_required(Permission.APIView)
|
@token_permission_required(Permission.APIView)
|
||||||
def abs_groupe_etat(
|
def abs_groupe_etat( # XXX A REVOIR XXX
|
||||||
group_id: int, date_debut, date_fin, with_boursier=True, format="html"
|
group_id: int, date_debut, date_fin, with_boursier=True, format="html"
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
|
@ -303,12 +303,14 @@ def YearTable(
|
|||||||
return "\n".join(T)
|
return "\n".join(T)
|
||||||
|
|
||||||
|
|
||||||
def list_abs_in_range(etudid, debut, fin, matin=None, moduleimpl_id=None, cursor=None):
|
def list_abs_in_range(
|
||||||
|
etudid, debut=None, fin=None, matin=None, moduleimpl_id=None, cursor=None
|
||||||
|
):
|
||||||
"""Liste des absences entre deux dates.
|
"""Liste des absences entre deux dates.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
etudid:
|
etudid:
|
||||||
debut: string iso date ("2020-03-12")
|
debut: string iso date ("2020-03-12") ou None
|
||||||
end: string iso date ("2020-03-12")
|
end: string iso date ("2020-03-12")
|
||||||
matin: None, True, False
|
matin: None, True, False
|
||||||
moduleimpl_id: restreint le comptage aux absences dans ce module
|
moduleimpl_id: restreint le comptage aux absences dans ce module
|
||||||
@ -335,9 +337,13 @@ def list_abs_in_range(etudid, debut, fin, matin=None, moduleimpl_id=None, cursor
|
|||||||
AND A.ESTABS"""
|
AND A.ESTABS"""
|
||||||
+ ismatin
|
+ ismatin
|
||||||
+ modul
|
+ modul
|
||||||
+ """
|
+ (
|
||||||
|
""
|
||||||
|
if debut is None
|
||||||
|
else """
|
||||||
AND A.JOUR BETWEEN %(debut)s AND %(fin)s
|
AND A.JOUR BETWEEN %(debut)s AND %(fin)s
|
||||||
""",
|
"""
|
||||||
|
),
|
||||||
{
|
{
|
||||||
"etudid": etudid,
|
"etudid": etudid,
|
||||||
"debut": debut,
|
"debut": debut,
|
||||||
@ -412,13 +418,14 @@ WHERE A.ETUDID = %(etudid)s
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def list_abs_date(etudid, beg_date, end_date):
|
def list_abs_date(etudid, beg_date=None, end_date=None):
|
||||||
"""Liste des absences et justifs entre deux dates (inclues)."""
|
"""Liste des absences et justifs entre deux dates (inclues)."""
|
||||||
cnx = ndb.GetDBConnexion()
|
cnx = ndb.GetDBConnexion()
|
||||||
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
|
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""SELECT jour, matin, estabs, estjust, description FROM ABSENCES A
|
"""SELECT jour, matin, estabs, estjust, description FROM ABSENCES A
|
||||||
WHERE A.ETUDID = %(etudid)s
|
WHERE A.ETUDID = %(etudid)s"""
|
||||||
|
+ ("" if beg_date is None else """
|
||||||
AND A.jour >= %(beg_date)s
|
AND A.jour >= %(beg_date)s
|
||||||
AND A.jour <= %(end_date)s
|
AND A.jour <= %(end_date)s
|
||||||
""",
|
""",
|
||||||
|
Loading…
Reference in New Issue
Block a user