feat: add ToolTreeView and ToolTreeReadAPI for retrieving tools by workspace and module
This commit is contained in:
parent
6f6b163416
commit
fe032822f4
@ -68,3 +68,24 @@ class ToolEditAPI(ToolReadAPI):
|
|||||||
|
|
||||||
class ToolDeleteAPI(ToolReadAPI):
|
class ToolDeleteAPI(ToolReadAPI):
|
||||||
pass
|
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,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|||||||
@ -7,7 +7,7 @@ from django.db.models import QuerySet
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from tools.models import Tool, ToolScope
|
from tools.models import Tool, ToolScope, ToolModule
|
||||||
|
|
||||||
|
|
||||||
class ToolModelSerializer(serializers.ModelSerializer):
|
class ToolModelSerializer(serializers.ModelSerializer):
|
||||||
@ -63,7 +63,7 @@ class ToolCreateRequest(serializers.Serializer):
|
|||||||
class ToolSerializer(serializers.Serializer):
|
class ToolSerializer(serializers.Serializer):
|
||||||
class Create(serializers.Serializer):
|
class Create(serializers.Serializer):
|
||||||
user_id = serializers.UUIDField(required=True, label=_('user id'))
|
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):
|
def insert(self, instance, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
@ -77,6 +77,7 @@ class ToolSerializer(serializers.Serializer):
|
|||||||
input_field_list=instance.get('input_field_list', []),
|
input_field_list=instance.get('input_field_list', []),
|
||||||
init_field_list=instance.get('init_field_list', []),
|
init_field_list=instance.get('init_field_list', []),
|
||||||
scope=ToolScope.WORKSPACE,
|
scope=ToolScope.WORKSPACE,
|
||||||
|
module_id=instance.get('module_id', 'root'),
|
||||||
is_active=False)
|
is_active=False)
|
||||||
tool.save()
|
tool.save()
|
||||||
return ToolModelSerializer(tool).data
|
return ToolModelSerializer(tool).data
|
||||||
@ -109,3 +110,20 @@ class ToolSerializer(serializers.Serializer):
|
|||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
tool = QuerySet(Tool).filter(id=self.data.get('id')).first()
|
tool = QuerySet(Tool).filter(id=self.data.get('id')).first()
|
||||||
return ToolModelSerializer(tool).data
|
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
|
||||||
|
|||||||
@ -5,5 +5,6 @@ from . import views
|
|||||||
app_name = "tool"
|
app_name = "tool"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('workspace/<str:workspace_id>/tool', views.ToolView.Create.as_view()),
|
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()),
|
path('workspace/<str:workspace_id>/tool/<str:tool_id>', views.ToolView.Operate.as_view()),
|
||||||
]
|
]
|
||||||
|
|||||||
@ -7,8 +7,8 @@ from common.auth import TokenAuth
|
|||||||
from common.auth.authentication import has_permissions
|
from common.auth.authentication import has_permissions
|
||||||
from common.constants.permission_constants import PermissionConstants
|
from common.constants.permission_constants import PermissionConstants
|
||||||
from common.result import result
|
from common.result import result
|
||||||
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI
|
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI
|
||||||
from tools.serializers.tool import ToolSerializer
|
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer
|
||||||
|
|
||||||
|
|
||||||
class ToolView(APIView):
|
class ToolView(APIView):
|
||||||
@ -45,8 +45,8 @@ class ToolView(APIView):
|
|||||||
).edit(request.data))
|
).edit(request.data))
|
||||||
|
|
||||||
@extend_schema(methods=['GET'],
|
@extend_schema(methods=['GET'],
|
||||||
description=_('Update tool'),
|
description=_('Get tool'),
|
||||||
operation_id=_('Update tool'),
|
operation_id=_('Get tool'),
|
||||||
parameters=ToolReadAPI.get_parameters(),
|
parameters=ToolReadAPI.get_parameters(),
|
||||||
responses=ToolReadAPI.get_response(),
|
responses=ToolReadAPI.get_response(),
|
||||||
tags=[_('Tool')])
|
tags=[_('Tool')])
|
||||||
@ -66,3 +66,19 @@ class ToolView(APIView):
|
|||||||
return result.success(ToolSerializer.Operate(
|
return result.success(ToolSerializer.Operate(
|
||||||
data={'id': tool_id, 'workspace_id': workspace_id}
|
data={'id': tool_id, 'workspace_id': workspace_id}
|
||||||
).delete())
|
).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')))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user