Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/api/plane/api/permissions/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .workspace import WorkspaceAdminOnlyPermission, WorkspaceAdminWriteMemberReadPermission
Comment thread
sriramveeraghanta marked this conversation as resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
54 changes: 54 additions & 0 deletions apps/api/plane/api/permissions/workspace.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Copyright (c) 2023-present Plane Software, Inc. and contributors
# SPDX-License-Identifier: AGPL-3.0-only
# See the LICENSE file for details.

from rest_framework.permissions import BasePermission, SAFE_METHODS

from plane.db.models import WorkspaceMember


Admin = 20
Member = 15
Comment thread
sriramveeraghanta marked this conversation as resolved.
Outdated


class WorkspaceAdminOnlyPermission(BasePermission):
"""
Permission class for external APIs that restricts access to workspace admins only.
"""

Comment thread
sriramveeraghanta marked this conversation as resolved.
def has_permission(self, request, view):
if request.user.is_anonymous:
return False

return WorkspaceMember.objects.filter(
member=request.user,
workspace__slug=view.workspace_slug,
role=Admin,
is_active=True,
).exists()
Comment thread
coderabbitai[bot] marked this conversation as resolved.


class WorkspaceAdminWriteMemberReadPermission(BasePermission):
"""
Permission class for external APIs that allows workspace members to read
but restricts write operations to workspace admins only.
"""

def has_permission(self, request, view):
if request.user.is_anonymous:
return False

if request.method in SAFE_METHODS:
return WorkspaceMember.objects.filter(
member=request.user,
workspace__slug=view.workspace_slug,
role__in=[Admin, Member],
is_active=True,
).exists()

return WorkspaceMember.objects.filter(
member=request.user,
workspace__slug=view.workspace_slug,
role=Admin,
is_active=True,
).exists()
Loading