Skip to content

Commit 11331a6

Browse files
committed
feat: enhance Tool API by adding module_id and tool_type parameters, and refactor query handling
1 parent bbd7079 commit 11331a6

File tree

5 files changed

+64
-21
lines changed

5 files changed

+64
-21
lines changed

apps/tools/api/tool.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,6 @@ def get_parameters():
163163
location='path',
164164
required=True,
165165
),
166-
OpenApiParameter(
167-
name="tool_id",
168-
description="工具id",
169-
type=OpenApiTypes.STR,
170-
location='path',
171-
required=True,
172-
),
173166
OpenApiParameter(
174167
name="current_page",
175168
description="当前页码",
@@ -184,6 +177,21 @@ def get_parameters():
184177
location='path',
185178
required=True,
186179
),
180+
OpenApiParameter(
181+
name="module_id",
182+
description="模块id",
183+
type=OpenApiTypes.STR,
184+
location='query',
185+
required=True,
186+
),
187+
OpenApiParameter(
188+
name="tool_type",
189+
description="工具类型",
190+
type=OpenApiTypes.STR,
191+
enum=["CUSTOM", "INTERNAL"],
192+
location='query',
193+
required=True,
194+
),
187195
OpenApiParameter(
188196
name="name",
189197
description="工具名称",

apps/tools/migrations/0001_initial.py

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ class Migration(migrations.Migration):
6262
('scope',
6363
models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE',
6464
max_length=20, verbose_name='可用范围')),
65+
('tool_type',
66+
models.CharField(choices=[('INTERNAL', '内置'), ('CUSTOM', '自定义')], default='CUSTOM',
67+
max_length=20, verbose_name='函数类型', db_index=True)),
6568
('template_id', models.UUIDField(default=None, null=True, verbose_name='模版id')),
6669
('workspace_id', models.CharField(default='default', max_length=64, verbose_name='工作空间id', db_index=True)),
6770
('init_params', models.CharField(max_length=102400, null=True, verbose_name='初始化参数')),

apps/tools/models/tool.py

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ class ToolScope(models.TextChoices):
1010
WORKSPACE = "WORKSPACE", "工作空间可用"
1111

1212

13+
class ToolType(models.TextChoices):
14+
INTERNAL = "INTERNAL", '内置'
15+
CUSTOM = "CUSTOM", "自定义"
16+
17+
1318
class Tool(models.Model):
1419
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
1520
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
@@ -22,6 +27,8 @@ class Tool(models.Model):
2227
is_active = models.BooleanField(default=True)
2328
scope = models.CharField(max_length=20, verbose_name='可用范围', choices=ToolScope.choices,
2429
default=ToolScope.WORKSPACE)
30+
tool_type = models.CharField(max_length=20, verbose_name='函数类型', choices=ToolType.choices,
31+
default=ToolType.CUSTOM, db_index=True)
2532
template_id = models.UUIDField(max_length=128, verbose_name="模版id", null=True, default=None)
2633
module = models.ForeignKey(ToolModule, on_delete=models.CASCADE, verbose_name="模块id", default='root')
2734
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)

apps/tools/serializers/tool.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import uuid_utils.compat as uuid
77
from django.core import validators
88
from django.db import transaction
9-
from django.db.models import QuerySet
9+
from django.db.models import QuerySet, Q
1010
from django.http import HttpResponse
1111
from django.utils.translation import gettext_lazy as _
1212
from rest_framework import serializers, status
@@ -57,7 +57,7 @@ class ToolModelSerializer(serializers.ModelSerializer):
5757
class Meta:
5858
model = Tool
5959
fields = ['id', 'name', 'icon', 'desc', 'code', 'input_field_list', 'init_field_list', 'init_params',
60-
'scope', 'is_active', 'user_id', 'template_id', 'workspace_id', 'module_id',
60+
'scope', 'is_active', 'user_id', 'template_id', 'workspace_id', 'module_id', 'tool_type',
6161
'create_time', 'update_time']
6262

6363

@@ -291,8 +291,35 @@ def get_tools(self, module_id):
291291
root = ToolModule.objects.filter(id=module_id).first()
292292
if not root:
293293
raise serializers.ValidationError(_('Module not found'))
294-
# 使用MPTT的get_family()方法获取所有相关节点
294+
# 使用MPTT的get_descendants()方法获取所有相关节点
295295
all_modules = root.get_descendants(include_self=True)
296296

297297
tools = QuerySet(Tool).filter(workspace_id=self.data.get('workspace_id'), module_id__in=all_modules)
298298
return ToolModelSerializer(tools, many=True).data
299+
300+
class Query(serializers.Serializer):
301+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
302+
module_id = serializers.CharField(required=True, label=_('module id'))
303+
name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('tool name'))
304+
tool_type = serializers.CharField(required=True, label=_('tool type'))
305+
306+
def page(self, current_page: int, page_size: int):
307+
self.is_valid(raise_exception=True)
308+
309+
module_id = self.data.get('module_id', 'root')
310+
root = ToolModule.objects.filter(id=module_id).first()
311+
if not root:
312+
raise serializers.ValidationError(_('Module not found'))
313+
# 使用MPTT的get_descendants()方法获取所有相关节点
314+
all_modules = root.get_descendants(include_self=True)
315+
316+
if self.data.get('name'):
317+
tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) &
318+
Q(module_id__in=all_modules) &
319+
Q(tool_type=self.data.get('tool_type')) &
320+
Q(name__contains=self.data.get('name')))
321+
else:
322+
tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) &
323+
Q(module_id__in=all_modules) &
324+
Q(tool_type=self.data.get('tool_type')))
325+
return ToolModelSerializer(tools, many=True).data

apps/tools/views/tool.py

+9-11
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,15 @@ class Page(APIView):
120120
tags=[_('Tool')]
121121
)
122122
@has_permissions(PermissionConstants.TOOL_READ.get_workspace_permission())
123-
def get(self, request: Request, current_page: int, page_size: int):
124-
return result.success(
125-
ToolSerializer.Query(
126-
data={
127-
'name': request.query_params.get('name'),
128-
'desc': request.query_params.get('desc'),
129-
'function_type': request.query_params.get('function_type'),
130-
'user_id': request.user.id,
131-
'select_user_id': request.query_params.get('select_user_id')
132-
}
133-
).page(current_page, page_size))
123+
def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
124+
return result.success(ToolTreeSerializer.Query(
125+
data={
126+
'workspace_id': workspace_id,
127+
'module_id': request.query_params.get('module_id'),
128+
'name': request.query_params.get('name'),
129+
'tool_type': request.query_params.get('tool_type'),
130+
}
131+
).page(current_page, page_size))
134132

135133
class Import(APIView):
136134
authentication_classes = [TokenAuth]

0 commit comments

Comments
 (0)