Skip to content

Commit fe03282

Browse files
committed
feat: add ToolTreeView and ToolTreeReadAPI for retrieving tools by workspace and module
1 parent 6f6b163 commit fe03282

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

apps/tools/api/tool.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,24 @@ def get_request():
6868

6969
class ToolDeleteAPI(ToolReadAPI):
7070
pass
71+
72+
73+
class ToolTreeReadAPI(APIMixin):
74+
@staticmethod
75+
def get_parameters():
76+
return [
77+
OpenApiParameter(
78+
name="workspace_id",
79+
description="工作空间id",
80+
type=OpenApiTypes.STR,
81+
location='path',
82+
required=True,
83+
),
84+
OpenApiParameter(
85+
name="module_id",
86+
description="模块id",
87+
type=OpenApiTypes.STR,
88+
location='query',
89+
required=True,
90+
)
91+
]

apps/tools/serializers/tool.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.utils.translation import gettext_lazy as _
88
from rest_framework import serializers
99

10-
from tools.models import Tool, ToolScope
10+
from tools.models import Tool, ToolScope, ToolModule
1111

1212

1313
class ToolModelSerializer(serializers.ModelSerializer):
@@ -63,7 +63,7 @@ class ToolCreateRequest(serializers.Serializer):
6363
class ToolSerializer(serializers.Serializer):
6464
class Create(serializers.Serializer):
6565
user_id = serializers.UUIDField(required=True, label=_('user id'))
66-
workspace_id = serializers.UUIDField(required=True, label=_('workspace id'))
66+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
6767

6868
def insert(self, instance, with_valid=True):
6969
if with_valid:
@@ -77,6 +77,7 @@ def insert(self, instance, with_valid=True):
7777
input_field_list=instance.get('input_field_list', []),
7878
init_field_list=instance.get('init_field_list', []),
7979
scope=ToolScope.WORKSPACE,
80+
module_id=instance.get('module_id', 'root'),
8081
is_active=False)
8182
tool.save()
8283
return ToolModelSerializer(tool).data
@@ -109,3 +110,20 @@ def one(self):
109110
self.is_valid(raise_exception=True)
110111
tool = QuerySet(Tool).filter(id=self.data.get('id')).first()
111112
return ToolModelSerializer(tool).data
113+
114+
115+
class ToolTreeSerializer(serializers.Serializer):
116+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
117+
118+
def get_tools(self, module_id):
119+
self.is_valid(raise_exception=True)
120+
if not module_id:
121+
module_id = 'root'
122+
root = ToolModule.objects.filter(id=module_id).first()
123+
if not root:
124+
raise serializers.ValidationError(_('Module not found'))
125+
# 使用MPTT的get_family()方法获取所有相关节点
126+
all_modules = root.get_descendants(include_self=True)
127+
128+
tools = QuerySet(Tool).filter(workspace_id=self.data.get('workspace_id'), module_id__in=all_modules)
129+
return ToolModelSerializer(tools, many=True).data

apps/tools/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
app_name = "tool"
66
urlpatterns = [
77
path('workspace/<str:workspace_id>/tool', views.ToolView.Create.as_view()),
8+
path('workspace/<str:workspace_id>/tool/tree', views.ToolTreeView.as_view()),
89
path('workspace/<str:workspace_id>/tool/<str:tool_id>', views.ToolView.Operate.as_view()),
910
]

apps/tools/views/tool.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from common.auth.authentication import has_permissions
88
from common.constants.permission_constants import PermissionConstants
99
from common.result import result
10-
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI
11-
from tools.serializers.tool import ToolSerializer
10+
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI
11+
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer
1212

1313

1414
class ToolView(APIView):
@@ -45,8 +45,8 @@ def put(self, request: Request, workspace_id: str, tool_id: str):
4545
).edit(request.data))
4646

4747
@extend_schema(methods=['GET'],
48-
description=_('Update tool'),
49-
operation_id=_('Update tool'),
48+
description=_('Get tool'),
49+
operation_id=_('Get tool'),
5050
parameters=ToolReadAPI.get_parameters(),
5151
responses=ToolReadAPI.get_response(),
5252
tags=[_('Tool')])
@@ -66,3 +66,19 @@ def delete(self, request: Request, workspace_id: str, tool_id: str):
6666
return result.success(ToolSerializer.Operate(
6767
data={'id': tool_id, 'workspace_id': workspace_id}
6868
).delete())
69+
70+
71+
class ToolTreeView(APIView):
72+
authentication_classes = [TokenAuth]
73+
74+
@extend_schema(methods=['GET'],
75+
description=_('Get tool'),
76+
operation_id=_('Get tool'),
77+
parameters=ToolTreeReadAPI.get_parameters(),
78+
responses=ToolTreeReadAPI.get_response(),
79+
tags=[_('Tool')])
80+
@has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission())
81+
def get(self, request: Request, workspace_id: str):
82+
return result.success(ToolTreeSerializer(
83+
data={'workspace_id': workspace_id}
84+
).get_tools(request.query_params.get('module_id')))

0 commit comments

Comments
 (0)