1616# Module imports
1717from .base import BaseViewSet , BaseAPIView
1818from plane .app .serializers import ProjectMemberInviteSerializer
19-
2019from plane .app .permissions import allow_permission , ROLE
21-
2220from plane .db .models import (
2321 ProjectMember ,
2422 Workspace ,
2523 ProjectMemberInvite ,
2624 User ,
2725 WorkspaceMember ,
26+ Project ,
2827 IssueUserProperty ,
2928)
29+ from plane .db .models .project import ProjectNetwork
3030
3131
3232class ProjectInvitationsViewset (BaseViewSet ):
@@ -128,6 +128,7 @@ def get_queryset(self):
128128 .select_related ("workspace" , "workspace__owner" , "project" )
129129 )
130130
131+ @allow_permission ([ROLE .ADMIN , ROLE .MEMBER ], level = "WORKSPACE" )
131132 def create (self , request , slug ):
132133 project_ids = request .data .get ("project_ids" , [])
133134
@@ -136,11 +137,20 @@ def create(self, request, slug):
136137 member = request .user , workspace__slug = slug , is_active = True
137138 )
138139
139- if workspace_member .role not in [ROLE .ADMIN .value , ROLE .MEMBER .value ]:
140- return Response (
141- {"error" : "You do not have permission to join the project" },
142- status = status .HTTP_403_FORBIDDEN ,
143- )
140+ # Get all the projects
141+ projects = Project .objects .filter (
142+ id__in = project_ids , workspace__slug = slug
143+ ).only ("id" , "network" )
144+ # Check if user has permission to join each project
145+ for project in projects :
146+ if (
147+ project .network == ProjectNetwork .SECRET .value
148+ and workspace_member .role != ROLE .ADMIN .value
149+ ):
150+ return Response (
151+ {"error" : "Only workspace admins can join private project" },
152+ status = status .HTTP_403_FORBIDDEN ,
153+ )
144154
145155 workspace_role = workspace_member .role
146156 workspace = workspace_member .workspace
0 commit comments