diff --git a/apps/folders/serializers/folder.py b/apps/folders/serializers/folder.py index 73afd65be..3e39a81c7 100644 --- a/apps/folders/serializers/folder.py +++ b/apps/folders/serializers/folder.py @@ -57,7 +57,7 @@ def get_folder_tree_serializer(source): return None -FOLDER_DEPTH = 2 # Folder 不能超过3层 +FOLDER_DEPTH = 10000 def check_depth(source, parent_id, workspace_id, current_depth=0): @@ -79,7 +79,7 @@ def check_depth(source, parent_id, workspace_id, current_depth=0): # 验证层级深度 if depth + current_depth > FOLDER_DEPTH: - raise serializers.ValidationError(_('Folder depth cannot exceed 3 levels')) + raise serializers.ValidationError(_('Folder depth cannot exceed 10000 levels')) def get_max_depth(current_node): @@ -100,6 +100,12 @@ def get_max_depth(current_node): return max_depth +def has_target_permission(workspace_id, source, user_id, target): + return QuerySet(WorkspaceUserResourcePermission).filter(workspace_id=workspace_id, user_id=user_id, + auth_target_type=source, target=target, + permission_list__contains=['MANAGE']).exists() + + class FolderSerializer(serializers.Serializer): id = serializers.CharField(required=True, label=_('folder id')) name = serializers.CharField(required=True, label=_('folder name')) @@ -185,11 +191,22 @@ class FolderSerializer(serializers.Serializer): QuerySet(Folder).filter(id=current_id).update(**edit_dict) if parent_id is not None and current_id != current_node.workspace_id and current_node.parent_id != parent_id: - # Folder 不能超过3层 - current_depth = get_max_depth(current_node) - check_depth(self.data.get('source'), parent_id, current_node.workspace_id, current_depth) - parent = Folder.objects.get(id=parent_id) - current_node.move_to(parent) + + source_type = self.data.get('source') + if has_target_permission(current_node.workspace_id, source_type, self.data.get('user_id'), + parent_id) or is_workspace_manage(self.data.get('user_id'), + current_node.workspace_id): + current_depth = get_max_depth(current_node) + check_depth(self.data.get('source'), parent_id, current_node.workspace_id, current_depth) + parent = Folder.objects.get(id=parent_id) + + if QuerySet(Folder).filter(name=current_node.name, parent_id=parent_id, + workspace_id=current_node.workspace_id).exists(): + raise serializers.ValidationError(_('Folder name already exists')) + + current_node.move_to(parent) + else: + raise AppApiException(403, _('No permission for the target folder')) return self.one() diff --git a/apps/locales/en_US/LC_MESSAGES/django.po b/apps/locales/en_US/LC_MESSAGES/django.po index af7b713d1..a24494790 100644 --- a/apps/locales/en_US/LC_MESSAGES/django.po +++ b/apps/locales/en_US/LC_MESSAGES/django.po @@ -2207,7 +2207,7 @@ msgid "parent id" msgstr "" #: apps/folders/serializers/folder.py:75 -msgid "Folder depth cannot exceed 3 levels" +msgid "Folder depth cannot exceed 5 levels" msgstr "" #: apps/folders/serializers/folder.py:100 @@ -8763,4 +8763,7 @@ msgid "Tag value already exists" msgstr "" msgid "Non-existent id" +msgstr "" + +msgid "No permission for the target folder" msgstr "" \ No newline at end of file diff --git a/apps/locales/zh_CN/LC_MESSAGES/django.po b/apps/locales/zh_CN/LC_MESSAGES/django.po index f5160241b..793bef404 100644 --- a/apps/locales/zh_CN/LC_MESSAGES/django.po +++ b/apps/locales/zh_CN/LC_MESSAGES/django.po @@ -2214,8 +2214,8 @@ msgid "parent id" msgstr "父级 ID" #: apps/folders/serializers/folder.py:75 -msgid "Folder depth cannot exceed 3 levels" -msgstr "文件夹深度不能超过3级" +msgid "Folder depth cannot exceed 5 levels" +msgstr "文件夹深度不能超过5级" #: apps/folders/serializers/folder.py:100 msgid "folder user id" @@ -8890,3 +8890,7 @@ msgstr "标签值已存在" msgid "Non-existent id" msgstr "不存在的ID" + +msgid "No permission for the target folder" +msgstr "没有目标文件夹的权限" + diff --git a/apps/locales/zh_Hant/LC_MESSAGES/django.po b/apps/locales/zh_Hant/LC_MESSAGES/django.po index 01749b1ef..e54373750 100644 --- a/apps/locales/zh_Hant/LC_MESSAGES/django.po +++ b/apps/locales/zh_Hant/LC_MESSAGES/django.po @@ -2214,8 +2214,8 @@ msgid "parent id" msgstr "父級 ID" #: apps/folders/serializers/folder.py:75 -msgid "Folder depth cannot exceed 3 levels" -msgstr "文件夾深度不能超過3級" +msgid "Folder depth cannot exceed 5 levels" +msgstr "文件夾深度不能超過5級" #: apps/folders/serializers/folder.py:100 msgid "folder user id" @@ -8890,3 +8890,7 @@ msgstr "標籤值已存在" msgid "Non-existent id" msgstr "不存在的ID" + +msgid "No permission for the target folder" +msgstr "沒有目標資料夾的權限" + diff --git a/ui/src/components/folder-tree/MoveToDialog.vue b/ui/src/components/folder-tree/MoveToDialog.vue index 861e5089f..aeed2a5e3 100644 --- a/ui/src/components/folder-tree/MoveToDialog.vue +++ b/ui/src/components/folder-tree/MoveToDialog.vue @@ -36,6 +36,7 @@