feat: add ToolTreeView and ToolTreeReadAPI for retrieving tools by workspace and module

This commit is contained in:
CaptainB 2025-04-18 17:46:20 +08:00 committed by 刘瑞斌
parent 6f6b163416
commit fe032822f4
4 changed files with 62 additions and 6 deletions

View File

@ -68,3 +68,24 @@ class ToolEditAPI(ToolReadAPI):
class ToolDeleteAPI(ToolReadAPI):
pass
class ToolTreeReadAPI(APIMixin):
@staticmethod
def get_parameters():
return [
OpenApiParameter(
name="workspace_id",
description="工作空间id",
type=OpenApiTypes.STR,
location='path',
required=True,
),
OpenApiParameter(
name="module_id",
description="模块id",
type=OpenApiTypes.STR,
location='query',
required=True,
)
]

View File

@ -7,7 +7,7 @@ from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from tools.models import Tool, ToolScope
from tools.models import Tool, ToolScope, ToolModule
class ToolModelSerializer(serializers.ModelSerializer):
@ -63,7 +63,7 @@ class ToolCreateRequest(serializers.Serializer):
class ToolSerializer(serializers.Serializer):
class Create(serializers.Serializer):
user_id = serializers.UUIDField(required=True, label=_('user id'))
workspace_id = serializers.UUIDField(required=True, label=_('workspace id'))
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
def insert(self, instance, with_valid=True):
if with_valid:
@ -77,6 +77,7 @@ class ToolSerializer(serializers.Serializer):
input_field_list=instance.get('input_field_list', []),
init_field_list=instance.get('init_field_list', []),
scope=ToolScope.WORKSPACE,
module_id=instance.get('module_id', 'root'),
is_active=False)
tool.save()
return ToolModelSerializer(tool).data
@ -109,3 +110,20 @@ class ToolSerializer(serializers.Serializer):
self.is_valid(raise_exception=True)
tool = QuerySet(Tool).filter(id=self.data.get('id')).first()
return ToolModelSerializer(tool).data
class ToolTreeSerializer(serializers.Serializer):
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
def get_tools(self, module_id):
self.is_valid(raise_exception=True)
if not module_id:
module_id = 'root'
root = ToolModule.objects.filter(id=module_id).first()
if not root:
raise serializers.ValidationError(_('Module not found'))
# 使用MPTT的get_family()方法获取所有相关节点
all_modules = root.get_descendants(include_self=True)
tools = QuerySet(Tool).filter(workspace_id=self.data.get('workspace_id'), module_id__in=all_modules)
return ToolModelSerializer(tools, many=True).data

View File

@ -5,5 +5,6 @@ from . import views
app_name = "tool"
urlpatterns = [
path('workspace/<str:workspace_id>/tool', views.ToolView.Create.as_view()),
path('workspace/<str:workspace_id>/tool/tree', views.ToolTreeView.as_view()),
path('workspace/<str:workspace_id>/tool/<str:tool_id>', views.ToolView.Operate.as_view()),
]

View File

@ -7,8 +7,8 @@ from common.auth import TokenAuth
from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants
from common.result import result
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI
from tools.serializers.tool import ToolSerializer
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer
class ToolView(APIView):
@ -45,8 +45,8 @@ class ToolView(APIView):
).edit(request.data))
@extend_schema(methods=['GET'],
description=_('Update tool'),
operation_id=_('Update tool'),
description=_('Get tool'),
operation_id=_('Get tool'),
parameters=ToolReadAPI.get_parameters(),
responses=ToolReadAPI.get_response(),
tags=[_('Tool')])
@ -66,3 +66,19 @@ class ToolView(APIView):
return result.success(ToolSerializer.Operate(
data={'id': tool_id, 'workspace_id': workspace_id}
).delete())
class ToolTreeView(APIView):
authentication_classes = [TokenAuth]
@extend_schema(methods=['GET'],
description=_('Get tool'),
operation_id=_('Get tool'),
parameters=ToolTreeReadAPI.get_parameters(),
responses=ToolTreeReadAPI.get_response(),
tags=[_('Tool')])
@has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission())
def get(self, request: Request, workspace_id: str):
return result.success(ToolTreeSerializer(
data={'workspace_id': workspace_id}
).get_tools(request.query_params.get('module_id')))