From 4cb513dd3f15003e1daedd370e0e80adebb93c82 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Wed, 7 May 2025 10:05:53 +0800 Subject: [PATCH] feat: enhance Tool API to return folder and tool structure for a given folder ID --- apps/tools/serializers/tool.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py index e8ee72901..2730a6b6b 100644 --- a/apps/tools/serializers/tool.py +++ b/apps/tools/serializers/tool.py @@ -18,6 +18,7 @@ from common.result import result from common.utils.tool_code import ToolExecutor from maxkb.const import CONFIG from tools.models import Tool, ToolScope, ToolFolder +from tools.serializers.tool_folder import ToolFolderTreeSerializer tool_executor = ToolExecutor(CONFIG.get('SANDBOX')) @@ -325,14 +326,25 @@ class ToolTreeSerializer(serializers.Serializer): self.is_valid(raise_exception=True) if not folder_id: folder_id = 'root' - root = ToolFolder.objects.filter(id=folder_id).first() - if not root: + # 获取当前文件夹 + current_folder = ToolFolder.objects.filter(id=folder_id).first() + if not current_folder: raise serializers.ValidationError(_('Folder not found')) - # 使用MPTT的get_descendants()方法获取所有相关节点 - all_folders = root.get_descendants(include_self=True) - tools = QuerySet(Tool).filter(workspace_id=self.data.get('workspace_id'), folder_id__in=all_folders) - return ToolModelSerializer(tools, many=True).data + # 获取当前文件夹下的直接子文件夹 + child_folders = ToolFolder.objects.filter(parent=current_folder) + folders_data = ToolFolderTreeSerializer(child_folders, many=True).data + + # 获取当前文件夹下的工具 + tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) & + Q(folder_id=folder_id)) + tools_data = ToolModelSerializer(tools, many=True).data + + # 返回包含文件夹和工具的结构 + return { + 'folders': folders_data, + 'tools': tools_data, + } class Query(serializers.Serializer): workspace_id = serializers.CharField(required=True, label=_('workspace id'))