#################################################### Absences ######################################################### from datetime import datetime from flask import jsonify from app import models 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.sco_abs import ( add_absence, add_justif, annule_absence, annule_justif, list_abs_date, ) from app.scodoc.sco_groups import get_group_members from app.scodoc.sco_permissions import Permission @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) @token_permission_required(Permission.APIView) def absences(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences d'un étudiant donné etudid : l'etudid d'un étudiant nip: le code nip d'un étudiant ine : le code ine d'un étudiant """ 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", ) # 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") @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"]) @token_permission_required(Permission.APIView) def absences_justify(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences justifiées d'un étudiant donné etudid : l'etudid d'un étudiant nip: le code nip d'un étudiant ine : le code ine d'un étudiant """ 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", ) # 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" ) @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() 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", ) 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 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", ) return error_response(200, message="OK") @bp.route( "/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"], ) @token_permission_required(Permission.APIView) def abs_groupe_etat( group_id: int, date_debut, date_fin, with_boursier=True, format="html" ): """ Retoune la liste des absences d'un ou plusieurs groupes entre deux dates """ # Fonction utilisée : app.scodoc.sco_groups.get_group_members() et app.scodoc.sco_abs.list_abs_date() try: # Utilisation de la fonction get_group_members members = get_group_members(group_id) except ValueError: return error_response( 409, message="La requête ne peut être traitée en l’état actuel" ) data = [] # Filtre entre les deux dates renseignées for member in members: abs = list_abs_date(member.id, date_debut, date_fin) data.append(abs) # return jsonify(data) # XXX TODO faire en sorte de pouvoir renvoyer sa (ex to_dict() dans absences) return error_response(501, message="Not implemented")