API: user_info via cas_id

This commit is contained in:
Lyanis Souidi 2025-02-25 23:27:20 +01:00
parent eef00649de
commit 695024cce2
2 changed files with 68 additions and 8 deletions

View File

@ -9,15 +9,15 @@
from flask_login import current_user from flask_login import current_user
from sqlalchemy import desc, or_ from sqlalchemy import desc, or_
from app import models
from app.models import Departement, Identite, Admission from app.models import Departement, Identite, Admission
from app.auth.models import User
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
def get_etud( def get_etud(
etudid: int | None = None, nip: str | None = None, ine: str | None = None etudid: int | None = None, nip: str | None = None, ine: str | None = None
) -> models.Identite | None: ) -> Identite | None:
""" """
L'instance d'étudiant la plus récente en fonction de l'etudid, L'instance d'étudiant la plus récente en fonction de l'etudid,
ou du code nip ou code ine. ou du code nip ou code ine.
@ -53,3 +53,33 @@ def get_etud(
if etud is None: if etud is None:
etud = query.first() etud = query.first()
return etud return etud
def get_user(uid: int | None = None, casid: str | None = None) -> User | None:
"""
L'instance d'utilisateur en fonction de l'uid ou de l'id cas.
uid : None ou un int uid
casid : None ou un str casid
Return None si utilisateur inexistant.
"""
allowed_depts = current_user.get_depts_with_permission(Permission.UsersView)
if uid is not None:
try:
uid = int(uid)
except ValueError as exc:
raise ScoValueError("uid invalide") from exc
query: User = User.query.filter_by(id=uid)
elif casid is not None:
query = User.query.filter_by(cas_id=casid)
else:
raise ScoValueError("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)
)
return query.first()

View File

@ -17,7 +17,7 @@ from flask_json import as_json
from flask_login import current_user, login_required from flask_login import current_user, login_required
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, tools
from app.api import api_permission_required as permission_required from app.api import api_permission_required as permission_required
from app.auth.models import User, Role, UserRole from app.auth.models import User, Role, UserRole
from app.auth.models import is_valid_password from app.auth.models import is_valid_password
@ -34,13 +34,10 @@ from app.scodoc.sco_utils import json_error
@scodoc @scodoc
@permission_required(Permission.UsersView) @permission_required(Permission.UsersView)
@as_json @as_json
def user_info(uid: int): def user_info_deprecated(uid: int):
""" """
Info sur un compte utilisateur ScoDoc. Info sur un compte utilisateur ScoDoc.
Déprécié, utiliser /user/uid/<int:uid> à la place.
SAMPLES
-------
/user/2
""" """
user: User = db.session.get(User, uid) user: User = db.session.get(User, uid)
if user is None: if user is None:
@ -53,6 +50,39 @@ def user_info(uid: int):
return user.to_dict() return user.to_dict()
@bp.route("/user/uid/<int:uid>")
@bp.route("/user/casid/<string:casid>")
@api_web_bp.route("/user/uid/<int:uid>")
@api_web_bp.route("/user/casid/<string:casid>")
@login_required
@scodoc
@permission_required(Permission.UsersView)
@as_json
def user_info(uid: int = None, casid: str = None):
"""
Retourne les informations de l'utilisateur correspondant, ou 404 si non trouvé.
PARAMS
------
uid : l'id de l'utilisateur
casid : l'identifiant CAS de l'utilisateur
`uid` et `casid` sont uniques dans la base (tous départements).
SAMPLES
-------
/user/uid/2
"""
user = tools.get_user(uid, casid)
if user is None:
return json_error(
404,
message="utilisateur inconnu",
)
return user.to_dict()
@bp.route("/users/query") @bp.route("/users/query")
@api_web_bp.route("/users/query") @api_web_bp.route("/users/query")
@login_required @login_required