- Route formsemstre Extension Count & Query
Correction:
  - Route delete : mise en conformité avec la documentation
  - Simplifcation fonction de gestion des métriques
This commit is contained in:
iziram 2022-12-16 10:13:40 +01:00
parent 3ff4abd19c
commit a9615bc077
2 changed files with 188 additions and 127 deletions

View File

@ -24,13 +24,6 @@ import app.scodoc.sco_utils as scu
import app.scodoc.sco_assiduites as scass import app.scodoc.sco_assiduites as scass
"""
TODO:
- Faire une nouvelle route pour obtenir toutes les assiduites d'un formsemstre
- Ajouter des variantes "batch" pour chaque route POST pour envoyer des listes d'objets
"""
@bp.route("/assiduite/<int:assiduiteid>") @bp.route("/assiduite/<int:assiduiteid>")
@api_web_bp.route("/assiduite/<int:assiduiteid>") @api_web_bp.route("/assiduite/<int:assiduiteid>")
@scodoc @scodoc
@ -111,52 +104,13 @@ def count_assiduites(etudid: int = None, with_query: bool = False):
metric: str = "all" metric: str = "all"
if with_query: if with_query:
# cas 1 : etat assiduite metric, filter = count_manager(request)
etat = request.args.get("etat")
if etat is not None:
filter["etat"] = etat
# cas 2 : date de début return jsonify(
deb = request.args.get("date_debut") scass.get_assiduites_stats(
deb: datetime = scu.is_iso_formated(deb, True) assiduites=etud.assiduites, metric=metric, filter=filter
if deb is not None: )
filter["date_debut"] = deb )
# cas 3 : date de fin
fin = request.args.get("date_fin")
fin = scu.is_iso_formated(fin, True)
if fin is not None:
filter["date_fin"] = fin
# cas 4 : moduleimpl_id
module = request.args.get("moduleimpl_id", False)
try:
if module is False:
raise Exception
if module != "":
module = int(module)
else:
module = None
except Exception:
module = False
if module is not False:
filter["moduleimpl_id"] = module
# cas 5 : formsemestre_id
formsemestre_id = request.args.get("formsemestre_id")
if formsemestre_id is not None:
formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id)
formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first()
filter["formsemestre"] = formsemestre
# cas 6 : type
metric = request.args.get("metric", "count")
return jsonify(scass.get_assiduite_stats(etud=etud, metric=metric, filter=filter))
@bp.route("/assiduites/<int:etudid>", defaults={"with_query": False}) @bp.route("/assiduites/<int:etudid>", defaults={"with_query": False})
@ -192,6 +146,9 @@ def assiduites(etudid: int = None, with_query: bool = False):
query?moduleimpl_id=[- int ou vide -] query?moduleimpl_id=[- int ou vide -]
ex: query?moduleimpl_id=1234 ex: query?moduleimpl_id=1234
query?moduleimpl_od= query?moduleimpl_od=
Formsemstre_id (l'id du formsemestre concerné par l'assiduité)
query?formsemstre_id=[int]
ex query?formsemestre_id=3
""" """
@ -204,48 +161,7 @@ def assiduites(etudid: int = None, with_query: bool = False):
assiduites = etud.assiduites assiduites = etud.assiduites
if with_query: if with_query:
# cas 1 : etat assiduite assiduites = filter_manager(request, assiduites)
etat = request.args.get("etat")
if etat is not None:
assiduites = scass.filter_by_etat(assiduites, etat)
# cas 2 : date de début
deb = request.args.get("date_debut")
deb: datetime = scu.is_iso_formated(deb, True)
if deb is not None:
assiduites = scass.filter_by_date(assiduites, deb, sup=True)
# cas 3 : date de fin
fin = request.args.get("date_fin")
fin = scu.is_iso_formated(fin, True)
if fin is not None:
assiduites = scass.filter_by_date(assiduites, fin, sup=False)
# cas 4 : moduleimpl_id
module = request.args.get("moduleimpl_id", False)
try:
if module is False:
raise Exception
if module != "":
module = int(module)
else:
module = None
except Exception:
module = False
if module is not False:
assiduites = scass.filter_by_module_impl(assiduites, module)
# cas 5 : formsemestre_id
formsemestre_id = request.args.get("formsemestre_id")
if formsemestre_id is not None:
formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id)
formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first()
assiduites = scass.filter_by_formsemstre(assiduites, formsemestre)
data_set: List[dict] = [] data_set: List[dict] = []
for ass in assiduites.all(): for ass in assiduites.all():
@ -255,12 +171,24 @@ def assiduites(etudid: int = None, with_query: bool = False):
return jsonify(data_set) return jsonify(data_set)
@bp.route("/assiduites/formsemestre/<int:formsemestre_id>") @bp.route(
@api_web_bp.route("/assiduites/formsemestre/<int:formsemestre_id>") "/assiduites/formsemestre/<int:formsemestre_id>", defaults={"with_query": False}
)
@api_web_bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>", defaults={"with_query": False}
)
@bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/query",
defaults={"with_query": True},
)
@api_web_bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/query",
defaults={"with_query": True},
)
@login_required @login_required
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def assiduites_formsemestre(formsemestre_id: int = None): def assiduites_formsemestre(formsemestre_id: int = None, with_query: bool = False):
if formsemestre_id is not None: if formsemestre_id is not None:
formsemestre: FormSemestre = None formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id) formsemestre_id = int(formsemestre_id)
@ -270,14 +198,16 @@ def assiduites_formsemestre(formsemestre_id: int = None):
json_error(404, "le paramètre 'formsemestre_id' n'existe pas") json_error(404, "le paramètre 'formsemestre_id' n'existe pas")
etuds = formsemestre.etuds.all() etuds = formsemestre.etuds.all()
assiduites = [] etuds_id = [etud.id for etud in etuds]
for etud in etuds:
assiduites.extend( assiduites = Assiduite.query.filter(Assiduite.etudid.in_(etuds_id))
scass.filter_by_formsemstre(etud.assiduites, formsemestre).all() assiduites = scass.filter_by_formsemstre(assiduites, formsemestre)
)
if with_query:
assiduites = filter_manager(request, assiduites)
data_set: List[dict] = [] data_set: List[dict] = []
for ass in assiduites: for ass in assiduites.all():
data = ass.to_dict() data = ass.to_dict()
data_set.append(change_etat(data)) data_set.append(change_etat(data))
@ -287,6 +217,52 @@ def assiduites_formsemestre(formsemestre_id: int = None):
return json_error(404, "le paramètre 'formsemestre_id doit être renseigné'") return json_error(404, "le paramètre 'formsemestre_id doit être renseigné'")
@bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/count",
defaults={"with_query": False},
)
@api_web_bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/count",
defaults={"with_query": False},
)
@bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/count/query",
defaults={"with_query": True},
)
@api_web_bp.route(
"/assiduites/formsemestre/<int:formsemestre_id>/count/query",
defaults={"with_query": True},
)
@login_required
@scodoc
@permission_required(Permission.ScoView)
def count_assiduites_formsemestre(
formsemestre_id: int = None, with_query: bool = False
):
if formsemestre_id is not None:
formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id)
formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first()
if formsemestre is None:
json_error(404, "le paramètre 'formsemestre_id' n'existe pas")
etuds = formsemestre.etuds.all()
etuds_id = [etud.id for etud in etuds]
assiduites = Assiduite.query.filter(Assiduite.etudid.in_(etuds_id))
assiduites = scass.filter_by_formsemstre(assiduites, formsemestre)
metric: str = "all"
filter: dict = {}
if with_query:
metric, filter = count_manager(request)
return jsonify(scass.get_assiduites_stats(assiduites, metric, filter))
else:
return json_error(404, "le paramètre 'formsemestre_id doit être renseigné'")
@bp.route("/assiduite/<int:etudid>/create", methods=["POST"], defaults={"batch": False}) @bp.route("/assiduite/<int:etudid>/create", methods=["POST"], defaults={"batch": False})
@api_web_bp.route( @api_web_bp.route(
"/assiduite/<int:etudid>/create", methods=["POST"], defaults={"batch": False} "/assiduite/<int:etudid>/create", methods=["POST"], defaults={"batch": False}
@ -444,7 +420,7 @@ def delete(batch: bool = False):
output["success"].append({ass: msg}) output["success"].append({ass: msg})
else: else:
code, msg = delete_singular( code, msg = delete_singular(
request.get_json(force=True).get("assiduite_id", -1), db request.get_json(force=True).get("assiduiteid", -1), db
) )
output[code] = msg output[code] = msg
@ -460,26 +436,12 @@ def delete_singular(assiduite_id: int, db):
return (200, "OK") return (200, "OK")
@bp.route( @bp.route("/assiduite/<int:assiduiteid>/edit", methods=["POST"])
"/assiduite/<int:assiduiteid>/edit", methods=["POST"], defaults={"batch": False} @api_web_bp.route("/assiduite/<int:assiduiteid>/edit", methods=["POST"])
)
@api_web_bp.route(
"/assiduite/<int:assiduiteid>/edit", methods=["POST"], defaults={"batch": False}
)
@bp.route(
"/assiduite/<int:assiduiteid>/edit/batch",
methods=["POST"],
defaults={"batch": True},
)
@api_web_bp.route(
"/assiduite/<int:assiduiteid>/edit/batch",
methods=["POST"],
defaults={"batch": True},
)
@login_required @login_required
@scodoc @scodoc
@permission_required(Permission.ScoAssiduiteChange) @permission_required(Permission.ScoAssiduiteChange)
def edit(assiduiteid: int, batch: bool = False): def edit(assiduiteid: int):
""" """
Edition d'une assiduité à partir de son id Edition d'une assiduité à partir de son id
La requête doit avoir un content type "application/json": La requête doit avoir un content type "application/json":
@ -527,8 +489,6 @@ def edit(assiduiteid: int, batch: bool = False):
# -- Utils -- # -- Utils --
def change_etat(data: dict, from_int: bool = True): def change_etat(data: dict, from_int: bool = True):
"""change dans un json la valeur du champs état""" """change dans un json la valeur du champs état"""
if from_int: if from_int:
@ -536,3 +496,106 @@ def change_etat(data: dict, from_int: bool = True):
else: else:
data["etat"] = scu.ETATS_ASSIDUITE.get(data["etat"]) data["etat"] = scu.ETATS_ASSIDUITE.get(data["etat"])
return data return data
def count_manager(request) -> tuple[str, dict]:
"""
Retourne la/les métriques à utiliser ainsi que le filtre donnés en query de la requête
"""
filter: dict = {}
# cas 1 : etat assiduite
etat = request.args.get("etat")
if etat is not None:
filter["etat"] = etat
# cas 2 : date de début
deb = request.args.get("date_debut")
deb: datetime = scu.is_iso_formated(deb, True)
if deb is not None:
filter["date_debut"] = deb
# cas 3 : date de fin
fin = request.args.get("date_fin")
fin = scu.is_iso_formated(fin, True)
if fin is not None:
filter["date_fin"] = fin
# cas 4 : moduleimpl_id
module = request.args.get("moduleimpl_id", False)
try:
if module is False:
raise Exception
if module != "":
module = int(module)
else:
module = None
except Exception:
module = False
if module is not False:
filter["moduleimpl_id"] = module
# cas 5 : formsemestre_id
formsemestre_id = request.args.get("formsemestre_id")
if formsemestre_id is not None:
formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id)
formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first()
filter["formsemestre"] = formsemestre
# cas 6 : type
metric = request.args.get("metric", "all")
return (metric, filter)
def filter_manager(request, assiduites):
"""
Retourne les assiduites entrées filtrées en fonction de la request
"""
# cas 1 : etat assiduite
etat = request.args.get("etat")
if etat is not None:
assiduites = scass.filter_by_etat(assiduites, etat)
# cas 2 : date de début
deb = request.args.get("date_debut")
deb: datetime = scu.is_iso_formated(deb, True)
if deb is not None:
assiduites = scass.filter_by_date(assiduites, deb, sup=True)
# cas 3 : date de fin
fin = request.args.get("date_fin")
fin = scu.is_iso_formated(fin, True)
if fin is not None:
assiduites = scass.filter_by_date(assiduites, fin, sup=False)
# cas 4 : moduleimpl_id
module = request.args.get("moduleimpl_id", False)
try:
if module is False:
raise Exception
if module != "":
module = int(module)
else:
module = None
except Exception:
module = False
if module is not False:
assiduites = scass.filter_by_module_impl(assiduites, module)
# cas 5 : formsemestre_id
formsemestre_id = request.args.get("formsemestre_id")
if formsemestre_id is not None:
formsemestre: FormSemestre = None
formsemestre_id = int(formsemestre_id)
formsemestre = FormSemestre.query.filter_by(id=formsemestre_id).first()
assiduites = scass.filter_by_formsemstre(assiduites, formsemestre)
return assiduites

View File

@ -7,11 +7,9 @@ from datetime import datetime, date, time, timedelta
# TOTALK: Réfléchir sur le fractionnement d'une assiduite prolongée # TOTALK: Réfléchir sur le fractionnement d'une assiduite prolongée
def get_assiduite_stats( def get_assiduites_stats(
etud: Identite, metric: str = "all", filter: dict[str, object] = {} assiduites: Assiduite, metric: str = "all", filter: dict[str, object] = {}
) -> Assiduite: ) -> Assiduite:
assiduites: Assiduite = etud.assiduites
if filter != {}: if filter != {}:
for key in filter: for key in filter:
if key == "etat": if key == "etat":