#################################################### Absences ######################################################### from datetime import datetime from flask import jsonify from app import models from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response 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 @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) 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 """ abs = None if etudid is not None: # Si route etudid # Récupération des absences de l'étudiant abs = models.Absence.query.filter_by(etudid=etudid).all() else: if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() # Récupération des absences de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid).all() if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() # Récupération des absences de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid).all() if abs is not None: # Si des absences ont bien été trouvé # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) return error_response(501, message="Not implemented") @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"]) 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 """ abs = None if etudid is not None: # Si route etudid # Récupération des absences justifiées de l'étudiant abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() else: if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() # Récupération des absences justifiées de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() # Récupération des absences justifiées de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() if abs is not None: # Si des absences ont bien été trouvé # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) return error_response(501, message="Not implemented") @bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=" "&description=", methods=["POST"]) @bp.route("/absences/abs_signale?nip=&date=&matin=&justif=" "&description=", methods=["POST"]) @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=", methods=["POST"]) @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=&moduleimpl_id=", methods=["POST"]) @token_auth.login_required def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, description: str = None, moduleimpl_id: int = None): """ Permet d'ajouter une absence en base date : la date de l'absence matin : True ou False justif : True ou False etudid : l'etudid d'un étudiant nip: le code nip d'un étudiant ine : le code ine d'un étudiant description : description possible à ajouter sur l'absence moduleimpl_id : l'id d'un moduleimpl """ # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() if description is not None: # Si la description a été renseignée if moduleimpl_id is not None: # Si le moduleimpl a été renseigné if etudid is not None: # Si route etudid try: # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif, description, moduleimpl_id) # Utilisation de la fonction add_justif add_justif(etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") return error_response(409, message="La requête ne peut être traitée en l’état actuel") else: # Si le moduleimpl n'a pas été renseigné if etudid is not None: # Si route etudid try: # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif, description) # Utilisation de la fonction add_justif add_justif(etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") return error_response(409, message="La requête ne peut être traitée en l’état actuel") else: if etudid is not None: # Si route etudid try: # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif) # Utilisation de la fonction add_justif add_justif(etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif) # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") return error_response(200, message="OK") @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_auth.login_required 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: if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() # Récupération de l'etudid de l'étudiant etudid = etu.etudid if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() # Récupération de l'etudid de l'étudiant etudid = etu.etudid try: # Utilisation de la fonction annule_absence annule_absence(etudid, jour, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") 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_auth.login_required 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: if nip is not None: # Si route nip # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() # Récupération de l'etudid de l'étudiant etudid = etu.etudid if ine is not None: # Si route ine # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() # Récupération de l'etudid de l'étudiant etudid = etu.etudid 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") return error_response(200, message="OK") @bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) 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")