Skip to content

Commit 317db5a

Browse files
committed
fix: add scope parameter to tool serializer in tool.py
1 parent fd73ede commit 317db5a

File tree

4 files changed

+164
-12
lines changed

4 files changed

+164
-12
lines changed

apps/tools/api/tool.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from common.mixins.api_mixin import APIMixin
66
from common.result import ResultSerializer, DefaultResultSerializer
77
from tools.serializers.tool import ToolModelSerializer, ToolCreateRequest, ToolDebugRequest, ToolEditRequest, \
8-
PylintInstance
8+
PylintInstance, AddInternalToolRequest
99

1010

1111
class ToolCreateResponse(ResultSerializer):
@@ -274,4 +274,51 @@ def get_request():
274274

275275
@staticmethod
276276
def get_response():
277-
return DefaultResultSerializer
277+
return DefaultResultSerializer
278+
279+
280+
class GetInternalToolAPI(APIMixin):
281+
@staticmethod
282+
def get_parameters():
283+
return [
284+
OpenApiParameter(
285+
name="name",
286+
description="工具名称",
287+
type=OpenApiTypes.STR,
288+
location='query',
289+
required=False,
290+
)
291+
]
292+
293+
@staticmethod
294+
def get_response():
295+
return DefaultResultSerializer()
296+
297+
298+
class AddInternalToolAPI(APIMixin):
299+
@staticmethod
300+
def get_request():
301+
return AddInternalToolRequest
302+
303+
@staticmethod
304+
def get_response():
305+
return DefaultResultSerializer
306+
307+
@staticmethod
308+
def get_parameters():
309+
return [
310+
OpenApiParameter(
311+
name="workspace_id",
312+
description="工作空间id",
313+
type=OpenApiTypes.STR,
314+
location='path',
315+
required=True,
316+
),
317+
OpenApiParameter(
318+
name="tool_id",
319+
description="工具id",
320+
type=OpenApiTypes.STR,
321+
location='path',
322+
required=True,
323+
),
324+
]

apps/tools/serializers/tool.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from common.utils.tool_code import ToolExecutor
2525
from knowledge.models import File, FileSourceType
2626
from maxkb.const import CONFIG, PROJECT_DIR
27-
from tools.models import Tool, ToolScope, ToolFolder
27+
from tools.models import Tool, ToolScope, ToolFolder, ToolType
2828
from tools.serializers.tool_folder import ToolFolderFlatSerializer
2929

3030
tool_executor = ToolExecutor(CONFIG.get('SANDBOX'))
@@ -157,14 +157,19 @@ class ToolCreateRequest(serializers.Serializer):
157157
class ToolEditRequest(serializers.Serializer):
158158
name = serializers.CharField(required=False, label=_('tool name'), allow_null=True)
159159
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('tool description'))
160-
code = serializers.CharField(required=False, label=_('tool content'), allow_null=True,)
160+
code = serializers.CharField(required=False, label=_('tool content'), allow_null=True, )
161161
input_field_list = serializers.ListField(required=False, default=list, allow_null=True, label=_('input field list'))
162162
init_field_list = serializers.ListField(required=False, default=list, allow_null=True, label=_('init field list'))
163163
init_params = serializers.DictField(required=False, default=dict, allow_null=True, label=_('init params'))
164-
is_active = serializers.BooleanField(required=False, label=_('Is active'), allow_null=True,)
164+
is_active = serializers.BooleanField(required=False, label=_('Is active'), allow_null=True, )
165165
folder_id = serializers.CharField(required=False, allow_null=True)
166166

167167

168+
class AddInternalToolRequest(serializers.Serializer):
169+
name = serializers.CharField(required=False, label=_("tool name"), allow_null=True, allow_blank=True)
170+
folder_id = serializers.CharField(required=False, allow_null=True, label=_("folder id"))
171+
172+
168173
class DebugField(serializers.Serializer):
169174
name = serializers.CharField(required=True, label=_('variable name'))
170175
value = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('variable value'))
@@ -420,6 +425,59 @@ def edit(self, with_valid=True):
420425

421426
return tool.icon
422427

428+
class InternalTool(serializers.Serializer):
429+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
430+
name = serializers.CharField(required=False, label=_("tool name"), allow_null=True, allow_blank=True)
431+
432+
def get_internal_tools(self):
433+
self.is_valid(raise_exception=True)
434+
query_set = QuerySet(Tool)
435+
436+
if self.data.get('name', '') != '':
437+
query_set = query_set.filter(
438+
Q(name__icontains=self.data.get('name')) |
439+
Q(desc__icontains=self.data.get('name'))
440+
)
441+
442+
query_set = query_set.filter(
443+
Q(scope=ToolScope.INTERNAL) &
444+
Q(is_active=True)
445+
)
446+
447+
return ToolModelSerializer(query_set, many=True).data
448+
449+
class AddInternalTool(serializers.Serializer):
450+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
451+
workspace_id = serializers.CharField(required=True, label=_("workspace id"))
452+
tool_id = serializers.UUIDField(required=True, label=_("tool id"))
453+
454+
def add(self, instance, with_valid=True):
455+
if with_valid:
456+
self.is_valid(raise_exception=True)
457+
AddInternalToolRequest(data=instance).is_valid(raise_exception=True)
458+
459+
internal_tool = QuerySet(Tool).filter(id=self.data.get('tool_id')).first()
460+
if internal_tool is None:
461+
raise AppApiException(500, _('Tool does not exist'))
462+
463+
tool = Tool(
464+
id=uuid.uuid7(),
465+
name=instance.get('name', internal_tool.name),
466+
desc=internal_tool.desc,
467+
code=internal_tool.code,
468+
user_id=self.data.get('user_id'),
469+
workspace_id=self.data.get('workspace_id'),
470+
input_field_list=internal_tool.input_field_list,
471+
init_field_list=internal_tool.init_field_list,
472+
scope=ToolScope.WORKSPACE,
473+
tool_type=ToolType.CUSTOM,
474+
folder_id=instance.get('folder_id', self.data.get('workspace_id')),
475+
is_active=False
476+
)
477+
tool.save()
478+
479+
return ToolModelSerializer(tool).data
480+
423481

