50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
from rest_framework import permissions
|
|
|
|
from apps.workspaces.models import Workspace
|
|
from apps.workspaces.services import (
|
|
CLIENTS_CREATE,
|
|
CLIENTS_DELETE,
|
|
CLIENTS_EDIT,
|
|
CLIENTS_VIEW,
|
|
can_delete_workspace_object,
|
|
has_workspace_capability,
|
|
)
|
|
|
|
|
|
class IsClientWorkspaceMember(permissions.BasePermission):
|
|
"""
|
|
Applies capability-based access checks for client resources.
|
|
"""
|
|
|
|
message = "You do not have permission to access this client."
|
|
|
|
def has_permission(self, request, view):
|
|
if not request.user.is_authenticated:
|
|
return False
|
|
|
|
if view.action == "create":
|
|
workspace_id = request.data.get("workspace_id")
|
|
if not workspace_id:
|
|
return False
|
|
workspace = Workspace.objects.filter(id=workspace_id, is_deleted=False).first()
|
|
return bool(
|
|
workspace and has_workspace_capability(request.user, workspace, CLIENTS_CREATE)
|
|
)
|
|
|
|
return True
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
if not request.user.is_authenticated:
|
|
return False
|
|
|
|
capability = {
|
|
"retrieve": CLIENTS_VIEW,
|
|
"list": CLIENTS_VIEW,
|
|
"update": CLIENTS_EDIT,
|
|
"partial_update": CLIENTS_EDIT,
|
|
"destroy": CLIENTS_DELETE,
|
|
}.get(view.action, CLIENTS_VIEW)
|
|
if view.action == "destroy":
|
|
return can_delete_workspace_object(request.user, obj, CLIENTS_DELETE)
|
|
return has_workspace_capability(request.user, obj.workspace, capability)
|