forked from ScoDoc/ScoDoc
107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
##############################################################################
|
|
# ScoDoc
|
|
# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved.
|
|
# See LICENSE
|
|
##############################################################################
|
|
|
|
"""
|
|
ScoDoc 9 API : partitions
|
|
"""
|
|
from flask import abort, jsonify, request
|
|
|
|
from app.api import bp
|
|
|
|
from app.api.errors import error_response
|
|
from app.api.auth import token_auth, token_permission_required
|
|
from app.models import FormSemestre, FormSemestreInscription, Identite
|
|
from app.models import GroupDescr, Partition
|
|
from app.models.groups import group_membership
|
|
from app.scodoc.sco_permissions import Permission
|
|
from app.scodoc import sco_utils as scu
|
|
|
|
|
|
@bp.route("/partition/<int:partition_id>", methods=["GET"])
|
|
@token_auth.login_required
|
|
@token_permission_required(Permission.APIView)
|
|
def partition_info(partition_id: int):
|
|
"""
|
|
Exemple de résultat :
|
|
```
|
|
{
|
|
'bul_show_rank': False,
|
|
'formsemestre_id': 39,
|
|
'groups': [
|
|
{'id': 268, 'name': 'A', 'partition_id': 100},
|
|
{'id': 269, 'name': 'B', 'partition_id': 100}
|
|
],
|
|
'groups_editable': True,
|
|
'id': 100,
|
|
'numero': 100,
|
|
'partition_name': 'TD',
|
|
'show_in_lists': True
|
|
}
|
|
```
|
|
"""
|
|
partition = Partition.query.get_or_404(partition_id)
|
|
return jsonify(partition.to_dict(with_groups=True))
|
|
|
|
|
|
@bp.route("/formsemestre/<int:formsemestre_id>/partitions", methods=["GET"])
|
|
@token_auth.login_required
|
|
@token_permission_required(Permission.APIView)
|
|
def formsemestre_partitions(formsemestre_id: int):
|
|
"""
|
|
Retourne la liste de toutes les partitions d'un formsemestre
|
|
|
|
formsemestre_id : l'id d'un formsemestre
|
|
|
|
"""
|
|
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
|
return jsonify(
|
|
[partition.to_dict(with_groups=True) for partition in formsemestre.partitions]
|
|
)
|
|
|
|
|
|
@bp.route("/group/<int:group_id>/etudiants", methods=["GET"])
|
|
@token_auth.login_required
|
|
@token_permission_required(Permission.APIView)
|
|
def etud_in_group(group_id: int):
|
|
"""
|
|
Retourne la liste des étudiants dans un groupe
|
|
|
|
group_id : l'id d'un groupe
|
|
|
|
Exemple de résultat :
|
|
[
|
|
{
|
|
'civilite': 'M',
|
|
'id': 123456,
|
|
'ine': None,
|
|
'nip': '987654321',
|
|
'nom': 'MARTIN',
|
|
'nom_usuel': null,
|
|
'prenom': 'JEAN'}
|
|
},
|
|
...
|
|
]
|
|
"""
|
|
group = GroupDescr.query.get_or_404(group_id)
|
|
return jsonify([etud.to_dict_short() for etud in group.etuds])
|
|
|
|
|
|
@bp.route("/group/<int:group_id>/etudiants/query", methods=["GET"])
|
|
def etud_in_group_query(group_id: int):
|
|
"""Etudiants du groupe, filtrés par état"""
|
|
etat = request.get("etat", "")
|
|
if etat not in {scu.INSCRIT, scu.DEMISSION, scu.DEF}:
|
|
abort(404, "etat invalid")
|
|
group = GroupDescr.query.get_or_404(group_id)
|
|
query = (
|
|
Identite.query.join(FormSemestreInscription)
|
|
.filter_by(formsemestre_id=group.partition.formsemestre_id, etat=etat)
|
|
.join(group_membership)
|
|
.filter_by(group_id=group_id)
|
|
)
|
|
|
|
return jsonify([etud.to_dict_short() for etud in query])
|