diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py index 11c58d804..3e83b4139 100644 --- a/apps/tools/serializers/tool.py +++ b/apps/tools/serializers/tool.py @@ -394,7 +394,7 @@ class ToolTreeSerializer(serializers.Serializer): name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('tool name')) tool_type = serializers.CharField(required=True, label=_('tool type')) - def page(self, current_page: int, page_size: int): + def page_tool(self, current_page: int, page_size: int): self.is_valid(raise_exception=True) folder_id = self.data.get('folder_id', 'root') @@ -414,3 +414,28 @@ class ToolTreeSerializer(serializers.Serializer): Q(folder_id__in=all_folders) & Q(tool_type=self.data.get('tool_type'))) return page_search(current_page, page_size, tools, lambda record: ToolModelSerializer(record).data) + + def page_tool_with_folders(self, current_page: int, page_size: int): + self.is_valid(raise_exception=True) + + folder_id = self.data.get('folder_id', 'root') + root = ToolFolder.objects.filter(id=folder_id).first() + if not root: + raise serializers.ValidationError(_('Folder not found')) + # 获取当前文件夹下的直接子文件夹 + child_folders = ToolFolder.objects.filter(parent=root) + folders_data = ToolFolderFlatSerializer(child_folders, many=True).data + + if self.data.get('name'): + tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) & + Q(folder_id=root) & + Q(tool_type=self.data.get('tool_type')) & + Q(name__contains=self.data.get('name'))) + else: + tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) & + Q(folder_id=root) & + Q(tool_type=self.data.get('tool_type'))) + return { + 'tools': page_search(current_page, page_size, tools, lambda record: ToolModelSerializer(record).data), + 'folders': folders_data + } diff --git a/apps/tools/views/tool.py b/apps/tools/views/tool.py index 988e8b7ce..408fb4073 100644 --- a/apps/tools/views/tool.py +++ b/apps/tools/views/tool.py @@ -135,7 +135,7 @@ class ToolView(APIView): 'name': request.query_params.get('name'), 'tool_type': request.query_params.get('tool_type'), } - ).page(current_page, page_size)) + ).page_tool_with_folders(current_page, page_size)) class Import(APIView): authentication_classes = [TokenAuth]