Skip to content

Commit b1dd321

Browse files
committed
refactor: add user_id to folder operations for permission checks
1 parent ad5c812 commit b1dd321

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

apps/folders/serializers/folder.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88

99
from application.models.application import Application, ApplicationFolder
1010
from application.serializers.application_folder import ApplicationFolderTreeSerializer
11-
from common.constants.permission_constants import Group
11+
from common.constants.permission_constants import Group, ResourcePermission, ResourcePermissionRole
1212
from folders.api.folder import FolderCreateRequest
1313
from knowledge.models import KnowledgeFolder, Knowledge
1414
from knowledge.serializers.knowledge_folder import KnowledgeFolderTreeSerializer
15+
from system_manage.models import WorkspaceUserResourcePermission
1516
from tools.models import ToolFolder, Tool
1617
from tools.serializers.tool_folder import ToolFolderTreeSerializer
18+
from users.serializers.user import is_workspace_manage
1719

1820

1921
def get_source_type(source):
@@ -140,6 +142,7 @@ class Operate(serializers.Serializer):
140142
id = serializers.CharField(required=True, label=_('folder id'))
141143
workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id'))
142144
source = serializers.CharField(required=True, label=_('source'))
145+
user_id = serializers.UUIDField(required=True, label=_('user id'))
143146

144147
@transaction.atomic
145148
def edit(self, instance):
@@ -194,13 +197,36 @@ def delete(self):
194197
raise serializers.ValidationError(_('Folder does not exist'))
195198
if folder.id == folder.workspace_id:
196199
raise serializers.ValidationError(_('Cannot delete root folder'))
197-
nodes = Folder.objects.filter(id=self.data.get('id')).get_descendants(include_self=True)
198-
for node in nodes:
199-
# print(node)
200-
# 删除相关的资源
201-
Source.objects.filter(folder_id=node.id).delete()
202-
# 删除节点
203-
node.delete()
200+
201+
# 工作空间管理员可以删除
202+
workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id'))
203+
if workspace_manage:
204+
nodes = Folder.objects.filter(id=self.data.get('id')).get_descendants(include_self=True)
205+
for node in nodes:
206+
# print(node)
207+
# 删除相关的资源
208+
Source.objects.filter(folder_id=node.id).delete()
209+
# 删除节点
210+
node.delete()
211+
# 普通用户删除的文件夹内全部都得是自己有权限的资源
212+
else:
213+
nodes = Folder.objects.filter(id=self.data.get('id')).get_descendants(include_self=True)
214+
for node in nodes:
215+
# 删除相关的资源
216+
source_ids = Source.objects.filter(folder_id=node.id).values_list('id', flat=True)
217+
# 检查文件夹是否存在未授权当前用户的资源
218+
auth_list = QuerySet(WorkspaceUserResourcePermission).filter(
219+
Q(workspace_id=self.data.get('workspace_id')) &
220+
Q(user_id=self.data.get('user_id')) &
221+
Q(auth_target_type=self.data.get('source')) &
222+
Q(target__in=source_ids) &
223+
Q(permission_list__overlap=[ResourcePermission.MANAGE, ResourcePermissionRole.ROLE])
224+
).count()
225+
if auth_list != len(source_ids):
226+
raise serializers.ValidationError(_('This folder contains resources that you do not have permission to delete'))
227+
# print('Deleting folder:', node.id)
228+
Source.objects.filter(folder_id=node.id).delete()
229+
node.delete()
204230

205231

206232
class FolderTreeSerializer(serializers.Serializer):

apps/folders/views/folder.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class Operate(APIView):
9696
)
9797
def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
9898
return result.success(FolderSerializer.Operate(
99-
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}
99+
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
100100
).edit(request.data))
101101

102102
@extend_schema(
@@ -115,7 +115,7 @@ def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
115115
)
116116
def get(self, request: Request, workspace_id: str, source: str, folder_id: str):
117117
return result.success(FolderSerializer.Operate(
118-
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}
118+
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
119119
).one())
120120

121121
@extend_schema(
@@ -138,5 +138,5 @@ def get(self, request: Request, workspace_id: str, source: str, folder_id: str):
138138
)
139139
def delete(self, request: Request, workspace_id: str, source: str, folder_id: str):
140140
return result.success(FolderSerializer.Operate(
141-
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}
141+
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
142142
).delete())

0 commit comments

Comments
 (0)