feat: Audit log add operation object (#2681)
Some checks are pending
sync2gitee / repo-sync (push) Waiting to run
Typos Check / Spell Check with Typos (push) Waiting to run

This commit is contained in:
shaohuzhang1 2025-03-25 19:07:02 +08:00 committed by GitHub
parent ba4e55d3e8
commit f9d536f5a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 550 additions and 180 deletions

View File

@ -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(

View File

@ -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())

View File

@ -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):

View File

@ -0,0 +1,21 @@
# coding=utf-8
"""
@project: MaxKB
@Author
@file common.py
@date2025/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 {}

View File

@ -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

View File

@ -0,0 +1,56 @@
# coding=utf-8
"""
@project: MaxKB
@Author
@file common.py.py
@date2025/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", ""),
}

View File

@ -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(

View File

@ -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))

View File

@ -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})

View File

@ -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})

View File

@ -0,0 +1,20 @@
# coding=utf-8
"""
@project: MaxKB
@Author
@file common.py
@date2025/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 {}

View File

@ -6,6 +6,7 @@
@date2024/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())
.add())

View File

@ -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',

View File

@ -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="状态")

View File

@ -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())

View File

@ -0,0 +1,78 @@
# coding=utf-8
"""
@project: MaxKB
@Author
@file common.py
@date2025/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
}

View File

@ -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')

View File

@ -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())

View File

@ -0,0 +1,32 @@
# coding=utf-8
"""
@project: MaxKB
@Author
@file common.py
@date2025/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
}

View File

@ -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))