from urllib import request from rest_framework.permissions import BasePermission, SAFE_METHODS from rest_framework.permissions import IsAuthenticated from rest_framework_api_key.permissions import HasAPIKey #TOHLE POUŽÍT!!! #Prostě stačí vložit: RoleAllowed('seller','cityClerk') def RoleAllowed(*roles): """ Allows safe methods for any authenticated user. Allows unsafe methods only for users with specific roles. Allows access if a valid API key is provided. Args: RoleAllowed('admin', 'user') """ class SafeOrRolePermission(BasePermission): def has_permission(self, request, view): # Má API klíč? has_api_key = HasAPIKey().has_permission(request, view) # Allow safe methods for any authenticated user if request.method in SAFE_METHODS: return IsAuthenticated().has_permission(request, view) # Otherwise, check the user's role user = request.user return user and user.is_authenticated and getattr(user, "role", None) in roles return SafeOrRolePermission def OnlyRolesAllowed(*roles): class SafeOrRolePermission(BasePermission): """ Allows all methods only for users with specific roles. """ def has_permission(self, request, view): # Otherwise, check the user's role user = request.user return user and user.is_authenticated and getattr(user, "role", None) in roles return SafeOrRolePermission # For Settings.py class AdminOnly(BasePermission): """ Allows access only to users with the 'admin' role. Args: BasePermission (rest_framework.permissions.BasePermission): Base class for permission classes. """ def has_permission(self, request, view): return request.user and request.user.is_authenticated and getattr(request.user, 'role', None) == 'admin' # Commerce-specific permissions class AdminWriteOnlyOrReadOnly(BasePermission): """Allow read for anyone, write only for admins""" def has_permission(self, request, view): if request.method in SAFE_METHODS: return True return request.user and request.user.is_authenticated and getattr(request.user, 'role', None) == 'admin' class AdminOnlyForPatchOtherwisePublic(BasePermission): """Allow GET/POST for anyone, PATCH/PUT/DELETE only for admins""" def has_permission(self, request, view): if request.method in SAFE_METHODS or request.method == "POST": return True if request.method in ["PATCH", "PUT", "DELETE"]: return request.user and request.user.is_authenticated and getattr(request.user, 'role', None) == 'admin' # Default to admin for other unsafe methods return request.user and request.user.is_authenticated and getattr(request.user, 'role', None) == 'admin'