API: formsemestre(s)_with_description

This commit is contained in:
Emmanuel Viennet 2025-01-08 20:39:01 +01:00
parent 9f0bcbc937
commit df22198880
2 changed files with 110 additions and 33 deletions

View File

@ -14,14 +14,17 @@
""" """
import base64 import base64
import datetime
import io import io
from operator import attrgetter, itemgetter from operator import attrgetter, itemgetter
from flask import g, make_response, request from flask import g, make_response, request
from flask_json import as_json from flask_json import as_json
from flask_login import current_user, login_required from flask_login import current_user, login_required
from flask_sqlalchemy.query import Query
import PIL import PIL
import sqlalchemy as sa import sqlalchemy as sa
import app import app
from app import db, log from app import db, log
from app.api import api_bp as bp, api_web_bp, API_CLIENT_ERROR from app.api import api_bp as bp, api_web_bp, API_CLIENT_ERROR
@ -76,37 +79,30 @@ def formsemestre_get(formsemestre_id: int):
return formsemestre.to_dict_api() return formsemestre.to_dict_api()
@bp.route("/formsemestres/query") @bp.route("/formsemestre/<int:formsemestre_id>/with_description")
@api_web_bp.route("/formsemestres/query") @api_web_bp.route("/formsemestre/<int:formsemestre_id>/with_description")
@login_required @login_required
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
@as_json @as_json
def formsemestres_query(): def formsemestre_get_with_description(formsemestre_id: int):
""" """
Retourne les formsemestres filtrés par étape Apogée ou année scolaire Information sur le formsemestre indiqué, avec description externe et champs pour AutoSco.
ou département (acronyme ou id) ou état ou code étudiant.
PARAMS formsemestre_id : l'id du formsemestre
------
etape_apo : un code étape apogée
annee_scolaire : année de début de l'année scolaire
dept_acronym : acronyme du département (eg "RT")
dept_id : id du département
ine ou nip: code d'un étudiant: ramène alors tous les semestres auxquels il est inscrit.
etat: 0 si verrouillé, 1 sinon
QUERY
-----
etape_apo:<string:etape_apo>
annee_scolaire:<string:annee_scolaire>
dept_acronym:<string:dept_acronym>
dept_id:<int:dept_id>
etat:<int:etat>
nip:<string:nip>
ine:<string:ine>
SAMPLES
-------
/formsemestre/1/with_description
""" """
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
sem = formsemestre.to_dict_api()
_add_description(formsemestre, sem)
return sem
def _list_formsemestres_query() -> Query:
"""Recupère les formsemestres selon les arguments passés (request.args)"""
etape_apo = request.args.get("etape_apo") etape_apo = request.args.get("etape_apo")
annee_scolaire = request.args.get("annee_scolaire") annee_scolaire = request.args.get("annee_scolaire")
dept_acronym = request.args.get("dept_acronym") dept_acronym = request.args.get("dept_acronym")
@ -157,16 +153,48 @@ def formsemestres_query():
if not inscr_joined: if not inscr_joined:
formsemestres = formsemestres.join(FormSemestreInscription).join(Identite) formsemestres = formsemestres.join(FormSemestreInscription).join(Identite)
formsemestres = formsemestres.filter_by(code_ine=ine) formsemestres = formsemestres.filter_by(code_ine=ine)
return formsemestres.order_by(
return [
formsemestre.to_dict_api()
for formsemestre in formsemestres.order_by(
FormSemestre.date_debut.desc(), FormSemestre.date_debut.desc(),
FormSemestre.modalite, FormSemestre.modalite,
FormSemestre.semestre_id, FormSemestre.semestre_id,
FormSemestre.titre, FormSemestre.titre,
) )
]
@bp.route("/formsemestres/query")
@api_web_bp.route("/formsemestres/query")
@login_required
@scodoc
@permission_required(Permission.ScoView)
@as_json
def formsemestres_query():
"""
Retourne les formsemestres filtrés par étape Apogée ou année scolaire
ou département (acronyme ou id) ou état ou code étudiant.
PARAMS
------
etape_apo : un code étape apogée
annee_scolaire : année de début de l'année scolaire
dept_acronym : acronyme du département (eg "RT")
dept_id : id du département
ine ou nip: code d'un étudiant: ramène alors tous les semestres auxquels il est inscrit.
etat: 0 si verrouillé, 1 sinon
QUERY
-----
etape_apo:<string:etape_apo>
annee_scolaire:<string:annee_scolaire>
dept_acronym:<string:dept_acronym>
dept_id:<int:dept_id>
etat:<int:etat>
nip:<string:nip>
ine:<string:ine>
"""
formsemestres = _list_formsemestres_query()
return [formsemestre.to_dict_api() for formsemestre in formsemestres]
@bp.route("/formsemestre/<int:formsemestre_id>/edit", methods=["POST"]) @bp.route("/formsemestre/<int:formsemestre_id>/edit", methods=["POST"])
@ -815,6 +843,55 @@ def formsemestre_get_description(formsemestre_id: int):
return formsemestre.description.to_dict() if formsemestre.description else {} return formsemestre.description.to_dict() if formsemestre.description else {}
def _add_description(formsemestre: FormSemestre, sem: dict):
"""Add description and autosco fields to sem"""
if formsemestre.description is None:
sem["autosco"] = {}
sem["descr"] = {}
return
sem["descr"] = formsemestre.description.to_dict()
# Champs calculés pour AutoSco:
nb_inscrits = len(formsemestre.get_inscrits(etats={scu.INSCRIT, scu.DEF}))
nb_dispo = (
(formsemestre.capacite_accueil - nb_inscrits)
if formsemestre.capacite_accueil is not None
else None
)
descr: FormSemestreDescription = formsemestre.description
now = datetime.datetime.now(scu.TIME_ZONE)
sem["autosco"] = {
"visible": formsemestre.etat and not formsemestre.bul_hide_xml,
"inscription_autorisee": formsemestre.etat
and (nb_dispo is None or nb_dispo > 0)
and (not descr.date_debut_inscriptions or now >= descr.date_debut_inscriptions)
and (not descr.date_fin_inscriptions or now <= descr.date_fin_inscriptions),
"nb_inscrits": nb_inscrits,
"nb_dispo": nb_dispo,
}
@bp.route("/formsemestres/with_description/query")
@api_web_bp.route("/formsemestres/with_description/query")
@login_required
@scodoc
@permission_required(Permission.ScoView)
@as_json
def formsemestres_with_description():
"""Liste des formsemestres (filtrés selon query, voir formsemestres/query)
avec description externe pour AutoSco.
"""
formsemestre: FormSemestre
formsemestres = _list_formsemestres_query()
res = []
for formsemestre in formsemestres:
sem = formsemestre.to_dict_api()
_add_description(formsemestre, sem)
res.append(sem)
return res
@bp.post("/formsemestre/<int:formsemestre_id>/description/edit") @bp.post("/formsemestre/<int:formsemestre_id>/description/edit")
@api_web_bp.post("/formsemestre/<int:formsemestre_id>/description/edit") @api_web_bp.post("/formsemestre/<int:formsemestre_id>/description/edit")
@login_required @login_required

View File

@ -3,7 +3,7 @@
"Infos sur version ScoDoc" "Infos sur version ScoDoc"
SCOVERSION = "9.7.50" SCOVERSION = "9.7.51"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"