| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- # coding=utf-8
- """
- @project: MaxKB
- @Author:虎虎
- @file: application.py
- @date:2025/5/26 16:51
- @desc:
- """
- from django.db.models import QuerySet
- from django.http import HttpResponse
- 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 application.api.application_api import ApplicationCreateAPI, ApplicationQueryAPI, ApplicationImportAPI, \
- ApplicationExportAPI, ApplicationOperateAPI, ApplicationEditAPI, TextToSpeechAPI, SpeechToTextAPI, PlayDemoTextAPI, \
- ApplicationBatchOperateAPI
- from application.models import Application
- from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer, \
- ApplicationBatchOperateSerializer
- from common import result
- from common.auth import TokenAuth
- from common.auth.authentication import has_permissions, get_is_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 GetInternalToolAPI
- def get_application_operation_object(application_id):
- application_model = QuerySet(model=Application).filter(id=application_id).first()
- if application_model is not None:
- return {
- 'name': application_model.name
- }
- return {}
- def get_application_operation_object_batch(application_id_list):
- application_model_list = QuerySet(model=Application).filter(id__in=application_id_list)
- if application_model_list is not None:
- return {
- "name": f'[{",".join([app.name for app in application_model_list])}]',
- 'application_list': [{'name': app.name} for app in application_model_list]
- }
- return {}
- class ApplicationAPI(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_('Create an application'),
- summary=_('Create an application'),
- operation_id=_('Create an application'), # type: ignore
- parameters=ApplicationCreateAPI.get_parameters(),
- request=ApplicationCreateAPI.get_request(),
- responses=ApplicationCreateAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_CREATE.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate='Create an application',
- get_operation_object=lambda r, k: {'name': r.data.get('name')},
- )
- def post(self, request: Request, workspace_id: str):
- return result.success(
- ApplicationSerializer(data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data))
- @extend_schema(
- methods=['GET'],
- description=_('Get the application list'),
- summary=_('Get the application list'),
- operation_id=_('Get the application list'), # type: ignore
- parameters=ApplicationQueryAPI.get_parameters(),
- responses=ApplicationQueryAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def get(self, request: Request, workspace_id: str):
- return result.success(
- Query(data={'workspace_id': workspace_id, 'user_id': request.user.id}).list(request.query_params))
- class Page(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_('Get the application list by page'),
- summary=_('Get the application list by page'),
- operation_id=_('Get the application list by page'), # type: ignore
- parameters=ApplicationQueryAPI.get_parameters(),
- responses=ApplicationQueryAPI.get_page_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def get(self, request: Request, workspace_id: str, current_page: int, page_size: int):
- return result.success(
- Query(data={'workspace_id': workspace_id, 'user_id': request.user.id}).page(current_page, page_size,
- request.query_params))
- class Import(APIView):
- authentication_classes = [TokenAuth]
- parser_classes = [MultiPartParser]
- @extend_schema(
- methods=['POST'],
- description=_('Import Application'),
- summary=_('Import Application'),
- operation_id=_('Import Application'), # type: ignore
- parameters=ApplicationImportAPI.get_parameters(),
- request=ApplicationImportAPI.get_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_IMPORT.get_workspace_permission(),
- RoleConstants.USER.get_workspace_role(),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate="Import Application", )
- def post(self, request: Request, workspace_id: str, folder_id: str):
- is_import_tool = get_is_permissions(request, workspace_id=workspace_id, folder_id=folder_id)(
- 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()
- )
- return result.success(ApplicationSerializer(
- data={'user_id': request.user.id, 'workspace_id': workspace_id,
- }).import_({'file': request.FILES.get('file'), 'folder_id': folder_id}, is_import_tool))
- class Export(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_('Export application'),
- summary=_('Export application'),
- operation_id=_('Export application'), # type: ignore
- parameters=ApplicationExportAPI.get_parameters(),
- request=None,
- responses=ApplicationExportAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EXPORT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EXPORT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate="Export Application",
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
- )
- def get(self, request: Request, workspace_id: str, application_id: str):
- return ApplicationOperateSerializer(
- data={'application_id': application_id,
- 'workspace_id': workspace_id,
- 'user_id': request.user.id}).export()
- class Operate(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['DELETE'],
- description=_('Deleting application'),
- summary=_('Deleting application'),
- operation_id=_('Deleting application'), # type: ignore
- parameters=ApplicationOperateAPI.get_parameters(),
- responses=result.DefaultResultSerializer,
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_DELETE.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_DELETE.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate='Deleting application',
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
- )
- def delete(self, request: Request, workspace_id: str, application_id: str):
- return result.success(ApplicationOperateSerializer(
- data={'application_id': application_id, 'user_id': request.user.id,
- 'workspace_id': workspace_id, }).delete(
- with_valid=True))
- @extend_schema(
- methods=['PUT'],
- description=_('Modify the application'),
- summary=_('Modify the application'),
- operation_id=_('Modify the application'), # type: ignore
- parameters=ApplicationOperateAPI.get_parameters(),
- request=ApplicationEditAPI.get_request(),
- responses=ApplicationCreateAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate="Modify the application",
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
- )
- def put(self, request: Request, workspace_id: str, application_id: str):
- return result.success(
- ApplicationOperateSerializer(
- data={'application_id': application_id, 'user_id': request.user.id,
- 'workspace_id': workspace_id, }).edit(
- request.data))
- @extend_schema(
- methods=['GET'],
- description=_('Get application details'),
- summary=_('Get application details'),
- operation_id=_('Get application details'), # type: ignore
- parameters=ApplicationOperateAPI.get_parameters(),
- request=ApplicationEditAPI.get_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def get(self, request: Request, workspace_id: str, application_id: str):
- return result.success(ApplicationOperateSerializer(
- data={'application_id': application_id, 'user_id': request.user.id,
- 'workspace_id': workspace_id, }).one())
- class Move(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_("Move an application"),
- summary=_("Move an application"),
- operation_id=_("Move an application"), # type: ignore
- parameters=ApplicationOperateAPI.get_parameters(),
- request=None,
- responses=result.DefaultResultSerializer,
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate='Move an application',
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
- def put(self, request: Request, workspace_id: str, application_id: str, folder_id: str):
- return result.success(
- ApplicationOperateSerializer(
- data={'application_id': application_id, 'user_id': request.user.id,
- 'workspace_id': workspace_id, }).move(folder_id))
- class Publish(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_("Publishing an application"),
- summary=_("Publishing an application"),
- operation_id=_("Publishing an application"), # type: ignore
- parameters=ApplicationOperateAPI.get_parameters(),
- request=None,
- responses=result.DefaultResultSerializer,
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate='Publishing an application',
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
- def put(self, request: Request, workspace_id: str, application_id: str):
- return result.success(
- ApplicationOperateSerializer(
- data={'application_id': application_id, 'user_id': request.user.id,
- 'workspace_id': workspace_id, }).publish(request.data))
- class StoreApplication(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("Get Appstore apps"),
- summary=_("Get Appstore apps"),
- operation_id=_("Get Appstore apps"), # type: ignore
- responses=GetInternalToolAPI.get_response(),
- tags=[_("Application")] # type: ignore
- )
- def get(self, request: Request):
- return result.success(ApplicationSerializer.StoreApplication(data={
- 'user_id': request.user.id,
- 'name': request.query_params.get('name', ''),
- }).get_appstore_templates())
- class BatchDelete(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['PUT'],
- description=_("Batch delete applications"),
- summary=_("Batch delete applications"),
- operation_id=_("Batch delete applications"),
- parameters=ApplicationBatchOperateAPI.get_parameters(),
- request=ApplicationBatchOperateAPI.get_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Application')]
- )
- @has_permissions(PermissionConstants.APPLICATION_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, 'application_id',
- (PermissionConstants.APPLICATION_DELETE.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_DELETE.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()), workspace_id=workspace_id
- )
- @log(menu='Application', operate='Batch delete applications',
- get_operation_object=lambda r, k: get_application_operation_object_batch(permitted_ids))
- def inner(view,r, **kwargs):
- return ApplicationBatchOperateSerializer(
- data={'workspace_id': workspace_id, 'user_id': request.user.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 applications"),
- summary=_("Batch move applications"),
- operation_id=_("Batch move applications"),
- parameters=ApplicationBatchOperateAPI.get_parameters(),
- request=ApplicationBatchOperateAPI.get_move_request(),
- responses=result.DefaultResultSerializer,
- tags=[_('Application')]
- )
- @has_permissions(PermissionConstants.APPLICATION_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, 'application_id',
- (PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role()),
- workspace_id=workspace_id
- )
- @log(menu='Application', operate='Batch move applications',
- get_operation_object=lambda r, k: get_application_operation_object_batch(permitted_ids))
- def inner(view,r, **kwargs):
- return ApplicationBatchOperateSerializer(
- data={'workspace_id': workspace_id, 'user_id': request.user.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 McpServers(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['GET'],
- description=_("speech to text"),
- summary=_("speech to text"),
- operation_id=_("speech to text"), # type: ignore
- parameters=SpeechToTextAPI.get_parameters(),
- request=SpeechToTextAPI.get_request(),
- responses=SpeechToTextAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_READ.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def post(self, request: Request, workspace_id, application_id: str):
- return result.success(ApplicationOperateSerializer(
- data={'mcp_servers': request.query_params.get('mcp_servers'), 'workspace_id': workspace_id,
- 'user_id': request.user.id,
- 'application_id': application_id}).get_mcp_servers(request.data))
- class SpeechToText(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("speech to text"),
- summary=_("speech to text"),
- operation_id=_("speech to text"), # type: ignore
- parameters=SpeechToTextAPI.get_parameters(),
- request=SpeechToTextAPI.get_request(),
- responses=SpeechToTextAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def post(self, request: Request, workspace_id: str, application_id: str):
- return result.success(
- ApplicationOperateSerializer(
- data={'application_id': application_id, 'workspace_id': workspace_id, 'user_id': request.user.id})
- .speech_to_text({'file': request.FILES.get('file')}))
- class TextToSpeech(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("text to speech"),
- summary=_("text to speech"),
- operation_id=_("text to speech"), # type: ignore
- parameters=TextToSpeechAPI.get_parameters(),
- request=TextToSpeechAPI.get_request(),
- responses=TextToSpeechAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- def post(self, request: Request, workspace_id: str, application_id: str):
- byte_data = ApplicationOperateSerializer(
- data={'application_id': application_id, 'workspace_id': workspace_id,
- 'user_id': request.user.id}).text_to_speech(request.data)
- return HttpResponse(byte_data, status=200, headers={'Content-Type': 'audio/mp3',
- 'Content-Disposition': 'attachment; filename="abc.mp3"'})
- class PlayDemoText(APIView):
- authentication_classes = [TokenAuth]
- @extend_schema(
- methods=['POST'],
- description=_("PlayDemo"),
- summary=_("PlayDemo"),
- operation_id=_("PlayDemo"), # type: ignore
- parameters=PlayDemoTextAPI.get_parameters(),
- request=PlayDemoTextAPI.get_request(),
- responses=PlayDemoTextAPI.get_response(),
- tags=[_('Application')] # type: ignore
- )
- @has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission(),
- PermissionConstants.APPLICATION_EDIT.get_workspace_permission_workspace_manage_role(),
- ViewPermission([RoleConstants.USER.get_workspace_role()],
- [PermissionConstants.APPLICATION.get_workspace_application_permission()],
- CompareConstants.AND),
- RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
- @log(menu='Application', operate="trial listening",
- get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
- def post(self, request: Request, workspace_id: str, application_id: str):
- byte_data = ApplicationOperateSerializer(
- data={'application_id': application_id, 'workspace_id': workspace_id,
- 'user_id': request.user.id}).play_demo_text(request.data)
- return HttpResponse(byte_data, status=200, headers={'Content-Type': 'audio/mp3',
- 'Content-Disposition': 'attachment; filename="abc.mp3"'})
|