API: décorateur api_permission_required pour la documentation

This commit is contained in:
Emmanuel Viennet 2024-07-17 12:03:08 +02:00
parent 650afd5c03
commit 7623ccef2b
12 changed files with 53 additions and 15 deletions

View File

@ -1,10 +1,14 @@
"""api.__init__ """api.__init__
""" """
from functools import wraps
from flask_json import as_json from flask_json import as_json
from flask import Blueprint from flask import Blueprint
from flask import request, g from flask import current_app, g, request
from flask_login import current_user from flask_login import current_user
from app import db from app import db
from app.decorators import permission_required
from app.scodoc import sco_utils as scu from app.scodoc import sco_utils as scu
from app.scodoc.sco_exceptions import AccessDenied, ScoException from app.scodoc.sco_exceptions import AccessDenied, ScoException
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
@ -16,6 +20,28 @@ api_web_bp = Blueprint("apiweb", __name__)
API_CLIENT_ERROR = 400 # erreur dans les paramètres fournis par le client API_CLIENT_ERROR = 400 # erreur dans les paramètres fournis par le client
def api_permission_required(permission):
"""Ce décorateur fait la même chose que @permission_required
mais enregistre dans l'attribut .scodoc_permission
de la fonction la valeur de la permission.
Cette valeur n'est utilisée que pour la génération automatique de la documentation.
"""
def decorator(f):
f.scodoc_permission = permission
@wraps(f)
def decorated_function(*args, **kwargs):
scodoc_dept = getattr(g, "scodoc_dept", None)
if not current_user.has_permission(permission, scodoc_dept):
return current_app.login_manager.unauthorized()
return f(*args, **kwargs)
return decorated_function
return decorator
@api_bp.errorhandler(ScoException) @api_bp.errorhandler(ScoException)
@api_web_bp.errorhandler(ScoException) @api_web_bp.errorhandler(ScoException)
@api_bp.errorhandler(404) @api_bp.errorhandler(404)

View File

@ -21,8 +21,9 @@ import app
from app import db, log from app import db, log
from app.api import api_bp as bp, api_web_bp from app.api import api_bp as bp, api_web_bp
from app.api import tools from app.api import tools
from app.api import api_permission_required as permission_required
from app.but import bulletin_but_court from app.but import bulletin_but_court
from app.decorators import scodoc, permission_required from app.decorators import scodoc
from app.models import ( from app.models import (
Admission, Admission,
Departement, Departement,

View File

@ -14,7 +14,8 @@ from flask_login import current_user, login_required
import app import app
from app import log, db from app import log, db
from app.api import api_bp as bp, api_web_bp from app.api import api_bp as bp, api_web_bp
from app.decorators import scodoc, permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.models import Evaluation, ModuleImpl, FormSemestre from app.models import Evaluation, ModuleImpl, FormSemestre
from app.scodoc import sco_evaluation_db, sco_saisie_notes from app.scodoc import sco_evaluation_db, sco_saisie_notes
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError from app.scodoc.sco_exceptions import AccessDenied, ScoValueError

View File

@ -15,9 +15,10 @@ from flask_login import login_required
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 from app.api import api_bp as bp, api_web_bp
from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.models import APO_CODE_STR_LEN from app.models import APO_CODE_STR_LEN
from app.scodoc.sco_utils import json_error from app.scodoc.sco_utils import json_error
from app.decorators import scodoc, permission_required
from app.models import ( from app.models import (
ApcNiveau, ApcNiveau,
ApcParcours, ApcParcours,

View File

@ -16,7 +16,8 @@ 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
from app.decorators import scodoc, permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.scodoc.sco_utils import json_error from app.scodoc.sco_utils import json_error
from app.comp import res_sem from app.comp import res_sem
from app.comp.moy_mod import ModuleImplResults from app.comp.moy_mod import ModuleImplResults

View File

@ -17,7 +17,8 @@ from flask_login import current_user, login_required
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, tools from app.api import api_bp as bp, api_web_bp, API_CLIENT_ERROR, tools
from app.decorators import scodoc, permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.scodoc.sco_exceptions import ScoException from app.scodoc.sco_exceptions import ScoException
from app.but import jury_but_results from app.but import jury_but_results
from app.models import ( from app.models import (

View File

@ -19,7 +19,8 @@ from app import db, set_sco_dept
from app.api import api_bp as bp from app.api import api_bp as bp
from app.api import api_web_bp from app.api import api_web_bp
from app.api import get_model_api_object, tools from app.api import get_model_api_object, tools
from app.decorators import permission_required, scodoc from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.models import Identite, Justificatif, Departement, FormSemestre, Scolog from app.models import Identite, Justificatif, Departement, FormSemestre, Scolog
from app.models.assiduites import ( from app.models.assiduites import (
get_formsemestre_from_data, get_formsemestre_from_data,

View File

@ -34,11 +34,13 @@ from flask import Response, send_file
from flask_json import as_json from flask_json import as_json
from app.api import api_bp as bp from app.api import api_bp as bp
from app.scodoc.sco_utils import json_error from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.models import Departement from app.models import Departement
from app.scodoc.sco_logos import list_logos, find_logo from app.scodoc.sco_logos import list_logos, find_logo
from app.decorators import scodoc, permission_required
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_utils import json_error
# Note: l'API logos n'est accessible qu'en mode global (avec jeton, sans dept) # Note: l'API logos n'est accessible qu'en mode global (avec jeton, sans dept)

View File

@ -13,7 +13,8 @@ from flask_login import login_required
import app import app
from app.api import api_bp as bp, api_web_bp from app.api import api_bp as bp, api_web_bp
from app.decorators import scodoc, permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.models import ModuleImpl from app.models import ModuleImpl
from app.scodoc import sco_liste_notes from app.scodoc import sco_liste_notes
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission

View File

@ -18,7 +18,8 @@ from sqlalchemy.exc import IntegrityError
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
from app.decorators import scodoc, permission_required from app.api import api_permission_required as permission_required
from app.decorators import scodoc
from app.scodoc.sco_utils import json_error from app.scodoc.sco_utils import json_error
from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import FormSemestre, FormSemestreInscription, Identite
from app.models import GroupDescr, Partition, Scolog from app.models import GroupDescr, Partition, Scolog

View File

@ -14,15 +14,14 @@ 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
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
from app.decorators import scodoc, permission_required from app.decorators import scodoc
from app.models import Departement, ScoDocSiteConfig from app.models import Departement
from app.scodoc import sco_edt_cal
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
from app.scodoc.sco_utils import json_error from app.scodoc.sco_utils import json_error
from app.scodoc import sco_utils as scu
@bp.route("/user/<int:uid>") @bp.route("/user/<int:uid>")

View File

@ -84,6 +84,9 @@ def scodoc(func):
def permission_required(permission): def permission_required(permission):
"""Vérifie les permissions"""
# Attention: l'API utilise api_permission_required
def decorator(f): def decorator(f):
@wraps(f) @wraps(f)
def decorated_function(*args, **kwargs): def decorated_function(*args, **kwargs):