This commit is contained in:
Emmanuel Viennet 2022-05-05 18:11:44 +02:00
parent 16d968ef95
commit ba6b275973
6 changed files with 163 additions and 222 deletions

View File

@ -1,57 +1,58 @@
############################################### Departements ##########################################################
import json
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.api.errors import error_response
from app.models import FormSemestre
from app.scodoc.sco_permissions import Permission
@bp.route("/departements", methods=["GET"])
@bp.route("/departements_ids", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def departements():
def departements_ids():
"""Liste des ids de départements"""
return jsonify([dept.id for dept in models.Departement.query])
@bp.route("/departement/<int:dept_id>", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def departement(dept_id: int):
"""
Retourne la liste des ids de départements visibles
Info sur un département.
Exemple de résultat :
[
{
"id": 1,
"acronym": "TAPI",
"description": null,
"visible": true,
"date_creation": "Fri, 15 Apr 2022 12:19:28 GMT"
},
{
"id": 2,
"acronym": "MMI",
"description": null,
"visible": false,
"date_creation": "Fri, 18 Apr 2022 11:20:8 GMT"
},
...
]
}
"""
# Récupération de tous les départements
depts = models.Departement.query.all()
# Mise en place de la liste avec tous les départements
data = [d.to_dict() for d in depts]
return jsonify(data)
dept = models.Departement.query.filter_by(dept_id=dept_id).first_or_404()
return jsonify(dept.to_dict())
@bp.route("/departements/<string:dept>/etudiants/list", methods=["GET"])
@bp.route(
"/departements/<string:dept>/etudiants/list/<int:formsemestre_id>", methods=["GET"]
)
@bp.route("/departements", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def list_etudiants(dept: str, formsemestre_id=None):
def departements():
"""Liste les départements"""
return jsonify([dept.to_dict() for dept in models.Departement.query])
@bp.route("/departement/<string:dept_ident>/etudiants", methods=["GET"])
# @bp.route(
# "/departement/<string:dept_ident>/etudiants/list/<int:formsemestre_id>", 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
@ -61,54 +62,38 @@ def list_etudiants(dept: str, formsemestre_id=None):
Exemple de résultat :
[
{
"civilite": "X",
"code_ine": null,
"code_nip": null,
"civilite": "M",
"ine": "7899X61616",
"nip": "F6777H88",
"date_naissance": null,
"email": null,
"email": "toto@toto.fr",
"emailperso": null,
"etudid": 18,
"nom": "MOREL",
"prenom": "JACQUES"
},
{
"civilite": "X",
"code_ine": null,
"code_nip": null,
"date_naissance": null,
"email": null,
"emailperso": null,
"etudid": 19,
"nom": "FOURNIER",
"prenom": "ANNE"
},
...
]
"""
# Si le formsemestre_id a été renseigné
if formsemestre_id is not None:
# Récupération du formsemestre
formsemestre = models.FormSemestre.query.filter_by(
id=formsemestre_id
# Le département, spécifié par un id ou un acronyme
try:
dept_id = int(dept_ident)
except ValueError:
dept_id = None
if dept_id is None:
departement = models.Departement.query.filter_by(
acronym=dept_ident
).first_or_404()
# Récupération du département
departement = formsemestre.departement
# Si le formsemestre_id n'a pas été renseigné
else:
# Récupération du formsemestre
departement = models.Departement.query.filter_by(acronym=dept).first_or_404()
departement = models.Departement.query.get_or_404(dept_id)
# Mise en forme des données
list_etu = [etu.to_dict_bul(include_urls=False) for etu in departement.etudiants]
return jsonify(list_etu)
return jsonify([etud.to_dict_short() for etud in departement.etudiants])
@bp.route("/departements/<string:dept>/semestres_courants", methods=["GET"])
@bp.route("/departement/<string:dept_ident>/formsemestres_courants", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def liste_semestres_courant(dept: str):
def liste_semestres_courant(dept_ident: str):
"""
Liste des semestres actifs d'un départements donné
@ -149,13 +134,23 @@ def liste_semestres_courant(dept: str):
...
]
"""
# Récupération des départements comportant l'acronym mit en paramètre
dept = models.Departement.query.filter_by(acronym=dept).first_or_404()
# Le département, spécifié par un id ou un acronyme
try:
dept_id = int(dept_ident)
except ValueError:
dept_id = None
if dept_id is None:
departement = models.Departement.query.filter_by(
acronym=dept_ident
).first_or_404()
else:
departement = models.Departement.query.get_or_404(dept_id)
# Récupération des semestres suivant id_dept
semestres = models.FormSemestre.query.filter_by(dept_id=dept.id, etat=True)
# Les semestres en cours de ce département
formsemestres = models.FormSemestre.query.filter(
dept_id == departement.id,
FormSemestre.date_debut <= app.db.func.now(),
FormSemestre.date_fin >= app.db.func.now(),
)
# Mise en forme des données
data = [d.to_dict() for d in semestres]
return jsonify(data)
return jsonify([d.to_dict() for d in formsemestres])

View File

@ -20,7 +20,8 @@ from app.scodoc.sco_permissions import Permission
@token_permission_required(Permission.APIView)
def etudiants_courant(long=False):
"""
Retourne la liste des étudiants courant
Retourne la liste des étudiants inscrits dans un
formsemestre actuellement en cours.
Exemple de résultat :
[
@ -41,7 +42,6 @@ def etudiants_courant(long=False):
...
]
"""
# Récupération de tous les étudiants
etuds = Identite.query.filter(
Identite.id == FormSemestreInscription.etudid,
FormSemestreInscription.formsemestre_id == FormSemestre.id,

View File

@ -29,10 +29,10 @@ def formations_ids():
return jsonify(data)
@bp.route("/formations/<int:formation_id>", methods=["GET"])
@bp.route("/formation/<int:formation_id>", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def formations_by_id(formation_id: int):
def formation_by_id(formation_id: int):
"""
Retourne une formation en fonction d'un id donné
@ -63,12 +63,12 @@ def formations_by_id(formation_id: int):
@bp.route(
"/formations/formation_export/<int:formation_id>",
"/formation/formation_export/<int:formation_id>",
methods=["GET"],
defaults={"export_ids": False},
)
@bp.route(
"/formations/formation_export/<int:formation_id>/with_ids",
"/formation/formation_export/<int:formation_id>/with_ids",
methods=["GET"],
defaults={"export_ids": True},
)
@ -185,7 +185,7 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False):
return jsonify(data)
@bp.route("/formations/moduleimpl/<int:moduleimpl_id>", methods=["GET"])
@bp.route("/formation/moduleimpl/<int:moduleimpl_id>", methods=["GET"])
@token_auth.login_required
@token_permission_required(Permission.APIView)
def moduleimpl(moduleimpl_id: int):
@ -198,7 +198,6 @@ def moduleimpl(moduleimpl_id: int):
{
"id": 1,
"formsemestre_id": 1,
"computation_expr": null,
"module_id": 1,
"responsable_id": 2,
"moduleimpl_id": 1,
@ -230,63 +229,7 @@ def moduleimpl(moduleimpl_id: int):
@bp.route(
"/formations/moduleimpl/formsemestre/<int:formsemestre_id>/list",
methods=["GET"],
)
@token_auth.login_required
@token_permission_required(Permission.APIView)
def moduleimpls_sem(formsemestre_id: int):
"""
Retourne la liste des moduleimpl d'un semestre
formsemestre_id : l'id d'un formsemestre
Exemple d'utilisation :
[
{
"id": 1,
"formsemestre_id": 1,
"computation_expr": null,
"module_id": 1,
"responsable_id": 2,
"module": {
"heures_tp": 0.0,
"code_apogee": "",
"titre": "Initiation aux r\u00e9seaux informatiques",
"coefficient": 1.0,
"module_type": 2,
"id": 1,
"ects": null,
"abbrev": "Init aux r\u00e9seaux informatiques",
"ue_id": 1,
"code": "R101",
"formation_id": 1,
"heures_cours": 0.0,
"matiere_id": 1,
"heures_td": 0.0,
"semestre_id": 1,
"numero": 10,
"module_id": 1
},
"moduleimpl_id": 1,
"ens": []
},
...
]
"""
formsemestre = models.FormSemestre.query.filter_by(
id=formsemestre_id
).first_or_404()
moduleimpls = formsemestre.modimpls_sorted
data = [moduleimpl.to_dict() for moduleimpl in moduleimpls]
return jsonify(data)
@bp.route(
"/formations/<int:formation_id>/referentiel_competences",
"/formation/<int:formation_id>/referentiel_competences",
methods=["GET"],
)
@token_auth.login_required

View File

@ -22,31 +22,32 @@ def formsemestre(formsemestre_id: int):
Exemple de résultat :
{
"block_moyennes": false,
"bul_bgcolor": "white",
"bul_hide_xml": false,
"date_debut_iso": "2021-09-01",
"date_debut": "01/09/2021",
"date_fin_iso": "2022-08-31",
"date_fin": "31/08/2022",
"resp_can_edit": false,
"dept_id": 1,
"elt_annee_apo": null,
"elt_sem_apo": null,
"ens_can_edit_eval": false,
"etat": true,
"resp_can_change_ens": true,
"formation_id": 1,
"formsemestre_id": 1,
"gestion_compensation": false,
"gestion_semestrielle": 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,
"titre": "Semestre test",
"block_moyennes": false,
"resp_can_change_ens": true,
"resp_can_edit": false,
"responsables": [1, 99], // uids
"scodoc7_id": null,
"date_debut": "01/09/2021",
"gestion_semestrielle": false,
"bul_bgcolor": "white",
"formsemestre_id": 1,
"titre_num": "Semestre test semestre 1",
"date_debut_iso": "2021-09-01",
"date_fin_iso": "2022-08-31",
"responsables": [] <<< A DOCUMENTER XXX
"semestre_id": 1,
"titre_formation" : "BUT GEA",
"titre_num": "BUT GEA semestre 1",
"titre": "BUT GEA",
}
"""
@ -324,7 +325,7 @@ def bulletins(formsemestre_id: int):
)
@token_auth.login_required
@token_permission_required(Permission.APIView)
def formsemestre_programme(formsemestre_id: int): # XXX nom bizarre ??
def formsemestre_programme(formsemestre_id: int):
"""
Retourne la liste des Ues, ressources et SAE d'un semestre
@ -353,49 +354,40 @@ def formsemestre_programme(formsemestre_id: int): # XXX nom bizarre ??
],
"ressources": [
{
"titre": "Fondamentaux de la programmation",
"coefficient": 1.0,
"module_type": 2,
"id": 17,
"ects": null,
"abbrev": null,
"ue_id": 3,
"code": "R107",
"formation_id": 1,
"heures_cours": 0.0,
"matiere_id": 3,
"heures_td": 0.0,
"semestre_id": 1,
"heures_tp": 0.0,
"numero": 70,
"code_apogee": "",
"module_id": 17
"ens": [ 10, 18 ],
"formsemestre_id": 1,
"id": 15,
"module": {
"abbrev": "Programmer",
"code": "SAE15",
"code_apogee": "V7GOP",
"coefficient": 1.0,
"formation_id": 1,
"heures_cours": 0.0,
"heures_td": 0.0,
"heures_tp": 0.0,
"id": 15,
"matiere_id": 3,
"module_id": 15,
"module_type": 3,
"numero": 50,
"semestre_id": 1,
"titre": "Programmer en Python",
"ue_id": 3
},
"module_id": 15,
"moduleimpl_id": 15,
"responsable_id": 2
},
...
],
"saes": [
{
"titre": "Se pr\u00e9senter sur Internet",
"coefficient": 1.0,
"module_type": 3,
"id": 14,
"ects": null,
"abbrev": null,
"ue_id": 3,
"code": "SAE14",
"formation_id": 1,
"heures_cours": 0.0,
"matiere_id": 3,
"heures_td": 0.0,
"semestre_id": 1,
"heures_tp": 0.0,
"numero": 40,
"code_apogee": "",
"module_id": 14
...
},
...
],
"modules" : [ ... les modules qui ne sont niu des SAEs ni des ressources ... ]
"modules" : [ ... les modules qui ne sont ni des SAEs ni des ressources ... ]
}
"""
formsemestre: FormSemestre = models.FormSemestre.query.filter_by(
@ -403,27 +395,20 @@ def formsemestre_programme(formsemestre_id: int): # XXX nom bizarre ??
).first_or_404()
ues = formsemestre.query_ues()
ressources = [
modimpl.module
for modimpl in formsemestre.modimpls_sorted
if modimpl.module.module_type == ModuleType.RESSOURCE
]
saes = [
modimpl.module
for modimpl in formsemestre.modimpls_sorted
if modimpl.module.module_type == ModuleType.SAE
]
modules = [
modimpl.module
for modimpl in formsemestre.modimpls_sorted
if modimpl.module.module_type == ModuleType.STANDARD
]
data = {
"ues": [ue.to_dict() for ue in ues],
"ressources": [m.to_dict() for m in ressources],
"saes": [m.to_dict() for m in saes],
"modules": [m.to_dict() for m in modules],
m_list = {
ModuleType.RESSOURCE: [],
ModuleType.SAE: [],
ModuleType.STANDARD: [],
}
for modimpl in formsemestre.modimpls_sorted:
d = modimpl.to_dict()
m_list[modimpl.module.module_type].append(d)
return jsonify(data)
return jsonify(
{
"ues": [ue.to_dict() for ue in ues],
"ressources": m_list[ModuleType.RESSOURCE],
"saes": m_list[ModuleType.SAE],
"modules": m_list[ModuleType.STANDARD],
}
)

View File

@ -23,8 +23,26 @@ from tests.api.setup_test_api import API_URL, CHECK_CERTIFICATE, api_headers
from tests.api.tools_test_api import verify_fields
def test_departements_ids(api_headers):
""" "
Route: /departements_ids
"""
r = requests.get(
API_URL + "/departements_ids",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)
assert r.status_code == 200
departements_ids = r.json()
assert isinstance(departements_ids, list)
assert len(departements_ids) > 0
assert all(isinstance(x, int) for x in departements_ids)
def test_departements(api_headers):
"check liste de sdépartements"
""" "
Route: /departements
"""
fields = [
"id",
"acronym",

View File

@ -44,7 +44,7 @@ def test_formations_ids(api_headers):
# formations_by_id
def test_formations_by_id(api_headers):
"""
Route: /formations/<int:formation_id>
Route: /formation/<int:formation_id>
"""
fields = [
"id",
@ -61,7 +61,7 @@ def test_formations_by_id(api_headers):
]
r = requests.get(
API_URL + "/formations/1",
API_URL + "/formation/1",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)
@ -75,7 +75,7 @@ def test_formations_by_id(api_headers):
def test_formation_export(api_headers):
"""
Route: /formations/formation_export/<int:formation_id>
Route: /formation/formation_export/<int:formation_id>
"""
fields = [
"id",
@ -92,7 +92,7 @@ def test_formation_export(api_headers):
"ue",
]
r = requests.get(
API_URL + "/formations/formation_export/1",
API_URL + "/formation/formation_export/1",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)
@ -108,7 +108,7 @@ def test_formation_export(api_headers):
# TODO
# def test_formsemestre_apo(api_headers):
# r = requests.get(
# API_URL + "/formations/apo/<string:etape_apo>",
# API_URL + "/formation/apo/<string:etape_apo>",
# headers=api_headers,
# verify=CHECK_CERTIFICATE,
# )
@ -117,7 +117,7 @@ def test_formation_export(api_headers):
def test_moduleimpl(api_headers):
"""
Route: /formations/moduleimpl/<int:moduleimpl_id>
Route: /formation/moduleimpl/<int:moduleimpl_id>
"""
fields = [
"id",
@ -131,7 +131,7 @@ def test_moduleimpl(api_headers):
]
r = requests.get(
API_URL + "/formations/moduleimpl/1",
API_URL + "/formation/moduleimpl/1",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)
@ -145,7 +145,7 @@ def test_moduleimpl(api_headers):
def test_moduleimpls_sem(api_headers):
"""
Route: /formations/moduleimpl/formsemestre/<int:formsemestre_id>/list
Route: /formation/moduleimpl/formsemestre/<int:formsemestre_id>/list
"""
fields = [
"id",
@ -160,7 +160,7 @@ def test_moduleimpls_sem(api_headers):
"ens",
]
r = requests.get(
API_URL + "/formations/moduleimpl/formsemestre/1/list",
API_URL + "/formation/moduleimpl/formsemestre/1/list",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)
@ -175,10 +175,10 @@ def test_moduleimpls_sem(api_headers):
def test_referentiel_competences(api_headers):
"""
Route: "/formations/<int:formation_id>/referentiel_competences",
Route: "/formation/<int:formation_id>/referentiel_competences",
"""
r = requests.get(
API_URL + "/formations/1/referentiel_competences",
API_URL + "/formation/1/referentiel_competences",
headers=api_headers,
verify=CHECK_CERTIFICATE,
)