From 62c65176b64dc0a02e82a46e72a315466feb4545 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 27 Apr 2022 05:19:13 +0200 Subject: [PATCH] WIP: API absences --- app/api/absences.py | 238 ++++++++++++++++++++---------------------- app/scodoc/sco_abs.py | 19 ++-- 2 files changed, 125 insertions(+), 132 deletions(-) diff --git a/app/api/absences.py b/app/api/absences.py index 261cc333..7f33cb29 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -8,9 +8,9 @@ from app.api import bp from app.api.errors import error_response from app.api.auth import token_permission_required 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 ( - add_absence, - add_justif, annule_absence, annule_justif, list_abs_date, @@ -33,32 +33,26 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): """ if etudid is None: # Récupération de l'étudiant - try: - etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) - etudid = etu.etudid - except AttributeError: + etud = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) + if etud is None: return error_response( 409, 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 - abs = models.Absence.query.filter_by(etudid=etudid) - - # Si l'étudiant a au minimum une absence - if len(abs) > 0: - # Mise en forme des données - data = [d.to_dict() for d in abs] - - return jsonify(data) - - return error_response(200, message="Aucune absence trouvé pour cet étudiant") + ndb.open_db_connection() + absences = sco_abs.list_abs_date(etudid) + for absence in absences: + absence["jour"] = absence["jour"].isoformat() + return jsonify(absences) -@bp.route("/absences/etudid//abs_just_only", methods=["GET"]) -@bp.route("/absences/nip//abs_just_only", methods=["GET"]) -@bp.route("/absences/ine//abs_just_only", methods=["GET"]) +@bp.route("/absences/etudid//just", methods=["GET"]) +@bp.route("/absences/nip//just", methods=["GET"]) +@bp.route("/absences/ine//just", methods=["GET"]) @token_permission_required(Permission.APIView) 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( 409, 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 - abs = models.Absence.query.filter_by(etudid=etudid, estjust=True) - - # Si l'étudiant a au minimum une absence justifiées - if len(abs) > 0: - # 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" - ) + absences = sco_abs.list_abs_date(etudid) + for absence in [absence for absence in absences if absence["estjust"]]: + absence["jour"] = absence["jour"].isoformat() + return jsonify(absences) -@bp.route( - "/absences/abs_annule?etudid=&jour=&matin=", - methods=["POST"], -) -@bp.route( - "/absences/abs_annule?nip=&jour=&matin=", - methods=["POST"], -) -@bp.route( - "/absences/abs_annule?ine=&jour=&matin=", - methods=["POST"], -) -@token_permission_required(Permission.APIAbsChange) -def abs_annule( - jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None -): - """ - Retourne un html +# @bp.route( +# "/absences/abs_annule?etudid=&jour=&matin=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_annule?nip=&jour=&matin=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_annule?ine=&jour=&matin=", +# methods=["POST"], +# ) +# @token_permission_required(Permission.APIAbsChange) +# def abs_annule( +# jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None +# ): +# """ +# Retourne un html - jour : la date de l'absence a annulé - matin : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_abs.annule_absence() +# jour : la date de l'absence a annulé +# matin : True ou False +# etudid : l'etudid d'un étudiant +# nip: le code nip d'un étudiant +# ine : le code ine d'un étudiant +# """ +# # Fonction utilisée : app.scodoc.sco_abs.annule_absence() - if etudid is None: - # Récupération de l'étudiant - try: - etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) - etudid = etu.etudid - except AttributeError: - return error_response( - 409, - 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", - ) +# if etudid is None: +# # Récupération de l'étudiant +# try: +# etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) +# etudid = etu.etudid +# except AttributeError: +# return error_response( +# 409, +# 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", +# ) - try: - # Utilisation de la fonction annule_absence - annule_absence(etudid, jour, matin) - except AttributeError: - return error_response( - 409, - 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", - ) +# try: +# # Utilisation de la fonction annule_absence +# annule_absence(etudid, jour, matin) +# except AttributeError: +# return error_response( +# 409, +# 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", +# ) - return error_response(200, message="OK") +# return error_response(200, message="OK") -@bp.route( - "/absences/abs_annule_justif?etudid=&jour=&matin=", - methods=["POST"], -) -@bp.route( - "/absences/abs_annule_justif?nip=&jour=&matin=", - methods=["POST"], -) -@bp.route( - "/absences/abs_annule_justif?ine=&jour=&matin=", - methods=["POST"], -) -@token_permission_required(Permission.APIAbsChange) -def abs_annule_justif( - jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None -): - """ - Retourne un html +# @bp.route( +# "/absences/abs_annule_justif?etudid=&jour=&matin=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_annule_justif?nip=&jour=&matin=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_annule_justif?ine=&jour=&matin=", +# methods=["POST"], +# ) +# @token_permission_required(Permission.APIAbsChange) +# def abs_annule_justif( +# jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None +# ): +# """ +# Retourne un html - jour : la date de l'absence a annulé - matin : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_abs.annule_justif() +# jour : la date de l'absence a annulé +# matin : True ou False +# etudid : l'etudid d'un étudiant +# nip: le code nip d'un étudiant +# ine : le code ine d'un étudiant +# """ +# # Fonction utilisée : app.scodoc.sco_abs.annule_justif() - if etudid is None: - # Récupération de l'étudiant - try: - etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) - etudid = etu.etudid - except AttributeError: - return error_response( - 409, - 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", - ) - try: - # Utilisation de la fonction annule_justif - annule_justif(etudid, jour, matin) - except ValueError: - return error_response( - 409, - 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", - ) +# if etudid is None: +# # Récupération de l'étudiant +# try: +# etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) +# etudid = etu.etudid +# except AttributeError: +# return error_response( +# 409, +# 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", +# ) +# try: +# # Utilisation de la fonction annule_justif +# annule_justif(etudid, jour, matin) +# except ValueError: +# return error_response( +# 409, +# 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", +# ) - return error_response(200, message="OK") +# return error_response(200, message="OK") @bp.route( @@ -203,7 +189,7 @@ def abs_annule_justif( methods=["GET"], ) @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" ): """ diff --git a/app/scodoc/sco_abs.py b/app/scodoc/sco_abs.py index 5662df3a..cd0f5d51 100644 --- a/app/scodoc/sco_abs.py +++ b/app/scodoc/sco_abs.py @@ -303,12 +303,14 @@ def YearTable( 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. Args: etudid: - debut: string iso date ("2020-03-12") + debut: string iso date ("2020-03-12") ou None end: string iso date ("2020-03-12") matin: None, True, False 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""" + ismatin + modul - + """ + + ( + "" + if debut is None + else """ AND A.JOUR BETWEEN %(debut)s AND %(fin)s - """, + """ + ), { "etudid": etudid, "debut": debut, @@ -412,13 +418,14 @@ WHERE A.ETUDID = %(etudid)s 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).""" cnx = ndb.GetDBConnexion() cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) cursor.execute( """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 <= %(end_date)s """,