WIP: API absences

This commit is contained in:
Emmanuel Viennet 2022-04-27 05:19:13 +02:00
parent 46d99a5735
commit 62c65176b6
2 changed files with 125 additions and 132 deletions

View File

@ -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"
): ):
""" """

View File

@ -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
""", """,