Files
opc-backend/users/permissions.py

32 lines
1.4 KiB
Python
Raw Permalink Normal View History

from rest_framework import permissions
from .models import RolePermission
class HasAPIPermission(permissions.BasePermission):
"""
Checks if the user has the specific API permission required by the view.
The view must define `required_permission = 'api:something'` or a dictionary mapping methods to permissions:
`required_permissions = {'GET': 'api:read', 'POST': 'api:write'}`
"""
def has_permission(self, request, view):
if not request.user or not request.user.is_authenticated:
return False
if getattr(request.user, 'is_superuser', False):
return True
method = request.method
required_perm = None
if hasattr(view, 'required_permissions') and isinstance(view.required_permissions, dict):
required_perm = view.required_permissions.get(method)
elif hasattr(view, 'required_permission'):
required_perm = view.required_permission
if not required_perm:
# If no permission is required, default to IsAdminUser logic for safety,
# or True if you want it open. Let's require staff status by default for admin views.
return request.user.is_staff
user_perms = RolePermission.objects.filter(role__userrole__user=request.user).values_list('permission__code', flat=True)
return required_perm in user_perms