forked from ScoDoc/ScoDoc
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
##############################################################################
|
|
# ScoDoc
|
|
# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved.
|
|
# See LICENSE
|
|
##############################################################################
|
|
"""ScoDoc 9 API : outils
|
|
"""
|
|
|
|
from flask_login import current_user
|
|
from sqlalchemy import desc, or_
|
|
|
|
from app import models
|
|
from app.scodoc.sco_utils import json_error
|
|
from app.models import Departement, Identite, Admission
|
|
from app.scodoc.sco_permissions import Permission
|
|
|
|
|
|
def get_etud(
|
|
etudid: int | None = None, nip: str | None = None, ine: str | None = None
|
|
) -> models.Identite:
|
|
"""
|
|
L'instance d'étudiant la plus récente en fonction de l'etudid,
|
|
ou du code nip ou code ine.
|
|
|
|
etudid : None ou un int etudid
|
|
nip : None ou un int code_nip
|
|
ine : None ou un int code_ine
|
|
|
|
Return None si étudiant inexistant.
|
|
"""
|
|
allowed_depts = current_user.get_depts_with_permission(Permission.ScoView)
|
|
|
|
if etudid is not None:
|
|
try:
|
|
etudid = int(etudid)
|
|
except ValueError:
|
|
return json_error(
|
|
404,
|
|
message="etudid invalide",
|
|
)
|
|
query: Identite = Identite.query.filter_by(id=etudid)
|
|
elif nip is not None:
|
|
query = Identite.query.filter_by(code_nip=nip)
|
|
elif ine is not None:
|
|
query = Identite.query.filter_by(code_ine=ine)
|
|
else:
|
|
return json_error(
|
|
404,
|
|
message="parametre manquant",
|
|
)
|
|
if None not in allowed_depts:
|
|
# restreint aux départements autorisés:
|
|
query = query.join(Departement).filter(
|
|
or_(Departement.acronym == acronym for acronym in allowed_depts)
|
|
)
|
|
etud = query.join(Admission).order_by(desc(Admission.annee)).first()
|
|
# dans de rares cas (bricolages manuels, bugs), l'étudiant n'a pas de données d'admission
|
|
if etud is None:
|
|
etud = query.first()
|
|
return etud
|