|
8 | 8 |
|
9 | 9 | from application.models.application import Application, ApplicationFolder |
10 | 10 | 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 |
12 | 12 | from folders.api.folder import FolderCreateRequest |
13 | 13 | from knowledge.models import KnowledgeFolder, Knowledge |
14 | 14 | from knowledge.serializers.knowledge_folder import KnowledgeFolderTreeSerializer |
| 15 | +from system_manage.models import WorkspaceUserResourcePermission |
15 | 16 | from tools.models import ToolFolder, Tool |
16 | 17 | from tools.serializers.tool_folder import ToolFolderTreeSerializer |
| 18 | +from users.serializers.user import is_workspace_manage |
17 | 19 |
|
18 | 20 |
|
19 | 21 | def get_source_type(source): |
@@ -140,6 +142,7 @@ class Operate(serializers.Serializer): |
140 | 142 | id = serializers.CharField(required=True, label=_('folder id')) |
141 | 143 | workspace_id = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('workspace id')) |
142 | 144 | source = serializers.CharField(required=True, label=_('source')) |
| 145 | + user_id = serializers.UUIDField(required=True, label=_('user id')) |
143 | 146 |
|
144 | 147 | @transaction.atomic |
145 | 148 | def edit(self, instance): |
@@ -194,13 +197,36 @@ def delete(self): |
194 | 197 | raise serializers.ValidationError(_('Folder does not exist')) |
195 | 198 | if folder.id == folder.workspace_id: |
196 | 199 | 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() |
204 | 230 |
|
205 | 231 |
|
206 | 232 | class FolderTreeSerializer(serializers.Serializer): |
|
0 commit comments