diff --git a/app/api/__init__.py b/app/api/__init__.py index fb994bfdda079577f6c142f4d323747bf9a96d3c..8a205424920e6723cad550a1e6687e244b4b506e 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -1,10 +1,14 @@ """api.__init__ """ + +from functools import wraps + from flask_json import as_json from flask import Blueprint -from flask import request, g +from flask import current_app, g, request from flask_login import current_user from app import db +from app.decorators import permission_required from app.scodoc import sco_utils as scu from app.scodoc.sco_exceptions import AccessDenied, ScoException 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 +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_web_bp.errorhandler(ScoException) @api_bp.errorhandler(404) diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 5ec9f04a5565d41c55eba52d6b2b81942350d8c4..72f15b6f243de4d097ebeaf7babca9962b633c47 100755 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -21,8 +21,9 @@ import app from app import db, log from app.api import api_bp as bp, api_web_bp from app.api import tools +from app.api import api_permission_required as permission_required from app.but import bulletin_but_court -from app.decorators import scodoc, permission_required +from app.decorators import scodoc from app.models import ( Admission, Departement, diff --git a/app/api/evaluations.py b/app/api/evaluations.py index 510ad988d79074dbb9093cd0cf513d90469a6f49..3eafaffb95eb1ddc826a5baa792cb35906dc1f53 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -14,7 +14,8 @@ from flask_login import current_user, login_required import app from app import log, db 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.scodoc import sco_evaluation_db, sco_saisie_notes from app.scodoc.sco_exceptions import AccessDenied, ScoValueError diff --git a/app/api/formations.py b/app/api/formations.py index bce8861bd110b12b418cce2d7bd613d96b1feb3f..8f5601f4bf3cbdfd8532aebf9e35d6ee2526f539 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -15,9 +15,10 @@ from flask_login import login_required import app from app import db, log 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.scodoc.sco_utils import json_error -from app.decorators import scodoc, permission_required from app.models import ( ApcNiveau, ApcParcours, diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 6239c127836a9a8ae6cc4a5e12884981cb70a75c..e3d8d24c5f463074fc42414f43143d61a22de71f 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -16,7 +16,8 @@ import sqlalchemy as sa import app from app import db, log 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.comp import res_sem from app.comp.moy_mod import ModuleImplResults diff --git a/app/api/jury.py b/app/api/jury.py index 4fce0bfa0ea9f28e3a6a262345e3cc23dedd1d84..ef00cb84d25525b0a8e081c05c3578778e3a52be 100644 --- a/app/api/jury.py +++ b/app/api/jury.py @@ -17,7 +17,8 @@ from flask_login import current_user, login_required import app from app import db, log 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.but import jury_but_results from app.models import ( diff --git a/app/api/justificatifs.py b/app/api/justificatifs.py index 79c05d8efb2716536818110ccbfc7e72c47f196f..eacd6778c99e1291482345964cb542851d025253 100644 --- a/app/api/justificatifs.py +++ b/app/api/justificatifs.py @@ -19,7 +19,8 @@ from app import db, set_sco_dept from app.api import api_bp as bp from app.api import api_web_bp 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.assiduites import ( get_formsemestre_from_data, diff --git a/app/api/logos.py b/app/api/logos.py index 08b59e3707c88763ff72361a19131cadad33e258..319e258cd928ebd28bb24f56732670ffb05f7c83 100644 --- a/app/api/logos.py +++ b/app/api/logos.py @@ -34,11 +34,13 @@ from flask import Response, send_file from flask_json import as_json 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.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_utils import json_error + # Note: l'API logos n'est accessible qu'en mode global (avec jeton, sans dept) diff --git a/app/api/moduleimpl.py b/app/api/moduleimpl.py index 4b5db1b0f36ea91f3c1fc28ce5bbbf6d7588a323..e7999f71a01d23928529d21b3b47d432f9def2f3 100644 --- a/app/api/moduleimpl.py +++ b/app/api/moduleimpl.py @@ -13,7 +13,8 @@ from flask_login import login_required import app 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.scodoc import sco_liste_notes from app.scodoc.sco_permissions import Permission diff --git a/app/api/partitions.py b/app/api/partitions.py index 54c30355f9575088c33f09e11fbd1243bdcb64d4..bd45f91032dba95a431912224c0e7af51413869e 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -18,7 +18,8 @@ from sqlalchemy.exc import IntegrityError import app from app import db, log 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.models import FormSemestre, FormSemestreInscription, Identite from app.models import GroupDescr, Partition, Scolog diff --git a/app/api/users.py b/app/api/users.py index f1a600935885faf1caaf899aed7985cdd37bf3eb..37295a63d3a36ab755cf91e308d2475854784fd0 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -14,15 +14,14 @@ from flask_login import current_user, login_required from app import db, log 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 is_valid_password -from app.decorators import scodoc, permission_required -from app.models import Departement, ScoDocSiteConfig -from app.scodoc import sco_edt_cal +from app.decorators import scodoc +from app.models import Departement from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_permissions import Permission from app.scodoc.sco_utils import json_error -from app.scodoc import sco_utils as scu @bp.route("/user/<int:uid>") diff --git a/app/decorators.py b/app/decorators.py index 85b17a33af4c297f2d1a76e6a0c7f9e37b008351..f84ca85a69617b9e0764382bc683fe1df0af15ed 100644 --- a/app/decorators.py +++ b/app/decorators.py @@ -84,6 +84,9 @@ def scodoc(func): def permission_required(permission): + """Vérifie les permissions""" + + # Attention: l'API utilise api_permission_required def decorator(f): @wraps(f) def decorated_function(*args, **kwargs):