424482
class ToolTreeSerializer(serializers.Serializer):
425483
workspace_id = serializers.CharField(required=True, label=_('workspace id'))

apps/tools/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
app_name = "tool"
66
urlpatterns = [
7+
path('workspace/internal/tool', views.ToolView.InternalTool.as_view()),
78
path('workspace/<str:workspace_id>/tool', views.ToolView.as_view()),
89
path('workspace/<str:workspace_id>/tool/import', views.ToolView.Import.as_view()),
910
path('workspace/<str:workspace_id>/tool/pylint', views.ToolView.Pylint.as_view()),
1011
path('workspace/<str:workspace_id>/tool/debug', views.ToolView.Debug.as_view()),
1112
path('workspace/<str:workspace_id>/tool/<str:tool_id>', views.ToolView.Operate.as_view()),
1213
path('workspace/<str:workspace_id>/tool/<str:tool_id>/edit_icon', views.ToolView.EditIcon.as_view()),
1314
path('workspace/<str:workspace_id>/tool/<str:tool_id>/export', views.ToolView.Export.as_view()),
15+
path('workspace/<str:workspace_id>/tool/<str:tool_id>/add_internal_tool', views.ToolView.AddInternalTool.as_view()),
1416
path('workspace/<str:workspace_id>/tool/<int:current_page>/<int:page_size>', views.ToolView.Page.as_view()),
1517
]

apps/tools/views/tool.py

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from common.log.log import log
1212
from common.result import result
1313
from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \
14-
ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI
14+
ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI, GetInternalToolAPI, AddInternalToolAPI
1515
from tools.models import ToolScope, Tool
1616
from tools.serializers.tool import ToolSerializer, ToolTreeSerializer
1717

@@ -44,7 +44,7 @@ class ToolView(APIView):
4444
)
4545
@log(
4646
menu="Tool", operate="Create tool",
47-
get_operation_object=lambda r, k: r.data.get('name'),
47+
get_operation_object=lambda r, k: r.data.get('name'),
4848
)
4949
def post(self, request: Request, workspace_id: str):
5050
return result.success(ToolSerializer.Create(
@@ -110,7 +110,7 @@ class Operate(APIView):
110110
@log(
111111
menu='Tool', operate='Update tool',
112112
get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
113-
113+
114114
)
115115
def put(self, request: Request, workspace_id: str, tool_id: str):
116116
return result.success(ToolSerializer.Operate(
@@ -152,7 +152,7 @@ def get(self, request: Request, workspace_id: str, tool_id: str):
152152
@log(
153153
menu='Tool', operate="Delete tool",
154154
get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
155-
155+
156156
)
157157
def delete(self, request: Request, workspace_id: str, tool_id: str):
158158
return result.success(ToolSerializer.Operate(
@@ -227,9 +227,8 @@ class Export(APIView):
227227
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
228228
)
229229
@log(
230-
menu='Tool', operate="Export function",
231-
get_operation_object=lambda r, k: get_tool_operation_object(k.get('id')),
232-
230+
menu='Tool', operate="Export tool",
231+
get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
233232
)
234233
def get(self, request: Request, tool_id: str, workspace_id: str):
235234
return ToolSerializer.Operate(
@@ -284,3 +283,49 @@ def put(self, request: Request, tool_id: str, workspace_id: str):
284283
'user_id': request.user.id,
285284
'image': request.FILES.get('file')
286285
}).edit(request.data))
286+
287+
class InternalTool(APIView):
288+
authentication_classes = [TokenAuth]
289+
290+
@extend_schema(
291+
methods=['GET'],
292+
description=_("Get internal tool"),
293+
summary=_("Get internal tool"),
294+
operation_id=_("Get internal tool"), # type: ignore
295+
parameters=GetInternalToolAPI.get_parameters(),
296+
responses=GetInternalToolAPI.get_response(),
297+
tags=[_("Tool")] # type: ignore
298+
)
299+
def get(self, request: Request):
300+
return result.success(ToolSerializer.InternalTool(data={
301+
'user_id': request.user.id,
302+
'name': request.query_params.get('name', ''),
303+
}).get_internal_tools())
304+
305+
class AddInternalTool(APIView):
306+
authentication_classes = [TokenAuth]
307+
308+
@extend_schema(
309+
methods=['POST'],
310+
description=_("Add internal tool"),
311+
summary=_("Add internal tool"),
312+
operation_id=_("Add internal tool"), # type: ignore
313+
parameters=AddInternalToolAPI.get_parameters(),
314+
request=AddInternalToolAPI.get_request(),
315+
responses=AddInternalToolAPI.get_response(),
316+
tags=[_("Tool")] # type: ignore
317+
)
318+
@has_permissions(
319+
PermissionConstants.TOOL_CREATE.get_workspace_permission(),
320+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
321+
)
322+
@log(
323+
menu='Tool', operate="Add internal tool",
324+
get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
325+
)
326+
def post(self, request: Request, tool_id: str, workspace_id: str):
327+
return result.success(ToolSerializer.AddInternalTool(data={
328+
'tool_id': tool_id,
329+
'user_id': request.user.id,
330+
'workspace_id': workspace_id
331+
}).add(request.data))

0 commit comments

Comments
 (0)