############################################### Departements ########################################################## from flask import jsonify import app from app import models from app.api import bp from app.api.auth import token_auth, token_permission_required from app.models import Departement, FormSemestre from app.scodoc.sco_permissions import Permission def get_departement(dept_ident: str) -> Departement: "Le departement, par id ou acronyme. Erreur 404 si pas trouvé." try: dept_id = int(dept_ident) except ValueError: dept_id = None if dept_id is None: return Departement.query.filter_by(acronym=dept_ident).first_or_404() return Departement.query.get_or_404(dept_id) @bp.route("/departements_ids", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def departements_ids(): """Liste des ids de départements""" return jsonify([dept.id for dept in Departement.query]) @bp.route("/departement/<string:dept_ident>", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def departement(dept_ident: str): """ Info sur un département. Accès par id ou acronyme. Exemple de résultat : { "id": 1, "acronym": "TAPI", "description": null, "visible": true, "date_creation": "Fri, 15 Apr 2022 12:19:28 GMT" } """ dept = get_departement(dept_ident) return jsonify(dept.to_dict()) @bp.route("/departements", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def departements(): """Liste les départements""" return jsonify([dept.to_dict() for dept in Departement.query]) @bp.route("/departement/<string:dept_ident>/etudiants", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def list_etudiants(dept_ident: str): """ Retourne la liste des étudiants d'un département dept: l'acronym d'un département formsemestre_id: l'id d'un formesemestre Exemple de résultat : [ { "civilite": "M", "ine": "7899X61616", "nip": "F6777H88", "date_naissance": null, "email": "toto@toto.fr", "emailperso": null, "etudid": 18, "nom": "MOREL", "prenom": "JACQUES" }, ... ] """ # Le département, spécifié par un id ou un acronyme dept = get_departement(dept_ident) return jsonify([etud.to_dict_short() for etud in dept.etudiants]) @bp.route("/departement/<string:dept_ident>/formsemestres_ids", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def formsemestres_ids(dept_ident: str): """liste des ids formsemestre du département""" # Le département, spécifié par un id ou un acronyme dept = get_departement(dept_ident) return jsonify([formsemestre.id for formsemestre in dept.formsemestres]) @bp.route("/departement/<string:dept_ident>/formsemestres_courants", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) def liste_semestres_courant(dept_ident: str): """ Liste des semestres actifs d'un départements donné dept: l'acronym d'un département Exemple de résultat : [ { "titre": "master machine info", "gestion_semestrielle": false, "scodoc7_id": null, "date_debut": "01/09/2021", "bul_bgcolor": null, "date_fin": "15/12/2022", "resp_can_edit": false, "dept_id": 1, "etat": true, "resp_can_change_ens": false, "id": 1, "modalite": "FI", "ens_can_edit_eval": false, "formation_id": 1, "gestion_compensation": false, "elt_sem_apo": null, "semestre_id": 1, "bul_hide_xml": false, "elt_annee_apo": null, "block_moyennes": false, "formsemestre_id": 1, "titre_num": "master machine info semestre 1", "date_debut_iso": "2021-09-01", "date_fin_iso": "2022-12-15", "responsables": [ 3, 2 ] }, ... ] """ # Le département, spécifié par un id ou un acronyme dept = get_departement(dept_ident) # Les semestres en cours de ce département formsemestres = models.FormSemestre.query.filter( FormSemestre.dept_id == dept.id, FormSemestre.date_debut <= app.db.func.now(), FormSemestre.date_fin >= app.db.func.now(), ) return jsonify([d.to_dict() for d in formsemestres])