| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768 |
- from django.db.models import QuerySet, Count, Avg, Min, Max, Q
- from django.utils.translation import gettext_lazy as _
- from drf_spectacular.utils import extend_schema
- from rest_framework.parsers import MultiPartParser
- from rest_framework.request import Request
- from rest_framework.views import APIView
- from common import result
- from common.auth import TokenAuth
- from common.auth.authentication import has_permissions, check_batch_permissions
- from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
- from common.log.log import log
- from tools.api.tool import ToolCreateAPI, ToolEditAPI, ToolReadAPI, ToolDeleteAPI, ToolTreeReadAPI, ToolDebugApi, \
- ToolExportAPI, ToolImportAPI, ToolPageAPI, PylintAPI, EditIconAPI, GetInternalToolAPI, AddInternalToolAPI, \
- ToolBatchOperateAPI
- from tools.models import ToolScope, Tool, ToolRecord
- from tools.serializers.tool import ToolSerializer, ToolTreeSerializer, ToolBatchOperateSerializer
- def get_tool_operation_object(tool_id):
- tool_model = QuerySet(model=Tool).filter(id=tool_id).first()
- if tool_model is not None:
- return {
- "name": tool_model.name
- }
- return {}
- def get_tool_operation_object_batch(tool_id_list):
- tool_model_list = QuerySet(model=Tool).filter(id__in=tool_id_list)
- if tool_model_list is not None:
- return {
- "name": f'[{",".join([t.name for t in tool_model_list])}]',
- 'tool_list': [{'name': t.name} for t in tool_model_list]
- }
- return {}
- class ToolView(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_('Create tool'),
- summary=_('Create tool'),
- operation_id=_('Create tool'), # type: ignore
- parameters=ToolCreateAPI.get_parameters(),
- request=ToolCreateAPI.get_request(),
- responses=ToolCreateAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- @log(
- menu="Tool", operate="Create tool",
- get_operation_object=lambda r, k: r.data.get('name'),
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.Create(
- data={'user_id': request.user.id, 'workspace_id': workspace_id}
- ).insert({**request.data, 'scope': ToolScope.WORKSPACE}))
- @extend_schema(
- methods=['GET'],
- description=_('Get tool by folder'),
- summary=_('Get tool by folder'),
- operation_id=_('Get tool by folder'), # type: ignore
- parameters=ToolTreeReadAPI.get_parameters(),
- responses=ToolTreeReadAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- def get(self, request: Request, workspace_id: str):
- return result.success(ToolTreeSerializer.Query(
- data={
- 'workspace_id': workspace_id,
- 'folder_id': request.query_params.get('folder_id'),
- 'name': request.query_params.get('name'),
- 'scope': request.query_params.get('scope', ToolScope.WORKSPACE),
- 'tool_type': request.query_params.get('tool_type'),
- 'tool_type_list': request.query_params.getlist('tool_type_list[]'),
- 'user_id': request.user.id,
- 'create_user': request.query_params.get('create_user'),
- }
- ).get_tools())
- class Debug(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_('Debug Tool'),
- summary=_('Debug Tool'),
- operation_id=_('Debug Tool'), # type: ignore
- request=ToolDebugApi.get_request(),
- responses=ToolDebugApi.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EDIT.get_workspace_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.Debug(
- data={'workspace_id': workspace_id, 'user_id': request.user.id}
- ).debug(request.data))
- class Operate(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_('Update tool'),
- summary=_('Update tool'),
- operation_id=_('Update tool'), # type: ignore
- parameters=ToolEditAPI.get_parameters(),
- request=ToolEditAPI.get_request(),
- responses=ToolEditAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- @log(
- menu='Tool', operate='Update tool',
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- def put(self, request: Request, workspace_id: str, tool_id: str):
- return result.success(ToolSerializer.Operate(
- data={'id': tool_id, 'workspace_id': workspace_id}
- ).edit(request.data))
- @extend_schema(
- methods=['GET'],
- description=_('Get tool'),
- summary=_('Get tool'),
- operation_id=_('Get tool'), # type: ignore
- parameters=ToolReadAPI.get_parameters(),
- responses=ToolReadAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_tool_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.USER.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- @log(menu='Tool', operate='Get tool')
- def get(self, request: Request, workspace_id: str, tool_id: str):
- return result.success(ToolSerializer.Operate(
- data={'id': tool_id, 'workspace_id': workspace_id}
- ).one())
- @extend_schema(
- methods=['DELETE'],
- description=_('Delete tool'),
- summary=_('Delete tool'),
- operation_id=_('Delete tool'), # type: ignore
- parameters=ToolDeleteAPI.get_parameters(),
- responses=ToolDeleteAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_DELETE.get_workspace_tool_permission(),
- PermissionConstants.TOOL_DELETE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- @log(
- menu='Tool', operate="Delete tool",
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- 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 BatchDelete(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_("Batch delete tools"),
- summary=_("Batch delete tools"),
- operation_id=_("Batch delete tools"),
- parameters=ToolBatchOperateAPI.get_parameters(),
- request=ToolBatchOperateAPI.get_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Tool')]
- )
- @has_permissions(PermissionConstants.TOOL_BATCH_DELETE.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
- )
- def put(self, request: Request, workspace_id: str):
- id_list = request.data.get('id_list', [])
- permitted_ids = check_batch_permissions(
- request, id_list, 'tool_id',
- (PermissionConstants.TOOL_DELETE.get_workspace_tool_permission(),
- PermissionConstants.TOOL_DELETE.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()), workspace_id=workspace_id
- )
- @log(menu='Tool', operate='Batch delete tools',
- get_operation_object=lambda r, k: get_tool_operation_object_batch(permitted_ids))
- def inner(view, r, **kwargs):
- return ToolBatchOperateSerializer(
- data={'workspace_id': workspace_id}
- ).batch_delete({'id_list': permitted_ids})
- return result.success(inner(self, request, workspace_id=workspace_id))
- class BatchMove(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_("Batch move tools"),
- summary=_("Batch move tools"),
- operation_id=_("Batch move tools"),
- parameters=ToolBatchOperateAPI.get_parameters(),
- request=ToolBatchOperateAPI.get_move_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Tool')]
- )
- @has_permissions(PermissionConstants.TOOL_BATCH_MOVE.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
- )
- def put(self, request: Request, workspace_id: str):
- id_list = request.data.get('id_list', [])
- permitted_ids = check_batch_permissions(
- request, id_list, 'tool_id',
- (PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()),
- workspace_id=workspace_id
- )
- @log(menu='Tool', operate='Batch move tools',
- get_operation_object=lambda r, k: get_tool_operation_object_batch(permitted_ids))
- def inner(view, r, **kwargs):
- return ToolBatchOperateSerializer(
- data={'workspace_id': workspace_id}
- ).batch_move({'id_list': permitted_ids, 'folder_id': request.data.get('folder_id')})
- return result.success(inner(self, request, workspace_id=workspace_id))
- class Page(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_('Get tool list by pagination'),
- summary=_('Get tool list by pagination'),
- operation_id=_('Get tool list by pagination'), # type: ignore
- parameters=ToolPageAPI.get_parameters(),
- responses=ToolPageAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- @log(menu='Tool', operate='Get tool list')
- def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
- return result.success(ToolTreeSerializer.Query(
- data={
- 'workspace_id': workspace_id,
- 'folder_id': request.query_params.get('folder_id'),
- 'name': request.query_params.get('name'),
- 'scope': request.query_params.get('scope'),
- 'tool_type': request.query_params.get('tool_type'),
- 'user_id': request.user.id,
- 'create_user': request.query_params.get('create_user'),
- }
- ).page_tool_with_folders(current_page, page_size))
- class Query(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_('Get tool list '),
- summary=_('Get tool list'),
- operation_id=_('Get tool list'), # type: ignore
- parameters=ToolReadAPI.get_parameters(),
- responses=ToolReadAPI.get_response(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- @log(menu='Tool', operate='Get tool list')
- def get(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.Query(
- data={
- 'workspace_id': workspace_id,
- 'folder_id': request.query_params.get('folder_id'),
- 'name': request.query_params.get('name'),
- 'scope': request.query_params.get('scope'),
- 'tool_type': request.query_params.get('tool_type'),
- 'user_id': request.user.id,
- 'create_user': request.query_params.get('create_user'),
- }
- ).get_tools())
- class Import(APIView):
- authentication_classes = [TokenAuth]
- parser_classes = [MultiPartParser]
- @extend_schema(
- methods=['POST'],
- description=_("Import tool"),
- summary=_("Import tool"),
- operation_id=_("Import tool"), # type: ignore
- parameters=ToolImportAPI.get_parameters(),
- request=ToolImportAPI.get_request(),
- responses=ToolImportAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_IMPORT.get_workspace_permission(),
- PermissionConstants.TOOL_IMPORT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- @log(menu='Tool', operate='Import tool', )
- def post(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.Import(
- data={
- 'workspace_id': workspace_id,
- 'file': request.FILES.get('file'),
- 'user_id': request.user.id,
- 'folder_id': request.data.get('folder_id')
- }
- ).import_(ToolScope.WORKSPACE))
- class Export(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Export tool"),
- summary=_("Export tool"),
- operation_id=_("Export tool"), # type: ignore
- parameters=ToolExportAPI.get_parameters(),
- responses=ToolExportAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EXPORT.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EXPORT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- @log(
- menu='Tool', operate="Export tool",
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- def get(self, request: Request, tool_id: str, workspace_id: str):
- return ToolSerializer.Operate(
- data={'id': tool_id, 'workspace_id': workspace_id}
- ).export()
- class Pylint(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- summary=_('Check code'),
- operation_id=_('Check code'), # type: ignore
- description=_('Check code'),
- request=PylintAPI.get_request(),
- responses=PylintAPI.get_response(),
- parameters=PylintAPI.get_parameters(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role()
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.Pylint(
- data={'workspace_id': workspace_id}
- ).run(request.data))
- class EditIcon(APIView):
- authentication_classes = [TokenAuth]
- parser_classes = [MultiPartParser]
- @extend_schema(
- methods=['PUT'],
- summary=_('Edit tool icon'),
- operation_id=_('Edit tool icon'), # type: ignore
- description=_('Edit tool icon'),
- request=EditIconAPI.get_request(),
- responses=EditIconAPI.get_response(),
- parameters=EditIconAPI.get_parameters(),
- tags=[_('Tool')] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EDIT.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- def put(self, request: Request, tool_id: str, workspace_id: str):
- return result.success(ToolSerializer.IconOperate(data={
- 'id': tool_id,
- 'workspace_id': workspace_id,
- 'user_id': request.user.id,
- 'image': request.FILES.get('file')
- }).edit(request.data))
- class TestConnection(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("Test tool connection"),
- summary=_("Test tool connection"),
- operation_id=_("Test tool connection"), # type: ignore
- request=ToolReadAPI.get_request(),
- responses=ToolReadAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.TestConnection(data={
- 'workspace_id': workspace_id,
- 'code': request.data.get('code'),
- }).test_connection())
- class InternalTool(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get internal tool"),
- summary=_("Get internal tool"),
- operation_id=_("Get internal tool"), # type: ignore
- parameters=GetInternalToolAPI.get_parameters(),
- responses=GetInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- def get(self, request: Request):
- return result.success(ToolSerializer.InternalTool(data={
- 'user_id': request.user.id,
- 'name': request.query_params.get('name', ''),
- }).get_internal_tools())
- class AddInternalTool(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("Add internal tool"),
- summary=_("Add internal tool"),
- operation_id=_("Add internal tool"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- request=AddInternalToolAPI.get_request(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role(),
- )
- @log(
- menu='Tool', operate="Add internal tool",
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- def post(self, request: Request, tool_id: str, workspace_id: str):
- return result.success(ToolSerializer.AddInternalTool(data={
- 'tool_id': tool_id,
- 'user_id': request.user.id,
- 'workspace_id': workspace_id
- }).add(request.data))
- class StoreTool(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get Appstore tools"),
- summary=_("Get Appstore tools"),
- operation_id=_("Get Appstore tools"), # type: ignore
- responses=GetInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- def get(self, request: Request):
- return result.success(ToolSerializer.StoreTool(data={
- 'user_id': request.user.id,
- 'name': request.query_params.get('name', ''),
- }).get_appstore_tools())
- class AddStoreTool(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("Add Appstore tool"),
- summary=_("Add Appstore tool"),
- operation_id=_("Add Appstore tool"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- request=AddInternalToolAPI.get_request(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role(),
- )
- @log(
- menu='Tool', operate="Add Appstore tool",
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- def post(self, request: Request, tool_id: str, workspace_id: str):
- return result.success(ToolSerializer.AddStoreTool(data={
- 'tool_id': tool_id,
- 'user_id': request.user.id,
- 'workspace_id': workspace_id,
- }).add(request.data))
- class UpdateStoreTool(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("Update Appstore tool"),
- summary=_("Update Appstore tool"),
- operation_id=_("Update Appstore tool"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- request=AddInternalToolAPI.get_request(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role(),
- )
- @log(
- menu='Tool', operate="Update Appstore tool",
- get_operation_object=lambda r, k: get_tool_operation_object(k.get('tool_id')),
- )
- def post(self, request: Request, tool_id: str, workspace_id: str):
- return result.success(ToolSerializer.UpdateStoreTool(data={
- 'tool_id': tool_id,
- 'user_id': request.user.id,
- 'workspace_id': workspace_id,
- 'download_url': request.data.get('download_url'),
- 'download_callback_url': request.data.get('download_callback_url'),
- 'icon': request.data.get('icon'),
- 'versions': request.data.get('versions'),
- }).update_tool(request.data))
- class PageToolRecord(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get tool records"),
- summary=_("Get tool records"),
- operation_id=_("Get tool records"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EXECUTE_RECORD.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EXECUTE_RECORD.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- def get(self, request: Request, tool_id: str, workspace_id: str, current_page: int, page_size: int):
- return result.success(ToolSerializer.ToolRecord(data={
- 'tool_id': tool_id,
- 'workspace_id': workspace_id,
- 'source_name': request.query_params.get('source_name'),
- 'source_type': request.query_params.get('source_type'),
- 'state': request.query_params.get('state'),
- }).get_tool_records(current_page, page_size))
- class ToolRecord(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get tool record"),
- summary=_("Get tool record"),
- operation_id=_("Get tool record"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_EXECUTE_RECORD.get_workspace_tool_permission(),
- PermissionConstants.TOOL_EXECUTE_RECORD.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.TOOL.get_workspace_tool_permission()],
- CompareConstants.AND),
- )
- def get(self, request: Request, tool_id: str, workspace_id: str, record_id: str):
- return result.success(ToolSerializer.ToolRecord.Operate(data={
- 'tool_id': tool_id,
- 'workspace_id': workspace_id,
- 'id': record_id,
- }).one())
- class UploadSkillFile(APIView):
- authentication_classes = [TokenAuth]
- parser_classes = [MultiPartParser]
- @extend_schema(
- methods=['PUT'],
- description=_("Upload skill file"),
- summary=_("Upload skill file"),
- operation_id=_("Upload skill file"), # type: ignore
- parameters=AddInternalToolAPI.get_parameters(),
- request=AddInternalToolAPI.get_request(),
- responses=AddInternalToolAPI.get_response(),
- tags=[_("Tool")] # type: ignore
- )
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
- )
- def put(self, request: Request, workspace_id: str):
- return result.success(ToolSerializer.UploadSkillFile(data={
- 'workspace_id': workspace_id,
- 'user_id': request.user.id,
- 'file': request.FILES.get('file'),
- }).upload())
- class DownloadSkillFile(APIView):
- authentication_classes = [TokenAuth]
- @has_permissions(
- PermissionConstants.TOOL_EDIT.get_workspace_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role()
- )
- def get(self, request: Request, workspace_id: str, tool_id: str):
- return ToolSerializer.DownloadSkillFile(data={
- 'workspace_id': workspace_id,
- 'user_id': request.user.id,
- 'tool_id': tool_id,
- }).download()
- class GenerateCode(APIView):
- authentication_classes = [TokenAuth]
- @has_permissions(
- PermissionConstants.TOOL_CREATE.get_workspace_permission(),
- PermissionConstants.TOOL_CREATE.get_workspace_permission_workspace_manage_role(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission(),
- PermissionConstants.TOOL_EDIT.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role()
- )
- def post(self, request: Request, workspace_id: str):
- return ToolSerializer.GenerateCodeSerializer(data={
- 'workspace_id': workspace_id,
- **request.data
- }).generate_code()
- class Statistics(APIView):
- """工具使用统计"""
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get tool usage statistics"),
- summary=_("Get tool usage statistics"),
- operation_id=_("Get tool usage statistics"),
- tags=[_('Tool')]
- )
- @has_permissions(
- PermissionConstants.TOOL_READ.get_workspace_permission(),
- PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
- RoleConstants.USER.get_workspace_role()
- )
- def get(self, request: Request, workspace_id: str):
- tool_id = request.query_params.get('tool_id')
- days = int(request.query_params.get('days', 7))
- query = QuerySet(ToolRecord).filter(workspace_id=workspace_id)
- if tool_id:
- query = query.filter(tool_id=tool_id)
- stats = query.aggregate(
- total_count=Count('id'),
- success_count=Count('id', filter=Q(state='SUCCESS')),
- failure_count=Count('id', filter=Q(state='FAILURE')),
- avg_run_time=Avg('run_time'),
- min_run_time=Min('run_time'),
- max_run_time=Max('run_time')
- )
- total = stats['total_count'] or 0
- success = stats['success_count'] or 0
- success_rate = (success / total * 100) if total > 0 else 0
- return result.success({
- 'total_count': total,
- 'success_count': success,
- 'failure_count': stats['failure_count'] or 0,
- 'success_rate': round(success_rate, 2),
- 'avg_run_time': round(stats['avg_run_time'] or 0, 3),
- 'min_run_time': stats['min_run_time'] or 0,
- 'max_run_time': stats['max_run_time'] or 0
- })
|