diff --git a/apps/application/views/application_version_views.py b/apps/application/views/application_version_views.py index 020ffac98..de9009362 100644 --- a/apps/application/views/application_version_views.py +++ b/apps/application/views/application_version_views.py @@ -13,6 +13,7 @@ from rest_framework.views import APIView from application.serializers.application_version_serializers import ApplicationVersionSerializer from application.swagger_api.application_version_api import ApplicationVersionApi +from application.views import get_application_operation_object from common.auth import has_permissions, TokenAuth from common.constants.permission_constants import PermissionConstants, CompareConstants, ViewPermission, RoleConstants, \ Permission, Group, Operate @@ -31,7 +32,6 @@ class ApplicationVersionView(APIView): responses=result.get_api_array_response(ApplicationVersionApi.get_response_body_api()), tags=[_('Application/Version')]) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get the application list") def get(self, request: Request, application_id: str): return result.success( ApplicationVersionSerializer.Query( @@ -49,7 +49,6 @@ class ApplicationVersionView(APIView): responses=result.get_page_api_response(ApplicationVersionApi.get_response_body_api()), tags=[_('Application/Version')]) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get the list of application versions by page") def get(self, request: Request, application_id: str, current_page: int, page_size: int): return result.success( ApplicationVersionSerializer.Query( @@ -67,7 +66,6 @@ class ApplicationVersionView(APIView): responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()), tags=[_('Application/Version')]) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get application version details") def get(self, request: Request, application_id: str, work_flow_version_id: str): return result.success( ApplicationVersionSerializer.Operate( @@ -86,7 +84,8 @@ class ApplicationVersionView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Modify application version information") + @log(menu='Application', operate="Modify application version information", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str, work_flow_version_id: str): return result.success( ApplicationVersionSerializer.Operate( diff --git a/apps/application/views/application_views.py b/apps/application/views/application_views.py index 991a6f4d5..dc7a96dac 100644 --- a/apps/application/views/application_views.py +++ b/apps/application/views/application_views.py @@ -21,6 +21,7 @@ from application.serializers.application_serializers import ApplicationSerialize from application.serializers.application_statistics_serializers import ApplicationStatisticsSerializer from application.swagger_api.application_api import ApplicationApi from application.swagger_api.application_statistics_api import ApplicationStatisticsApi +from application.views.common import get_application_operation_object from common.auth import TokenAuth, has_permissions from common.constants.permission_constants import CompareConstants, PermissionConstants, Permission, Group, Operate, \ ViewPermission, RoleConstants @@ -51,7 +52,6 @@ class ApplicationStatistics(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="User Statistics") def get(self, request: Request, application_id: str): return result.success( ApplicationStatisticsSerializer(data={'application_id': application_id, @@ -76,7 +76,6 @@ class ApplicationStatistics(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="User demographic trends") def get(self, request: Request, application_id: str): return result.success( ApplicationStatisticsSerializer(data={'application_id': application_id, @@ -102,7 +101,6 @@ class ApplicationStatistics(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Conversation statistics") def get(self, request: Request, application_id: str): return result.success( ApplicationStatisticsSerializer(data={'application_id': application_id, @@ -128,7 +126,6 @@ class ApplicationStatistics(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Dialogue-related statistical trends") def get(self, request: Request, application_id: str): return result.success( ApplicationStatisticsSerializer(data={'application_id': application_id, @@ -158,7 +155,8 @@ class Application(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), PermissionConstants.APPLICATION_EDIT, compare=CompareConstants.AND) - @log(menu='Application', operate="Modify application icon") + @log(menu='Application', operate="Modify application icon", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str): return result.success( ApplicationSerializer.IconOperate( @@ -190,7 +188,8 @@ class Application(APIView): ) @has_permissions(lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))) - @log(menu='Application', operate="Export Application") + @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, application_id: str): return ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).export() @@ -201,7 +200,6 @@ class Application(APIView): operation_id=_("Get embedded js"), tags=[_("Application")], manual_parameters=ApplicationApi.ApiKey.get_request_params_api()) - @log(menu='Application', operate="Get embedded js") def get(self, request: Request): return ApplicationSerializer.Embed( data={'protocol': request.query_params.get('protocol'), 'token': request.query_params.get('token'), @@ -220,7 +218,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get a list of models") def get(self, request: Request, application_id: str): return result.success( ApplicationSerializer.Operate( @@ -239,7 +236,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get model parameter form") def get(self, request: Request, application_id: str, model_id: str): return result.success( ApplicationSerializer.Operate( @@ -258,7 +254,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get a list of function libraries") def get(self, request: Request, application_id: str): return result.success( ApplicationSerializer.Operate( @@ -278,7 +273,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get library details") def get(self, request: Request, application_id: str, function_lib_id: str): return result.success( ApplicationSerializer.Operate( @@ -297,7 +291,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get the list of apps created by the current user") def get(self, request: Request, application_id: str): return result.success( ApplicationSerializer.Operate( @@ -317,7 +310,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get application data") def get(self, request: Request, application_id: str, app_id: str): return result.success( ApplicationSerializer.Operate( @@ -331,7 +323,6 @@ class Application(APIView): @swagger_auto_schema(operation_summary=_("Get application related information"), operation_id=_("Get application related information"), tags=[_("Application/Chat")]) - @log(menu='Application', operate="Get application related information") def get(self, request: Request): if 'application_id' in request.auth.keywords: return result.success(ApplicationSerializer.Operate( @@ -352,7 +343,8 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Add ApiKey") + @log(menu='Application', operate="Add ApiKey", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def post(self, request: Request, application_id: str): return result.success( ApplicationSerializer.ApplicationKeySerializer( @@ -369,7 +361,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get the application API_KEY list") def get(self, request: Request, application_id: str): return result.success(ApplicationSerializer.ApplicationKeySerializer( data={'application_id': application_id, 'user_id': request.user.id}).list()) @@ -389,7 +380,8 @@ class Application(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), PermissionConstants.APPLICATION_EDIT, compare=CompareConstants.AND) - @log(menu='Application', operate="Modify application API_KEY") + @log(menu='Application', operate="Modify application API_KEY", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str, api_key_id: str): return result.success( ApplicationSerializer.ApplicationKeySerializer.Operate( @@ -407,7 +399,8 @@ class Application(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), PermissionConstants.APPLICATION_DELETE, compare=CompareConstants.AND) - @log(menu='Application', operate="Delete Application API_KEY") + @log(menu='Application', operate="Delete Application API_KEY", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def delete(self, request: Request, application_id: str, api_key_id: str): return result.success( ApplicationSerializer.ApplicationKeySerializer.Operate( @@ -428,7 +421,8 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Modify Application AccessToken") + @log(menu='Application', operate="Modify Application AccessToken", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str): return result.success( ApplicationSerializer.AccessTokenSerializer(data={'application_id': application_id}).edit( @@ -445,7 +439,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get the application AccessToken information") def get(self, request: Request, application_id: str): return result.success( ApplicationSerializer.AccessTokenSerializer(data={'application_id': application_id}).one()) @@ -481,7 +474,8 @@ class Application(APIView): request_body=ApplicationApi.Create.get_request_body_api(), tags=[_('Application')]) @has_permissions(PermissionConstants.APPLICATION_CREATE, compare=CompareConstants.AND) - @log(menu='Application', operate="Create an application") + @log(menu='Application', operate="Create an application", + get_operation_object=lambda r, k: {'name': r.data.get('name')}) def post(self, request: Request): return result.success(ApplicationSerializer.Create(data={'user_id': request.user.id}).insert(request.data)) @@ -492,7 +486,6 @@ class Application(APIView): responses=result.get_api_array_response(ApplicationApi.get_response_body_api()), tags=[_('Application')]) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get the application list") def get(self, request: Request): return result.success( ApplicationSerializer.Query( @@ -512,7 +505,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Hit Test List") def get(self, request: Request, application_id: str): return result.success( ApplicationSerializer.HitTest(data={'id': application_id, 'user_id': request.user.id, @@ -538,7 +530,8 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Publishing an application") + @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, application_id: str): return result.success( ApplicationSerializer.Operate( @@ -560,7 +553,8 @@ class Application(APIView): compare=CompareConstants.AND), lambda r, k: Permission(group=Group.APPLICATION, operate=Operate.DELETE, dynamic_tag=k.get('application_id')), compare=CompareConstants.AND) - @log(menu='Application', operate="Deleting application") + @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, application_id: str): return result.success(ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).delete( @@ -578,7 +572,8 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Modify the application") + @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, application_id: str): return result.success( ApplicationSerializer.Operate( @@ -597,7 +592,6 @@ class Application(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get application details") def get(self, request: Request, application_id: str): return result.success(ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).one()) @@ -618,7 +612,6 @@ class Application(APIView): dynamic_tag=keywords.get( 'application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="Get the knowledge base available to the current application") def get(self, request: Request, application_id: str): return result.success(ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).list_dataset()) @@ -634,7 +627,6 @@ class Application(APIView): responses=result.get_page_api_response(ApplicationApi.get_response_body_api()), tags=[_('Application')]) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get the application list by page") def get(self, request: Request, current_page: int, page_size: int): return result.success( ApplicationSerializer.Query( @@ -652,7 +644,8 @@ class Application(APIView): dynamic_tag=keywords.get( 'application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="speech to text") + @log(menu='Application', operate="speech to text", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def post(self, request: Request, application_id: str): return result.success( ApplicationSerializer.Operate(data={'application_id': application_id, 'user_id': request.user.id}) @@ -675,7 +668,8 @@ class Application(APIView): dynamic_tag=keywords.get( 'application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="text to speech") + @log(menu='Application', operate="text to speech", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def post(self, request: Request, application_id: str): byte_data = ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).text_to_speech( @@ -694,7 +688,8 @@ class Application(APIView): dynamic_tag=keywords.get( 'application_id'))], compare=CompareConstants.AND)) - @log(menu='Application', operate="trial listening") + @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, application_id: str): byte_data = ApplicationSerializer.Operate( data={'application_id': application_id, 'user_id': request.user.id}).play_demo_text(request.data) @@ -706,7 +701,6 @@ class Application(APIView): @action(methods=['GET'], detail=False) @has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND) - @log(menu='Application', operate="Get the MCP server tools") def get(self, request: Request): return result.success(ApplicationSerializer.McpServers( data={'mcp_servers': request.query_params.get('mcp_servers')}).get_mcp_servers()) diff --git a/apps/application/views/chat_views.py b/apps/application/views/chat_views.py index 4767268d7..d5c0d3c5e 100644 --- a/apps/application/views/chat_views.py +++ b/apps/application/views/chat_views.py @@ -19,6 +19,7 @@ from application.serializers.chat_message_serializers import ChatMessageSerializ from application.serializers.chat_serializers import ChatSerializers, ChatRecordSerializer from application.swagger_api.chat_api import ChatApi, VoteApi, ChatRecordApi, ImproveApi, ChatRecordImproveApi, \ ChatClientHistoryApi, OpenAIChatApi +from application.views import get_application_operation_object from common.auth import TokenAuth, has_permissions, OpenAIKeyAuth from common.constants.authentication_type import AuthenticationType from common.constants.permission_constants import Permission, Group, Operate, \ @@ -178,7 +179,8 @@ class ChatView(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Delete a conversation") + @log(menu='Application/Conversation Log', operate="Delete a conversation", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def delete(self, request: Request, application_id: str, chat_id: str): return result.success( ChatSerializers.Operate( @@ -201,7 +203,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Get client conversation list by paging") def get(self, request: Request, application_id: str, current_page: int, page_size: int): return result.success(ChatSerializers.ClientChatHistory( data={'client_id': request.auth.client_id, 'application_id': application_id}).page( @@ -221,7 +222,8 @@ class ChatView(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Client deletes conversation") + @log(menu='Application/Conversation Log', operate="Client deletes conversation", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def delete(self, request: Request, application_id: str, chat_id: str): return result.success( ChatSerializers.Operate( @@ -239,7 +241,8 @@ class ChatView(APIView): dynamic_tag=keywords.get('application_id'))], compare=CompareConstants.AND), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Client modifies dialogue summary") + @log(menu='Application/Conversation Log', operate="Client modifies dialogue summary", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str, chat_id: str): return result.success( ChatSerializers.Operate( @@ -261,7 +264,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Get the conversation list by page") def get(self, request: Request, application_id: str, current_page: int, page_size: int): return result.success(ChatSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'application_id': application_id, @@ -287,7 +289,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Get conversation record details") def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str): return result.success(ChatRecordSerializer.Operate( data={'application_id': application_id, @@ -306,7 +307,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Get a list of conversation records") def get(self, request: Request, application_id: str, chat_id: str): return result.success(ChatRecordSerializer.Query( data={'application_id': application_id, @@ -328,7 +328,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Get the conversation history list by page") def get(self, request: Request, application_id: str, chat_id: str, current_page: int, page_size: int): return result.success(ChatRecordSerializer.Query( data={'application_id': application_id, @@ -352,7 +351,8 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))]) ) - @log(menu='Application/Conversation Log', operate="Like, Dislike") + @log(menu='Application/Conversation Log', operate="Like, Dislike", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str): return result.success(ChatRecordSerializer.Vote( data={'vote_status': request.data.get('vote_status'), 'chat_id': chat_id, @@ -373,7 +373,6 @@ class ChatView(APIView): [lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE, dynamic_tag=keywords.get('application_id'))] )) - @log(menu='Application/Conversation Log', operate="Get the list of marked paragraphs") def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str): return result.success(ChatRecordSerializer.ChatRecordImprove( data={'chat_id': chat_id, 'chat_record_id': chat_record_id}).get()) @@ -401,7 +400,8 @@ class ChatView(APIView): 'dataset_id'))], compare=CompareConstants.AND ), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Annotation") + @log(menu='Application/Conversation Log', operate="Annotation", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str, dataset_id: str, document_id: str): return result.success(ChatRecordSerializer.Improve( @@ -427,7 +427,8 @@ class ChatView(APIView): 'dataset_id'))], compare=CompareConstants.AND ), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Add to Knowledge Base") + @log(menu='Application/Conversation Log', operate="Add to Knowledge Base", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def post(self, request: Request, application_id: str, dataset_id: str): return result.success(ChatRecordSerializer.PostImprove().post_improve(request.data)) @@ -453,7 +454,8 @@ class ChatView(APIView): 'dataset_id'))], compare=CompareConstants.AND ), compare=CompareConstants.AND) - @log(menu='Application/Conversation Log', operate="Delete a Annotation") + @log(menu='Application/Conversation Log', operate="Delete a Annotation", + get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))) def delete(self, request: Request, application_id: str, chat_id: str, chat_record_id: str, dataset_id: str, document_id: str, paragraph_id: str): diff --git a/apps/application/views/common.py b/apps/application/views/common.py new file mode 100644 index 000000000..7773039c2 --- /dev/null +++ b/apps/application/views/common.py @@ -0,0 +1,21 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎 + @file: common.py + @date:2025/3/25 16:56 + @desc: +""" + +from django.db.models import QuerySet + +from application.models import Application + + +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 {} diff --git a/apps/common/log/log.py b/apps/common/log/log.py index eb462663a..3835fa60c 100644 --- a/apps/common/log/log.py +++ b/apps/common/log/log.py @@ -57,7 +57,8 @@ def _get_details(request): } -def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details): +def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details, + get_operation_object=None): """ 记录审计日志 @param menu: 操作菜单 str @@ -65,12 +66,19 @@ def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, @param get_user: 获取用户 @param get_ip_address:获取IP地址 @param get_details: 获取执行详情 + @param get_operation_object: 获取操作对象 @return: """ def inner(func): def run(view, request, **kwargs): status = 200 + operation_object = {} + try: + if get_operation_object is not None: + operation_object = get_operation_object(request, kwargs) + except Exception as e: + pass try: return func(view, request, **kwargs) except Exception as e: @@ -84,7 +92,8 @@ def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, if callable(operate): _operate = operate(request) # 插入审计日志 - Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details).save() + Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details, + operation_object=operation_object).save() return run diff --git a/apps/dataset/views/common.py b/apps/dataset/views/common.py new file mode 100644 index 000000000..6637426e3 --- /dev/null +++ b/apps/dataset/views/common.py @@ -0,0 +1,56 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎 + @file: common.py.py + @date:2025/3/25 15:43 + @desc: +""" +from django.db.models import QuerySet + +from dataset.models import DataSet, Document + + +def get_dataset_operation_object(dataset_id: str): + dataset_model = QuerySet(model=DataSet).filter(id=dataset_id).first() + if dataset_model is not None: + return { + "name": dataset_model.name, + "desc": dataset_model.desc, + "type": dataset_model.type, + "create_time": dataset_model.create_time, + "update_time": dataset_model.update_time + } + return {} + + +def get_document_operation_object(document_id: str): + document_model = QuerySet(model=Document).filter(id=document_id).first() + if document_model is not None: + return { + "name": document_model.name, + "type": document_model.type, + } + return {} + + +def get_document_operation_object_batch(document_id_list: str): + document_model_list = QuerySet(model=Document).filter(id__in=document_id_list) + if document_model_list is not None: + return { + "name": f'[{",".join([document_model.name for document_model in document_model_list])}]', + 'document_list': [{'name': document_model.name, 'type': document_model.type} for document_model in + document_model_list] + } + return {} + + +def get_dataset_document_operation_object(dataset_dict: dict, document_dict: dict): + return { + 'name': f'{dataset_dict.get("name", "")}/{document_dict.get("name", "")}', + 'dataset_name': dataset_dict.get("name", ""), + 'dataset_desc': dataset_dict.get("desc", ""), + 'dataset_type': dataset_dict.get("type", ""), + 'document_name': document_dict.get("name", ""), + 'document_type': document_dict.get("type", ""), + } diff --git a/apps/dataset/views/dataset.py b/apps/dataset/views/dataset.py index 64dfb6375..efd50c6bf 100644 --- a/apps/dataset/views/dataset.py +++ b/apps/dataset/views/dataset.py @@ -13,6 +13,7 @@ from rest_framework.parsers import MultiPartParser from rest_framework.views import APIView from rest_framework.views import Request +import dataset.models from common.auth import TokenAuth, has_permissions from common.constants.permission_constants import PermissionConstants, CompareConstants, Permission, Group, Operate, \ ViewPermission, RoleConstants @@ -21,6 +22,7 @@ from common.response import result from common.response.result import get_page_request_params, get_page_api_response, get_api_response from common.swagger_api.common_api import CommonApi from dataset.serializers.dataset_serializers import DataSetSerializers +from dataset.views.common import get_dataset_operation_object from setting.serializers.provider_serializers import ModelSerializer from django.utils.translation import gettext_lazy as _ @@ -43,7 +45,8 @@ class Dataset(APIView): dynamic_tag=keywords.get('dataset_id'))], compare=CompareConstants.AND), PermissionConstants.DATASET_EDIT, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Synchronize the knowledge base of the website") + @log(menu='Knowledge Base', operate="Synchronize the knowledge base of the website", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def put(self, request: Request, dataset_id: str): return result.success(DataSetSerializers.SyncWeb( data={'sync_type': request.query_params.get('sync_type'), 'id': dataset_id, @@ -62,7 +65,9 @@ class Dataset(APIView): tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Create QA knowledge base") + @log(menu='Knowledge Base', operate="Create QA knowledge base", + get_operation_object=lambda r, keywords: {'name': r.data.get('name'), 'desc': r.data.get('desc'), + 'file_list': r.FILES.getlist('file')}) def post(self, request: Request): return result.success(DataSetSerializers.Create(data={'user_id': request.user.id}).save_qa({ 'file_list': request.FILES.getlist('file'), @@ -82,7 +87,13 @@ class Dataset(APIView): tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Create a web site knowledge base") + @log(menu='Knowledge Base', operate="Create a web site knowledge base", + get_operation_object=lambda r, keywords: {'name': r.data.get('name'), 'desc': r.data.get('desc'), + 'file_list': r.FILES.getlist('file'), + 'meta': {'source_url': r.data.get('source_url'), + 'selector': r.data.get('selector'), + 'embedding_mode_id': r.data.get('embedding_mode_id')}} + ) def post(self, request: Request): return result.success(DataSetSerializers.Create(data={'user_id': request.user.id}).save_web(request.data)) @@ -96,7 +107,6 @@ class Dataset(APIView): responses=result.get_api_array_response( DataSetSerializers.Application.get_response_body_api()), tags=[_('Knowledge Base')]) - @log(menu='Knowledge Base', operate="Get a list of applications available in the knowledge base") def get(self, request: Request, dataset_id: str): return result.success(DataSetSerializers.Operate( data={'id': dataset_id, 'user_id': str(request.user.id)}).list_application()) @@ -108,7 +118,6 @@ class Dataset(APIView): responses=result.get_api_array_response(DataSetSerializers.Query.get_response_body_api()), tags=[_('Knowledge Base')]) @has_permissions(PermissionConstants.DATASET_READ, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Get a list of knowledge bases") def get(self, request: Request): data = {key: str(value) for key, value in request.query_params.items()} d = DataSetSerializers.Query(data={**data, 'user_id': str(request.user.id)}) @@ -123,7 +132,8 @@ class Dataset(APIView): tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_CREATE, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Create a knowledge base") + @log(menu='Knowledge Base', operate="Create a knowledge base", + get_operation_object=lambda r, keywords: {'name': r.data.get('name'), 'desc': r.data.get('desc')}) def post(self, request: Request): return result.success(DataSetSerializers.Create(data={'user_id': request.user.id}).save(request.data)) @@ -137,7 +147,6 @@ class Dataset(APIView): tags=[_('Knowledge Base')]) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Hit test list") def get(self, request: Request, dataset_id: str): return result.success( DataSetSerializers.HitTest(data={'id': dataset_id, 'user_id': request.user.id, @@ -158,7 +167,8 @@ class Dataset(APIView): ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Re-vectorize") + @log(menu='Knowledge Base', operate="Re-vectorize", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def put(self, request: Request, dataset_id: str): return result.success( DataSetSerializers.Operate(data={'id': dataset_id, 'user_id': request.user.id}).re_embedding()) @@ -173,7 +183,8 @@ class Dataset(APIView): ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Export knowledge base") + @log(menu='Knowledge Base', operate="Export knowledge base", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def get(self, request: Request, dataset_id: str): return DataSetSerializers.Operate(data={'id': dataset_id, 'user_id': request.user.id}).export_excel() @@ -188,7 +199,8 @@ class Dataset(APIView): ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Export knowledge base containing images") + @log(menu='Knowledge Base', operate="Export knowledge base containing images", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def get(self, request: Request, dataset_id: str): return DataSetSerializers.Operate(data={'id': dataset_id, 'user_id': request.user.id}).export_zip() @@ -204,7 +216,8 @@ class Dataset(APIView): dynamic_tag=keywords.get('dataset_id')), lambda r, k: Permission(group=Group.DATASET, operate=Operate.DELETE, dynamic_tag=k.get('dataset_id')), compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Delete knowledge base") + @log(menu='Knowledge Base', operate="Delete knowledge base", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def delete(self, request: Request, dataset_id: str): operate = DataSetSerializers.Operate(data={'id': dataset_id}) return result.success(operate.delete()) @@ -217,7 +230,6 @@ class Dataset(APIView): tags=[_('Knowledge Base')]) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Query knowledge base details based on knowledge base id") def get(self, request: Request, dataset_id: str): return result.success(DataSetSerializers.Operate(data={'id': dataset_id, 'user_id': request.user.id}).one( user_id=request.user.id)) @@ -232,7 +244,8 @@ class Dataset(APIView): ) @has_permissions(lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))) - @log(menu='Knowledge Base', operate="Modify knowledge base information") + @log(menu='Knowledge Base', operate="Modify knowledge base information", + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def put(self, request: Request, dataset_id: str): return result.success( DataSetSerializers.Operate(data={'id': dataset_id, 'user_id': request.user.id}).edit(request.data, @@ -250,7 +263,6 @@ class Dataset(APIView): tags=[_('Knowledge Base')] ) @has_permissions(PermissionConstants.DATASET_READ, compare=CompareConstants.AND) - @log(menu='Knowledge Base', operate="Get the knowledge base paginated list") def get(self, request: Request, current_page, page_size): d = DataSetSerializers.Query( data={'name': request.query_params.get('name', None), 'desc': request.query_params.get("desc", None), @@ -268,7 +280,6 @@ class Dataset(APIView): [lambda r, keywords: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=keywords.get('dataset_id'))], compare=CompareConstants.AND)) - @log(menu='Knowledge Base', operate="Get the model list of the knowledge base") def get(self, request: Request, dataset_id: str): return result.success( ModelSerializer.Query( diff --git a/apps/dataset/views/document.py b/apps/dataset/views/document.py index c5d7b710f..93d49b288 100644 --- a/apps/dataset/views/document.py +++ b/apps/dataset/views/document.py @@ -7,6 +7,7 @@ @desc: """ +from django.utils.translation import gettext_lazy as _ from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import action from rest_framework.parsers import MultiPartParser @@ -21,7 +22,8 @@ from common.util.common import query_params_to_single_dict from dataset.serializers.common_serializers import BatchSerializer from dataset.serializers.document_serializers import DocumentSerializers, DocumentWebInstanceSerializer from dataset.swagger_api.document_api import DocumentApi -from django.utils.translation import gettext_lazy as _ +from dataset.views.common import get_dataset_document_operation_object, get_dataset_operation_object, \ + get_document_operation_object_batch, get_document_operation_object class Template(APIView): @@ -32,7 +34,6 @@ class Template(APIView): operation_id=_('Get QA template'), manual_parameters=DocumentSerializers.Export.get_request_params_api(), tags=[_('Knowledge Base/Documentation')]) - @log(menu='Knowledge Base/Documentation', operate="Get QA template") def get(self, request: Request): return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).export(with_valid=True) @@ -45,7 +46,6 @@ class TableTemplate(APIView): operation_id=_('Get form template'), manual_parameters=DocumentSerializers.Export.get_request_params_api(), tags=[_('Knowledge Base/Documentation')]) - @log(menu='Knowledge Base/Documentation', operate="Get form template") def get(self, request: Request): return DocumentSerializers.Export(data={'type': request.query_params.get('type')}).table_export(with_valid=True) @@ -63,7 +63,11 @@ class WebDocument(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Create Web site documents") + @log(menu='Knowledge Base/Documentation', operate="Create Web site documents", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + {'name': f'[{",".join([url for url in r.data.get("source_url_list", [])])}]', + 'document_list': [{'name': url} for url in r.data.get("source_url_list", [])]})) def post(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Create(data={'dataset_id': dataset_id}).save_web(request.data, with_valid=True)) @@ -82,7 +86,11 @@ class QaDocument(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Import QA and create documentation") + @log(menu='Knowledge Base/Documentation', operate="Import QA and create documentation", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + {'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]', + 'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]})) def post(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Create(data={'dataset_id': dataset_id}).save_qa( @@ -103,7 +111,11 @@ class TableDocument(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Import tables and create documents") + @log(menu='Knowledge Base/Documentation', operate="Import tables and create documents", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + {'name': f'[{",".join([file.name for file in r.FILES.getlist("file")])}]', + 'document_list': [{'name': file.name} for file in r.FILES.getlist("file")]})) def post(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Create(data={'dataset_id': dataset_id}).save_table( @@ -124,7 +136,10 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Document', operate="Create document") + @log(menu='Knowledge Base/Document', operate="Create document", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + {'name': r.data.get('name')})) def post(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Create(data={'dataset_id': dataset_id}).save(request.data, with_valid=True)) @@ -138,7 +153,6 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Document list") def get(self, request: Request, dataset_id: str): d = DocumentSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id}) @@ -159,7 +173,10 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Modify document hit processing methods in batches") + @log(menu='Knowledge Base/Documentation', operate="Modify document hit processing methods in batches", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('id_list')))) def put(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_edit_hit_handling(request.data)) @@ -179,7 +196,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Create documents in batches") + @log(menu='Knowledge Base/Documentation', operate="Create documents in batches", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + {'name': f'[{",".join([document.get("name") for document in r.data])}]', + 'document_list': r.data}) + ) def post(self, request: Request, dataset_id: str): return result.success(DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_save(request.data)) @@ -194,7 +216,11 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Batch sync documents") + @log(menu='Knowledge Base/Documentation', operate="Batch sync documents", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('id_list'))) + ) def put(self, request: Request, dataset_id: str): return result.success(DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_sync(request.data)) @@ -209,7 +235,10 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Delete documents in batches") + @log(menu='Knowledge Base/Documentation', operate="Delete documents in batches", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('id_list')))) def delete(self, request: Request, dataset_id: str): return result.success(DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_delete(request.data)) @@ -226,7 +255,11 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Synchronize web site types") + @log(menu='Knowledge Base/Documentation', operate="Synchronize web site types", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + )) def put(self, request: Request, dataset_id: str, document_id: str): return result.success( DocumentSerializers.Sync(data={'document_id': document_id, 'dataset_id': dataset_id}).sync( @@ -246,7 +279,11 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Cancel task") + @log(menu='Knowledge Base/Documentation', operate="Cancel task", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + )) def put(self, request: Request, dataset_id: str, document_id: str): return result.success( DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}).cancel( @@ -267,7 +304,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Cancel tasks in batches") + @log(menu='Knowledge Base/Documentation', operate="Cancel tasks in batches", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('id_list')) + ) + ) def put(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_cancel(request.data)) @@ -286,7 +328,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Refresh document vector library") + @log(menu='Knowledge Base/Documentation', operate="Refresh document vector library", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str): return result.success( DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}).refresh( @@ -307,7 +354,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Batch refresh document vector library") + @log(menu='Knowledge Base/Documentation', operate="Batch refresh document vector library", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('id_list')) + ) + ) def put(self, request: Request, dataset_id: str): return result.success( DocumentSerializers.Batch(data={'dataset_id': dataset_id}).batch_refresh(request.data)) @@ -330,7 +382,12 @@ class Document(APIView): dynamic_tag=k.get('target_dataset_id')), compare=CompareConstants.AND ) - @log(menu='Knowledge Base/Documentation', operate="Migrate documents in batches") + @log(menu='Knowledge Base/Documentation', operate="Migrate documents in batches", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data) + ) + ) def put(self, request: Request, dataset_id: str, target_dataset_id: str): return result.success( DocumentSerializers.Migrate( @@ -350,7 +407,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Export document") + @log(menu='Knowledge Base/Documentation', operate="Export document", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def get(self, request: Request, dataset_id: str, document_id: str): return DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}).export() @@ -365,7 +427,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Export Zip document") + @log(menu='Knowledge Base/Documentation', operate="Export Zip document", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def get(self, request: Request, dataset_id: str, document_id: str): return DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}).export_zip() @@ -381,7 +448,6 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Get document details") def get(self, request: Request, dataset_id: str, document_id: str): operate = DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}) operate.is_valid(raise_exception=True) @@ -398,7 +464,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Modify document") + @log(menu='Knowledge Base/Documentation', operate="Modify document", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str): return result.success( DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}).edit( @@ -414,7 +485,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Delete document") + @log(menu='Knowledge Base/Documentation', operate="Delete document", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def delete(self, request: Request, dataset_id: str, document_id: str): operate = DocumentSerializers.Operate(data={'document_id': document_id, 'dataset_id': dataset_id}) operate.is_valid(raise_exception=True) @@ -427,7 +503,6 @@ class Document(APIView): @swagger_auto_schema(operation_summary=_('Get a list of segment IDs'), operation_id=_('Get a list of segment IDs'), tags=[_('Knowledge Base/Documentation')]) - @log(menu='Knowledge Base/Documentation', operate="Get a list of segment IDs") def get(self, request: Request): return result.success(DocumentSerializers.SplitPattern.list()) @@ -440,7 +515,6 @@ class Document(APIView): operation_id=_('Segmented document'), manual_parameters=DocumentSerializers.Split.get_request_params_api(), tags=[_('Knowledge Base/Documentation')]) - @log(menu='Knowledge Base/Documentation', operate="Segmented document") def post(self, request: Request): split_data = {'file': request.FILES.getlist('file')} request_data = request.data @@ -468,7 +542,6 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Get the knowledge base paginated list") def get(self, request: Request, dataset_id: str, current_page, page_size): d = DocumentSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id}) @@ -482,7 +555,12 @@ class Document(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation', operate="Batch generate related documents") + @log(menu='Knowledge Base/Documentation', operate="Batch generate related documents", + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object_batch(r.data.get('document_id_list')) + ) + ) def put(self, request: Request, dataset_id: str): return result.success(DocumentSerializers.BatchGenerateRelated(data={'dataset_id': dataset_id}) .batch_generate_related(request.data)) diff --git a/apps/dataset/views/paragraph.py b/apps/dataset/views/paragraph.py index 3936c48eb..db8e12590 100644 --- a/apps/dataset/views/paragraph.py +++ b/apps/dataset/views/paragraph.py @@ -20,6 +20,9 @@ from dataset.serializers.common_serializers import BatchSerializer from dataset.serializers.paragraph_serializers import ParagraphSerializers from django.utils.translation import gettext_lazy as _ +from dataset.views import get_dataset_document_operation_object, get_dataset_operation_object, \ + get_document_operation_object + class Paragraph(APIView): authentication_classes = [TokenAuth] @@ -34,7 +37,6 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Paragraph list') def get(self, request: Request, dataset_id: str, document_id: str): q = ParagraphSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id, @@ -52,7 +54,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Create Paragraph') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Create Paragraph', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def post(self, request: Request, dataset_id: str, document_id: str): return result.success( ParagraphSerializers.Create(data={'dataset_id': dataset_id, 'document_id': document_id}).save(request.data)) @@ -70,7 +77,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Add associated questions') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Add associated questions', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def post(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str): return result.success(ParagraphSerializers.Problem( data={"dataset_id": dataset_id, 'document_id': document_id, 'paragraph_id': paragraph_id}).save( @@ -86,7 +98,6 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Get a list of paragraph questions') def get(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str): return result.success(ParagraphSerializers.Problem( data={"dataset_id": dataset_id, 'document_id': document_id, 'paragraph_id': paragraph_id}).list( @@ -104,7 +115,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Disassociation issue') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Disassociation issue', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str, problem_id: str): return result.success(ParagraphSerializers.Association( data={'dataset_id': dataset_id, 'document_id': document_id, 'paragraph_id': paragraph_id, @@ -122,7 +138,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Related questions') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Related questions', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str, problem_id: str): return result.success(ParagraphSerializers.Association( data={'dataset_id': dataset_id, 'document_id': document_id, 'paragraph_id': paragraph_id, @@ -141,7 +162,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Modify paragraph data') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Modify paragraph data', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str): o = ParagraphSerializers.Operate( data={"paragraph_id": paragraph_id, 'dataset_id': dataset_id, 'document_id': document_id}) @@ -157,7 +183,6 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Get paragraph details') def get(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str): o = ParagraphSerializers.Operate( data={"dataset_id": dataset_id, 'document_id': document_id, "paragraph_id": paragraph_id}) @@ -173,7 +198,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Delete paragraph') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Delete paragraph', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def delete(self, request: Request, dataset_id: str, document_id: str, paragraph_id: str): o = ParagraphSerializers.Operate( data={"dataset_id": dataset_id, 'document_id': document_id, "paragraph_id": paragraph_id}) @@ -194,7 +224,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Delete paragraphs in batches') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Delete paragraphs in batches', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def delete(self, request: Request, dataset_id: str, document_id: str): return result.success(ParagraphSerializers.Batch( data={"dataset_id": dataset_id, 'document_id': document_id}).batch_delete(request.data)) @@ -217,7 +252,12 @@ class Paragraph(APIView): dynamic_tag=k.get('target_dataset_id')), compare=CompareConstants.AND ) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Migrate paragraphs in batches') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Migrate paragraphs in batches', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, target_dataset_id: str, document_id: str, target_document_id): return result.success( ParagraphSerializers.Migrate( @@ -239,7 +279,6 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Get paragraph list by pagination') def get(self, request: Request, dataset_id: str, document_id: str, current_page, page_size): d = ParagraphSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id, @@ -254,7 +293,12 @@ class Paragraph(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph', operate='Batch generate related') + @log(menu='Knowledge Base/Documentation/Paragraph', operate='Batch generate related', + get_operation_object=lambda r, keywords: get_dataset_document_operation_object( + get_dataset_operation_object(keywords.get('dataset_id')), + get_document_operation_object(keywords.get('document_id')) + ) + ) def put(self, request: Request, dataset_id: str, document_id: str): return result.success( ParagraphSerializers.BatchGenerateRelated(data={'dataset_id': dataset_id, 'document_id': document_id}) diff --git a/apps/dataset/views/problem.py b/apps/dataset/views/problem.py index 9bc9c9b7f..eb5e8d759 100644 --- a/apps/dataset/views/problem.py +++ b/apps/dataset/views/problem.py @@ -20,6 +20,8 @@ from dataset.serializers.problem_serializers import ProblemSerializers from dataset.swagger_api.problem_api import ProblemApi from django.utils.translation import gettext_lazy as _ +from dataset.views import get_dataset_operation_object + class Problem(APIView): authentication_classes = [TokenAuth] @@ -34,7 +36,6 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Question list') def get(self, request: Request, dataset_id: str): q = ProblemSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id}) @@ -51,7 +52,9 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Create question') + @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Create question', + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id')) + ) def post(self, request: Request, dataset_id: str): return result.success( ProblemSerializers.Create( @@ -69,7 +72,6 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Get a list of associated paragraphs') def get(self, request: Request, dataset_id: str, problem_id: str): return result.success(ProblemSerializers.Operate( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id, @@ -89,7 +91,8 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Batch deletion issues') + @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Batch deletion issues', + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def delete(self, request: Request, dataset_id: str): return result.success( ProblemSerializers.BatchOperate(data={'dataset_id': dataset_id}).delete(request.data)) @@ -104,7 +107,8 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Batch associated paragraphs') + @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Batch associated paragraphs', + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def post(self, request: Request, dataset_id: str): return result.success( ProblemSerializers.BatchOperate(data={'dataset_id': dataset_id}).association(request.data)) @@ -121,7 +125,8 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Delete question') + @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Delete question', + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def delete(self, request: Request, dataset_id: str, problem_id: str): return result.success(ProblemSerializers.Operate( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id, @@ -137,7 +142,8 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.MANAGE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Modify question') + @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Modify question', + get_operation_object=lambda r, keywords: get_dataset_operation_object(keywords.get('dataset_id'))) def put(self, request: Request, dataset_id: str, problem_id: str): return result.success(ProblemSerializers.Operate( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id, @@ -156,7 +162,6 @@ class Problem(APIView): @has_permissions( lambda r, k: Permission(group=Group.DATASET, operate=Operate.USE, dynamic_tag=k.get('dataset_id'))) - @log(menu='Knowledge Base/Documentation/Paragraph/Question', operate='Get the list of questions by page') def get(self, request: Request, dataset_id: str, current_page, page_size): d = ProblemSerializers.Query( data={**query_params_to_single_dict(request.query_params), 'dataset_id': dataset_id}) diff --git a/apps/function_lib/views/common.py b/apps/function_lib/views/common.py new file mode 100644 index 000000000..5509964f5 --- /dev/null +++ b/apps/function_lib/views/common.py @@ -0,0 +1,20 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎 + @file: common.py + @date:2025/3/25 17:27 + @desc: +""" +from django.db.models import QuerySet + +from function_lib.models.function import FunctionLib + + +def get_function_lib_operation_object(function_lib_id): + function_lib_model = QuerySet(model=FunctionLib).filter(id=function_lib_id).first() + if function_lib_model is not None: + return { + "name": function_lib_model.name + } + return {} diff --git a/apps/function_lib/views/function_lib_views.py b/apps/function_lib/views/function_lib_views.py index 3070357cc..018c015d0 100644 --- a/apps/function_lib/views/function_lib_views.py +++ b/apps/function_lib/views/function_lib_views.py @@ -6,6 +6,7 @@ @date:2024/8/2 17:08 @desc: """ +from django.utils.translation import gettext_lazy as _ from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import action from rest_framework.parsers import MultiPartParser @@ -13,12 +14,12 @@ from rest_framework.request import Request from rest_framework.views import APIView from common.auth import TokenAuth, has_permissions -from common.constants.permission_constants import RoleConstants, Permission, Group, Operate +from common.constants.permission_constants import RoleConstants from common.log.log import log from common.response import result from function_lib.serializers.function_lib_serializer import FunctionLibSerializer from function_lib.swagger_api.function_lib_api import FunctionLibApi -from django.utils.translation import gettext_lazy as _ +from function_lib.views.common import get_function_lib_operation_object class FunctionLibView(APIView): @@ -45,7 +46,8 @@ class FunctionLibView(APIView): request_body=FunctionLibApi.Create.get_request_body_api(), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Create function") + @log(menu='Function', operate="Create function", + get_operation_object=lambda r, k: r.data.get('name')) def post(self, request: Request): return result.success(FunctionLibSerializer.Create(data={'user_id': request.user.id}).insert(request.data)) @@ -58,7 +60,6 @@ class FunctionLibView(APIView): request_body=FunctionLibApi.Debug.get_request_body_api(), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Debug function") def post(self, request: Request): return result.success( FunctionLibSerializer.Debug(data={'user_id': request.user.id}).debug( @@ -73,7 +74,8 @@ class FunctionLibView(APIView): request_body=FunctionLibApi.Edit.get_request_body_api(), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Update function") + @log(menu='Function', operate="Update function", + get_operation_object=lambda r, k: get_function_lib_operation_object(k.get('function_lib_id'))) def put(self, request: Request, function_lib_id: str): return result.success( FunctionLibSerializer.Operate(data={'user_id': request.user.id, 'id': function_lib_id}).edit( @@ -84,7 +86,8 @@ class FunctionLibView(APIView): operation_id=_('Delete function'), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Delete function") + @log(menu='Function', operate="Delete function", + get_operation_object=lambda r, k: get_function_lib_operation_object(k.get('function_lib_id'))) def delete(self, request: Request, function_lib_id: str): return result.success( FunctionLibSerializer.Operate(data={'user_id': request.user.id, 'id': function_lib_id}).delete()) @@ -94,7 +97,6 @@ class FunctionLibView(APIView): operation_id=_('Get function details'), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Get function details") def get(self, request: Request, function_lib_id: str): return result.success( FunctionLibSerializer.Operate(data={'user_id': request.user.id, 'id': function_lib_id}).one()) @@ -110,7 +112,6 @@ class FunctionLibView(APIView): responses=result.get_page_api_response(FunctionLibApi.get_response_body_api()), tags=[_('Function')]) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Get function list by pagination") def get(self, request: Request, current_page: int, page_size: int): return result.success( FunctionLibSerializer.Query( @@ -145,7 +146,8 @@ class FunctionLibView(APIView): tags=[_("function")] ) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Export function") + @log(menu='Function', operate="Export function", + get_operation_object=lambda r, k: get_function_lib_operation_object(k.get('id'))) def get(self, request: Request, id: str): return FunctionLibSerializer.Operate( data={'id': id, 'user_id': request.user.id}).export() @@ -156,7 +158,8 @@ class FunctionLibView(APIView): @action(methods=['PUT'], detail=False) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Edit icon") + @log(menu='Function', operate="Edit icon", + get_operation_object=lambda r, k: get_function_lib_operation_object(k.get('id'))) def put(self, request: Request, id: str): return result.success( FunctionLibSerializer.IconOperate( @@ -168,9 +171,10 @@ class FunctionLibView(APIView): @action(methods=['POST'], detail=False) @has_permissions(RoleConstants.ADMIN, RoleConstants.USER) - @log(menu='Function', operate="Add internal function") + @log(menu='Function', operate="Add internal function", + get_operation_object=lambda r, k: get_function_lib_operation_object(k.get('id'))) def post(self, request: Request, id: str): return result.success( FunctionLibSerializer.InternalFunction( data={'id': id, 'user_id': request.user.id, 'name': request.data.get('name')}) - .add()) \ No newline at end of file + .add()) diff --git a/apps/setting/migrations/0010_log.py b/apps/setting/migrations/0010_log.py index 936dab820..3cc11917b 100644 --- a/apps/setting/migrations/0010_log.py +++ b/apps/setting/migrations/0010_log.py @@ -1,13 +1,12 @@ -# Generated by Django 4.2.18 on 2025-03-17 02:50 - -import uuid - -from django.db import migrations, models +# Generated by Django 4.2.18 on 2025-03-25 03:22 import common.encoder.encoder +from django.db import migrations, models +import uuid class Migration(migrations.Migration): + dependencies = [ ('setting', '0009_set_default_model_params_form'), ] @@ -18,15 +17,14 @@ class Migration(migrations.Migration): fields=[ ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, - verbose_name='主键id')), + ('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('menu', models.CharField(max_length=128, verbose_name='操作菜单')), ('operate', models.CharField(max_length=128, verbose_name='操作')), + ('operation_object', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='操作对象')), ('user', models.JSONField(default=dict, verbose_name='用户信息')), ('status', models.IntegerField(max_length=20, verbose_name='状态')), ('ip_address', models.CharField(max_length=128, verbose_name='ip地址')), - ('details', - models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='详情')), + ('details', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='详情')), ], options={ 'db_table': 'log', diff --git a/apps/setting/models/log_management.py b/apps/setting/models/log_management.py index 3fa37767f..849a4dedc 100644 --- a/apps/setting/models/log_management.py +++ b/apps/setting/models/log_management.py @@ -24,6 +24,8 @@ class Log(AppModelMixin): operate = models.CharField(max_length=128, verbose_name="操作") + operation_object = models.JSONField(verbose_name="操作对象", default=dict, encoder=SystemEncoder) + user = models.JSONField(verbose_name="用户信息", default=dict) status = models.IntegerField(max_length=20, verbose_name="状态") diff --git a/apps/setting/views/Team.py b/apps/setting/views/Team.py index 2913fd835..8564efa01 100644 --- a/apps/setting/views/Team.py +++ b/apps/setting/views/Team.py @@ -19,6 +19,8 @@ from setting.serializers.team_serializers import TeamMemberSerializer, get_respo UpdateTeamMemberPermissionSerializer from django.utils.translation import gettext_lazy as _ +from setting.views.common import get_member_operation_object, get_member_operation_object_batch + class TeamMember(APIView): authentication_classes = [TokenAuth] @@ -29,7 +31,6 @@ class TeamMember(APIView): responses=result.get_api_response(get_response_body_api()), tags=[_('team')]) @has_permissions(PermissionConstants.TEAM_READ) - @log(menu='team', operate='Get a list of team members') def get(self, request: Request): return result.success(TeamMemberSerializer(data={'team_id': str(request.user.id)}).list_member()) @@ -39,7 +40,8 @@ class TeamMember(APIView): request_body=TeamMemberSerializer().get_request_body_api(), tags=[_('team')]) @has_permissions(PermissionConstants.TEAM_CREATE) - @log(menu='team', operate='Add member') + @log(menu='team', operate='Add member', + get_operation_object=lambda r, k: {'name': r.data.get('username_or_email')}) def post(self, request: Request): team = TeamMemberSerializer(data={'team_id': str(request.user.id)}) return result.success((team.add_member(**request.data))) @@ -53,7 +55,8 @@ class TeamMember(APIView): request_body=TeamMemberSerializer.get_bach_request_body_api(), tags=[_('team')]) @has_permissions(PermissionConstants.TEAM_CREATE) - @log(menu='team', operate='Add members in batches') + @log(menu='team', operate='Add members in batches', + get_operation_object=lambda r, k: get_member_operation_object_batch(r.data)) def post(self, request: Request): return result.success( TeamMemberSerializer(data={'team_id': request.user.id}).batch_add_member(request.data)) @@ -67,7 +70,6 @@ class TeamMember(APIView): manual_parameters=TeamMemberSerializer.Operate.get_request_params_api(), tags=[_('team')]) @has_permissions(PermissionConstants.TEAM_READ) - @log(menu='team', operate='Get team member permissions') def get(self, request: Request, member_id: str): return result.success(TeamMemberSerializer.Operate( data={'member_id': member_id, 'team_id': str(request.user.id)}).list_member_permission()) @@ -80,7 +82,9 @@ class TeamMember(APIView): tags=[_('team')] ) @has_permissions(PermissionConstants.TEAM_EDIT) - @log(menu='team', operate='Update team member permissions') + @log(menu='team', operate='Update team member permissions', + get_operation_object=lambda r, k: get_member_operation_object(k.get('member_id')) + ) def put(self, request: Request, member_id: str): return result.success(TeamMemberSerializer.Operate( data={'member_id': member_id, 'team_id': str(request.user.id)}).edit(request.data)) @@ -92,7 +96,8 @@ class TeamMember(APIView): tags=[_('team')] ) @has_permissions(PermissionConstants.TEAM_DELETE) - @log(menu='team', operate='Remove member') + @log(menu='team', operate='Remove member', + get_operation_object=lambda r, k: get_member_operation_object(k.get('member_id'))) def delete(self, request: Request, member_id: str): return result.success(TeamMemberSerializer.Operate( data={'member_id': member_id, 'team_id': str(request.user.id)}).delete()) diff --git a/apps/setting/views/common.py b/apps/setting/views/common.py new file mode 100644 index 000000000..ccc68e8ff --- /dev/null +++ b/apps/setting/views/common.py @@ -0,0 +1,78 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎 + @file: common.py + @date:2025/3/25 16:26 + @desc: +""" +from django.db.models import QuerySet + +from common.util.common import encryption +from setting.models import Model +from users.models import User + + +def get_model_operation_object(model_id): + model_model = QuerySet(model=Model).filter(id=model_id).first() + if model_model is not None: + return { + "name": model_model.name + } + return {} + + +def get_member_operation_object(member_id): + user_model = QuerySet(model=User).filter(id=member_id).first() + if user_model is not None: + return { + "name": user_model.username + } + return {} + + +def get_member_operation_object_batch(member_id_list): + user_model_list = QuerySet(model=User).filter(id__in=member_id_list) + if user_model_list is not None: + return { + "name": f'[{",".join([user.username for user in user_model_list])}]', + "user_list": [{'name': user.username} for user in user_model_list] + } + return {} + + +def encryption_str(_value): + if isinstance(_value, str): + return encryption(_value) + return _value + + +def encryption_credential(credential): + if isinstance(credential, dict): + return {key: encryption_str(credential.get(key)) for key in credential} + return credential + + +def get_edit_model_details(request): + path = request.path + body = request.data + query = request.query_params + credential = body.get('credential', {}) + credential_encryption_ed = encryption_credential(credential) + return { + 'path': path, + 'body': {**body, 'credential': credential_encryption_ed}, + 'query': query + } + + +def get_email_details(request): + path = request.path + body = request.data + query = request.query_params + email_host_password = body.get('email_host_password', '') + return { + 'path': path, + 'body': {**body, 'email_host_password': encryption_str(email_host_password)}, + 'query': query + } diff --git a/apps/setting/views/model.py b/apps/setting/views/model.py index 242c9241a..7b926013b 100644 --- a/apps/setting/views/model.py +++ b/apps/setting/views/model.py @@ -22,6 +22,8 @@ from setting.serializers.provider_serializers import ProviderSerializer, ModelSe from setting.swagger_api.provide_api import ProvideApi, ModelCreateApi, ModelQueryApi, ModelEditApi from django.utils.translation import gettext_lazy as _ +from setting.views.common import get_model_operation_object, get_edit_model_details + class Model(APIView): authentication_classes = [TokenAuth] @@ -32,7 +34,9 @@ class Model(APIView): request_body=ModelCreateApi.get_request_body_api() , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) - @log(menu='model', operate='Create model') + @log(menu='model', operate='Create model', + get_operation_object=lambda r, k: {'name': r.data.get('name')}, + get_details=get_edit_model_details) def post(self, request: Request): return result.success( ModelSerializer.Create(data={**request.data, 'user_id': str(request.user.id)}).insert(request.user.id, @@ -44,7 +48,6 @@ class Model(APIView): request_body=ModelCreateApi.get_request_body_api() , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) - @log(menu='model', operate='Download model, trial only with Ollama platform') def put(self, request: Request): return result.success( ModelSerializer.Create(data={**request.data, 'user_id': str(request.user.id)}).insert(request.user.id, @@ -56,7 +59,6 @@ class Model(APIView): manual_parameters=ModelQueryApi.get_request_params_api() , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get model list') def get(self, request: Request): return result.success( ModelSerializer.Query( @@ -73,8 +75,6 @@ class Model(APIView): 'Query model meta information, this interface does not carry authentication information'), tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', - operate='Query model meta information, this interface does not carry authentication information') def get(self, request: Request, model_id: str): return result.success( ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).one_meta(with_valid=True)) @@ -87,8 +87,6 @@ class Model(APIView): operation_id=_('Pause model download'), tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) - @log(menu='model', - operate='Pause model download') def put(self, request: Request, model_id: str): return result.success( ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).pause_download()) @@ -102,7 +100,6 @@ class Model(APIView): manual_parameters=ProvideApi.ModelForm.get_request_params_api(), tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get model parameter form') def get(self, request: Request, model_id: str): return result.success( ModelSerializer.ModelParams(data={'id': model_id, 'user_id': request.user.id}).get_model_params()) @@ -113,7 +110,8 @@ class Model(APIView): manual_parameters=ProvideApi.ModelForm.get_request_params_api(), tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Save model parameter form') + @log(menu='model', operate='Save model parameter form', + get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id'))) def put(self, request: Request, model_id: str): return result.success( ModelSerializer.ModelParamsForm(data={'id': model_id, 'user_id': request.user.id}) @@ -128,7 +126,9 @@ class Model(APIView): request_body=ModelEditApi.get_request_body_api() , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_CREATE) - @log(menu='model', operate='Update model') + @log(menu='model', operate='Update model', + get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id')), + get_details=get_edit_model_details) def put(self, request: Request, model_id: str): return result.success( ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).edit(request.data, @@ -140,7 +140,8 @@ class Model(APIView): responses=result.get_default_response() , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_DELETE) - @log(menu='model', operate='Delete model') + @log(menu='model', operate='Delete model', + get_operation_object=lambda r, k: get_model_operation_object(k.get('model_id'))) def delete(self, request: Request, model_id: str): return result.success( ModelSerializer.Operate(data={'id': model_id, 'user_id': request.user.id}).delete()) @@ -149,7 +150,6 @@ class Model(APIView): @swagger_auto_schema(operation_summary=_('Query model details'), operation_id=_('Query model details'), tags=[_('model')]) - @log(menu='model', operate='Query model details') @has_permissions(PermissionConstants.MODEL_READ) def get(self, request: Request, model_id: str): return result.success( @@ -179,7 +179,6 @@ class Provide(APIView): operation_id=_('Get a list of model suppliers') , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get a list of model suppliers') def get(self, request: Request): model_type = request.query_params.get('model_type') if model_type: @@ -203,7 +202,6 @@ class Provide(APIView): responses=result.get_api_array_response(ProvideApi.ModelTypeList.get_response_body_api()) , tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get a list of model types') def get(self, request: Request): provider = request.query_params.get('provider') return result.success(ModelProvideConstants[provider].value.get_model_type_list()) @@ -219,7 +217,6 @@ class Provide(APIView): , tags=[_('model')] ) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get the model creation form') def get(self, request: Request): provider = request.query_params.get('provider') model_type = request.query_params.get('model_type') @@ -239,7 +236,6 @@ class Provide(APIView): , tags=[_('model')] ) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get model default parameters') def get(self, request: Request): provider = request.query_params.get('provider') model_type = request.query_params.get('model_type') @@ -256,7 +252,6 @@ class Provide(APIView): manual_parameters=ProvideApi.ModelForm.get_request_params_api(), tags=[_('model')]) @has_permissions(PermissionConstants.MODEL_READ) - @log(menu='model', operate='Get the model creation form') def get(self, request: Request): provider = request.query_params.get('provider') model_type = request.query_params.get('model_type') diff --git a/apps/setting/views/system_setting.py b/apps/setting/views/system_setting.py index 5e8113a52..64dda262e 100644 --- a/apps/setting/views/system_setting.py +++ b/apps/setting/views/system_setting.py @@ -20,6 +20,8 @@ from setting.serializers.system_setting import SystemSettingSerializer from setting.swagger_api.system_setting import SystemSettingEmailApi from django.utils.translation import gettext_lazy as _ +from setting.views.common import get_email_details + class SystemSetting(APIView): class Email(APIView): @@ -31,7 +33,9 @@ class SystemSetting(APIView): request_body=SystemSettingEmailApi.get_request_body_api(), tags=[_('Email settings')], responses=result.get_api_response(SystemSettingEmailApi.get_response_body_api())) @has_permissions(RoleConstants.ADMIN) - @log(menu='Email settings', operate='Create or update email settings') + @log(menu='Email settings', operate='Create or update email settings', + get_details=get_email_details + ) def put(self, request: Request): return result.success( SystemSettingSerializer.EmailSerializer.Create( @@ -44,7 +48,9 @@ class SystemSetting(APIView): responses=result.get_default_response(), tags=[_('Email settings')]) @has_permissions(RoleConstants.ADMIN) - @log(menu='Email settings', operate='Test email settings') + @log(menu='Email settings', operate='Test email settings', + get_details=get_email_details + ) def post(self, request: Request): return result.success( SystemSettingSerializer.EmailSerializer.Create( @@ -56,7 +62,6 @@ class SystemSetting(APIView): responses=result.get_api_response(SystemSettingEmailApi.get_response_body_api()), tags=[_('Email settings')]) @has_permissions(RoleConstants.ADMIN) - @log(menu='Email settings', operate='Get email settings') def get(self, request: Request): return result.success( SystemSettingSerializer.EmailSerializer.one()) diff --git a/apps/users/views/common.py b/apps/users/views/common.py new file mode 100644 index 000000000..c3f086b7b --- /dev/null +++ b/apps/users/views/common.py @@ -0,0 +1,32 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎 + @file: common.py + @date:2025/3/25 16:46 + @desc: +""" +from common.util.common import encryption +from users.models import User +from django.db.models import QuerySet + + +def get_user_operation_object(user_id): + user_model = QuerySet(model=User).filter(id=user_id).first() + if user_model is not None: + return { + "name": user_model.username + } + return {} + + +def get_re_password_details(request): + path = request.path + body = request.data + query = request.query_params + return { + 'path': path, + 'body': {**body, 'password': encryption(body.get('password', '')), + 're_password': encryption(body.get('re_password', ''))}, + 'query': query + } diff --git a/apps/users/views/user.py b/apps/users/views/user.py index 22969ce60..98ef81070 100644 --- a/apps/users/views/user.py +++ b/apps/users/views/user.py @@ -7,6 +7,7 @@ @desc: """ from django.core import cache +from django.utils.translation import gettext_lazy as _ from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema from rest_framework.decorators import action @@ -26,7 +27,7 @@ from users.serializers.user_serializers import RegisterSerializer, LoginSerializ RePasswordSerializer, \ SendEmailSerializer, UserProfile, UserSerializer, UserManageSerializer, UserInstanceSerializer, SystemSerializer, \ SwitchLanguageSerializer -from django.utils.translation import gettext_lazy as _ +from users.views.common import get_user_operation_object, get_re_password_details user_cache = cache.caches['user_cache'] token_cache = cache.caches['token_cache'] @@ -38,7 +39,6 @@ class Profile(APIView): operation_id=_("Get MaxKB related information"), responses=result.get_api_response(SystemSerializer.get_response_body_api()), tags=[_('System parameters')]) - @log(menu='System parameters', operate='Get MaxKB related information') def get(self, request: Request): return result.success(SystemSerializer.get_profile()) @@ -52,7 +52,6 @@ class User(APIView): responses=result.get_api_response(UserProfile.get_response_body_api()), tags=[]) @has_permissions(PermissionConstants.USER_READ) - @log(menu='User', operate='Get current user information') def get(self, request: Request): return result.success(UserProfile.get_user_profile(request.user)) @@ -66,7 +65,6 @@ class User(APIView): responses=result.get_api_array_response(UserSerializer.Query.get_response_body_api()), tags=[_("User")]) @has_permissions(PermissionConstants.USER_READ) - @log(menu='User', operate='Get user list') def get(self, request: Request): return result.success( UserSerializer.Query(data={'email_or_username': request.query_params.get('email_or_username')}).list()) @@ -88,7 +86,8 @@ class SwitchUserLanguageView(APIView): ), responses=RePasswordSerializer().get_response_body_api(), tags=[_("User")]) - @log(menu='User', operate='Switch Language') + @log(menu='User', operate='Switch Language', + get_operation_object=lambda r, k: {'name': r.user.username}) def post(self, request: Request): data = {**request.data, 'user_id': request.user.id} return result.success(SwitchLanguageSerializer(data=data).switch()) @@ -114,7 +113,9 @@ class ResetCurrentUserPasswordView(APIView): ), responses=RePasswordSerializer().get_response_body_api(), tags=[_("User")]) - @log(menu='User', operate='Modify current user password') + @log(menu='User', operate='Modify current user password', + get_operation_object=lambda r, k: {'name': r.user.username}, + get_details=get_re_password_details) def post(self, request: Request): data = {'email': request.user.email} data.update(request.data) @@ -134,7 +135,8 @@ class SendEmailToCurrentUserView(APIView): operation_id=_("Send email to current user"), responses=SendEmailSerializer().get_response_body_api(), tags=[_("User")]) - @log(menu='User', operate='Send email to current user') + @log(menu='User', operate='Send email to current user', + get_operation_object=lambda r, k: {'name': r.user.username}) def post(self, request: Request): serializer_obj = SendEmailSerializer(data={'email': request.user.email, 'type': "reset_password"}) if serializer_obj.is_valid(raise_exception=True): @@ -150,7 +152,8 @@ class Logout(APIView): operation_id=_("Sign out"), responses=SendEmailSerializer().get_response_body_api(), tags=[_("User")]) - @log(menu='User', operate='Sign out') + @log(menu='User', operate='Sign out', + get_operation_object=lambda r, k: {'name': r.user.username}) def post(self, request: Request): token_cache.delete(request.META.get('HTTP_AUTHORIZATION')) return result.success(True) @@ -177,7 +180,8 @@ class Login(APIView): security=[], tags=[_("User")]) @log(menu='User', operate='Log in', get_user=lambda r: {'user_name': r.data.get('username', None)}, - get_details=_get_details) + get_details=_get_details, + get_operation_object=lambda r, k: {'name': r.data.get('username')}) def post(self, request: Request): login_request = LoginSerializer(data=request.data) # 校验请求参数 @@ -197,7 +201,9 @@ class Register(APIView): responses=RegisterSerializer().get_response_body_api(), security=[], tags=[_("User")]) - @log(menu='User', operate='User registration', get_user=lambda r: {'user_name': r.data.get('username', None)}) + @log(menu='User', operate='User registration', + get_operation_object=lambda r, k: {'name': r.data.get('username', None)}, + get_user=lambda r: {'user_name': r.data.get('username', None)}) def post(self, request: Request): serializer_obj = RegisterSerializer(data=request.data) if serializer_obj.is_valid(raise_exception=True): @@ -216,7 +222,9 @@ class RePasswordView(APIView): security=[], tags=[_("User")]) @log(menu='User', operate='Change password', - get_user=lambda r: {'user_name': None, 'email': r.data.get('email', None)}) + get_operation_object=lambda r, k: {'name': r.data.get('email', None)}, + get_user=lambda r: {'user_name': None, 'email': r.data.get('email', None)}, + get_details=get_re_password_details) def post(self, request: Request): serializer_obj = RePasswordSerializer(data=request.data) return result.success(serializer_obj.reset_password()) @@ -233,6 +241,7 @@ class CheckCode(APIView): security=[], tags=[_("User")]) @log(menu='User', operate='Check whether the verification code is correct', + get_operation_object=lambda r, k: {'name': r.data.get('email', None)}, get_user=lambda r: {'user_name': None, 'email': r.data.get('email', None)}) def post(self, request: Request): return result.success(CheckCodeSerializer(data=request.data).is_valid(raise_exception=True)) @@ -248,6 +257,7 @@ class SendEmail(APIView): security=[], tags=[_("User")]) @log(menu='User', operate='Send email', + get_operation_object=lambda r, k: {'name': r.data.get('email', None)}, get_user=lambda r: {'user_name': None, 'email': r.data.get('email', None)}) def post(self, request: Request): serializer_obj = SendEmailSerializer(data=request.data) @@ -269,7 +279,8 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Add user') + @log(menu='User', operate='Add user', + get_operation_object=lambda r, k: {'name': r.data.get('username', None)}) def post(self, request: Request): return result.success(UserManageSerializer().save(request.data)) @@ -287,7 +298,6 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Get user paginated list') def get(self, request: Request, current_page, page_size): d = UserManageSerializer.Query( data={'email_or_username': request.query_params.get('email_or_username', None), @@ -308,7 +318,9 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Change password') + @log(menu='User', operate='Change password', + get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id')), + get_details=get_re_password_details) def put(self, request: Request, user_id): return result.success( UserManageSerializer.Operate(data={'id': user_id}).re_password(request.data, with_valid=True)) @@ -326,7 +338,8 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Delete user') + @log(menu='User', operate='Delete user', + get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id'))) def delete(self, request: Request, user_id): return result.success(UserManageSerializer.Operate(data={'id': user_id}).delete(with_valid=True)) @@ -341,7 +354,6 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Get user information') def get(self, request: Request, user_id): return result.success(UserManageSerializer.Operate(data={'id': user_id}).one(with_valid=True)) @@ -357,7 +369,8 @@ class UserManage(APIView): [RoleConstants.ADMIN], [PermissionConstants.USER_READ], compare=CompareConstants.AND)) - @log(menu='User', operate='Update user information') + @log(menu='User', operate='Update user information', + get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id'))) def put(self, request: Request, user_id): return result.success( UserManageSerializer.Operate(data={'id': user_id}).edit(request.data, with_valid=True)) @@ -372,6 +385,5 @@ class UserListView(APIView): responses=result.get_api_array_response(UserSerializer.Query.get_response_body_api()), tags=[_("User")]) @has_permissions(PermissionConstants.USER_READ) - @log(menu='User', operate='Get user list by type') def get(self, request: Request, type): return result.success(UserSerializer().listByType(type, request.user.id))