############################################################################## # ScoDoc # Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ScoDoc 9 API : Absences """ from flask_json import as_json from app.api import api_bp as bp, API_CLIENT_ERROR from app.scodoc.sco_utils import json_error from app.decorators import scodoc, permission_required from app.models import Identite from app.scodoc import notesdb as ndb from app.scodoc import sco_abs from app.scodoc.sco_groups import get_group_members from app.scodoc.sco_permissions import Permission # TODO XXX revoir routes web API et calcul des droits @bp.route("/absences/etudid/<int:etudid>", methods=["GET"]) @scodoc @permission_required(Permission.ScoView) @as_json def absences(etudid: int = None): """ Liste des absences de cet étudiant Exemple de résultat: [ { "jour": "2022-04-15", "matin": true, "estabs": true, "estjust": true, "description": "", "begin": "2022-04-15 08:00:00", "end": "2022-04-15 11:59:59" }, { "jour": "2022-04-15", "matin": false, "estabs": true, "estjust": false, "description": "", "begin": "2022-04-15 12:00:00", "end": "2022-04-15 17:59:59" } ] """ etud = Identite.query.get(etudid) if etud is None: return json_error(404, message="etudiant inexistant") # Absences de l'étudiant ndb.open_db_connection() abs_list = sco_abs.list_abs_date(etud.id) for absence in abs_list: absence["jour"] = absence["jour"].isoformat() return abs_list @bp.route("/absences/etudid/<int:etudid>/just", methods=["GET"]) @scodoc @permission_required(Permission.ScoView) @as_json def absences_just(etudid: 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 Exemple de résultat : [ { "jour": "2022-04-15", "matin": true, "estabs": true, "estjust": true, "description": "", "begin": "2022-04-15 08:00:00", "end": "2022-04-15 11:59:59" }, { "jour": "Fri, 15 Apr 2022 00:00:00 GMT", "matin": false, "estabs": true, "estjust": true, "description": "", "begin": "2022-04-15 12:00:00", "end": "2022-04-15 17:59:59" } ] """ etud = Identite.query.get(etudid) if etud is None: return json_error(404, message="etudiant inexistant") # Absences justifiées de l'étudiant abs_just = [ absence for absence in sco_abs.list_abs_date(etud.id) if absence["estjust"] ] for absence in abs_just: absence["jour"] = absence["jour"].isoformat() return abs_just @bp.route( "/absences/abs_group_etat/<int:group_id>", methods=["GET"], ) @bp.route( "/absences/abs_group_etat/group_id/<int:group_id>/date_debut/<string:date_debut>/date_fin/<string:date_fin>", methods=["GET"], ) @scodoc @permission_required(Permission.ScoView) @as_json def abs_groupe_etat(group_id: int, date_debut=None, date_fin=None): """ Liste des absences d'un groupe (possibilité de choisir entre deux dates) group_id = l'id du groupe date_debut = None par défaut, sinon la date ISO du début de notre filtre date_fin = None par défaut, sinon la date ISO de la fin de notre filtre Exemple de résultat : [ { "etudid": 1, "list_abs": [] }, { "etudid": 2, "list_abs": [ { "jour": "Fri, 15 Apr 2022 00:00:00 GMT", "matin": true, "estabs": true, "estjust": true, "description": "", "begin": "2022-04-15 08:00:00", "end": "2022-04-15 11:59:59" }, { "jour": "Fri, 15 Apr 2022 00:00:00 GMT", "matin": false, "estabs": true, "estjust": false, "description": "", "begin": "2022-04-15 12:00:00", "end": "2022-04-15 17:59:59" }, ] }, ... ] """ members = get_group_members(group_id) data = [] # Filtre entre les deux dates renseignées for member in members: absence = { "etudid": member["etudid"], "list_abs": sco_abs.list_abs_date(member["etudid"], date_debut, date_fin), } data.append(absence) return data # XXX TODO EV: A REVOIR (data json dans le POST + modifier les routes) # @bp.route( # "/absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs", # methods=["POST"], # defaults={"just_or_not": 0}, # ) # @bp.route( # "/absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs/only_not_just", # methods=["POST"], # defaults={"just_or_not": 1}, # ) # @bp.route( # "/absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs/only_just", # methods=["POST"], # defaults={"just_or_not": 2}, # ) # @token_auth.login_required # @token_permission_required(Permission.APIAbsChange) # def reset_etud_abs(etudid: int, list_abs: str, just_or_not: int = 0): # """ # Set la liste des absences d'un étudiant sur tout un semestre. # (les absences existant pour cet étudiant sur cette période sont effacées) # etudid : l'id d'un étudiant # list_abs : json d'absences # just_or_not : 0 (pour les absences justifiées et non justifiées), # 1 (pour les absences justifiées), # 2 (pour les absences non justifiées) # """ # # Toutes les absences # if just_or_not == 0: # # suppression des absences et justificatif déjà existant pour éviter les doublons # for abs in list_abs: # # Récupération de la date au format iso # jour = abs["jour"].isoformat() # if abs["matin"] is True: # annule_absence(etudid, jour, True) # annule_justif(etudid, jour, True) # else: # annule_absence(etudid, jour, False) # annule_justif(etudid, jour, False) # # Ajout de la liste d'absences en base # add_abslist(list_abs) # # Uniquement les absences justifiées # elif just_or_not == 1: # list_abs_not_just = [] # # Trie des absences justifiées # for abs in list_abs: # if abs["estjust"] is False: # list_abs_not_just.append(abs) # # suppression des absences et justificatif déjà existant pour éviter les doublons # for abs in list_abs: # # Récupération de la date au format iso # jour = abs["jour"].isoformat() # if abs["matin"] is True: # annule_absence(etudid, jour, True) # annule_justif(etudid, jour, True) # else: # annule_absence(etudid, jour, False) # annule_justif(etudid, jour, False) # # Ajout de la liste d'absences en base # add_abslist(list_abs_not_just) # # Uniquement les absences non justifiées # elif just_or_not == 2: # list_abs_just = [] # # Trie des absences non justifiées # for abs in list_abs: # if abs["estjust"] is True: # list_abs_just.append(abs) # # suppression des absences et justificatif déjà existant pour éviter les doublons # for abs in list_abs: # # Récupération de la date au format iso # jour = abs["jour"].isoformat() # if abs["matin"] is True: # annule_absence(etudid, jour, True) # annule_justif(etudid, jour, True) # else: # annule_absence(etudid, jour, False) # annule_justif(etudid, jour, False) # # Ajout de la liste d'absences en base # add_abslist(list_abs_just)