diff --git a/apps/tools/api/tool.py b/apps/tools/api/tool.py index a82e79ac848..4046669ef1a 100644 --- a/apps/tools/api/tool.py +++ b/apps/tools/api/tool.py @@ -68,3 +68,24 @@ def get_request(): 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, + ) + ] diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py index 4960ac74e8f..ab8b1259c9d 100644 --- a/apps/tools/serializers/tool.py +++ b/apps/tools/serializers/tool.py @@ -7,7 +7,7 @@ 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 @@ def insert(self, instance, with_valid=True): 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 @@ def one(self): 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 diff --git a/apps/tools/urls.py b/apps/tools/urls.py index 8f05a5e7a71..0ba1b9ec3ca 100644 --- a/apps/tools/urls.py +++ b/apps/tools/urls.py @@ -5,5 +5,6 @@ app_name = "tool" urlpatterns = [ path('workspace//tool', views.ToolView.Create.as_view()), + path('workspace//tool/tree', views.ToolTreeView.as_view()), path('workspace//tool/', views.ToolView.Operate.as_view()), ] diff --git a/apps/tools/views/tool.py b/apps/tools/views/tool.py index f29d520d13b..863a0befcf7 100644 --- a/apps/tools/views/tool.py +++ b/apps/tools/views/tool.py @@ -7,8 +7,8 @@ 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 @@ def put(self, request: Request, workspace_id: str, tool_id: str): ).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 @@ def delete(self, request: Request, workspace_id: str, tool_id: str): 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')))