(self,
current_user, name=None)
| 332 | return False |
| 333 | |
| 334 | def get_folder_tree(self, |
| 335 | current_user, name=None): |
| 336 | self.is_valid(raise_exception=True) |
| 337 | user_id = current_user.id |
| 338 | workspace_id = self.data.get('workspace_id') |
| 339 | source = self.data.get('source') |
| 340 | |
| 341 | Folder = get_folder_type(source) # noqa |
| 342 | |
| 343 | # 检查特定工作空间的树结构完整性 |
| 344 | workspace_folders = Folder.objects.filter(workspace_id=workspace_id) |
| 345 | # 如果发现数据不一致,重建整个表(这是 MPTT 的限制) |
| 346 | if self._check_tree_integrity(workspace_folders): |
| 347 | Folder.objects.rebuild() |
| 348 | |
| 349 | workspace_manage = is_workspace_manage(user_id, workspace_id) |
| 350 | |
| 351 | base_q = Q(workspace_id=workspace_id) |
| 352 | |
| 353 | if name is not None: |
| 354 | base_q &= Q(name__contains=name) |
| 355 | if not workspace_manage: |
| 356 | having_read_permission_by_role = has_exact_permission_by_role(user_id, workspace_id, |
| 357 | f"{source}_FOLDER:READ", |
| 358 | RoleConstants.USER.value.__str__()) |
| 359 | permission_condition = ['VIEW'] |
| 360 | if having_read_permission_by_role: |
| 361 | permission_condition = ['VIEW', 'ROLE'] |
| 362 | |
| 363 | base_q &= (Q(id__in=WorkspaceUserResourcePermission.objects.filter(user_id=current_user.id, |
| 364 | auth_target_type=self.data.get('source'), |
| 365 | workspace_id=self.data.get( |
| 366 | 'workspace_id'), |
| 367 | permission_list__overlap=permission_condition) |
| 368 | .values_list( |
| 369 | 'target', flat=True)) | Q(id=self.data.get('workspace_id'))) |
| 370 | |
| 371 | nodes = Folder.objects.filter(base_q).get_cached_trees() |
| 372 | |
| 373 | TreeSerializer = get_folder_tree_serializer(self.data.get('source')) # noqa |
| 374 | serializer = TreeSerializer(nodes, many=True) |
| 375 | |
| 376 | return [d for d in serializer.data if |
| 377 | d.get('id') == d.get('workspace_id')] if name is None else serializer.data # 这是可序列化的字典 |
no test coverage detected