Skip to content

Commit f9d536f

Browse files
authored
feat: Audit log add operation object (#2681)
1 parent ba4e55d commit f9d536f

File tree

20 files changed

+550
-180
lines changed

20 files changed

+550
-180
lines changed

apps/application/views/application_version_views.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from application.serializers.application_version_serializers import ApplicationVersionSerializer
1515
from application.swagger_api.application_version_api import ApplicationVersionApi
16+
from application.views import get_application_operation_object
1617
from common.auth import has_permissions, TokenAuth
1718
from common.constants.permission_constants import PermissionConstants, CompareConstants, ViewPermission, RoleConstants, \
1819
Permission, Group, Operate
@@ -31,7 +32,6 @@ class ApplicationVersionView(APIView):
3132
responses=result.get_api_array_response(ApplicationVersionApi.get_response_body_api()),
3233
tags=[_('Application/Version')])
3334
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
34-
@log(menu='Application', operate="Get the application list")
3535
def get(self, request: Request, application_id: str):
3636
return result.success(
3737
ApplicationVersionSerializer.Query(
@@ -49,7 +49,6 @@ class Page(APIView):
4949
responses=result.get_page_api_response(ApplicationVersionApi.get_response_body_api()),
5050
tags=[_('Application/Version')])
5151
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
52-
@log(menu='Application', operate="Get the list of application versions by page")
5352
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
5453
return result.success(
5554
ApplicationVersionSerializer.Query(
@@ -67,7 +66,6 @@ class Operate(APIView):
6766
responses=result.get_api_response(ApplicationVersionApi.get_response_body_api()),
6867
tags=[_('Application/Version')])
6968
@has_permissions(PermissionConstants.APPLICATION_READ, compare=CompareConstants.AND)
70-
@log(menu='Application', operate="Get application version details")
7169
def get(self, request: Request, application_id: str, work_flow_version_id: str):
7270
return result.success(
7371
ApplicationVersionSerializer.Operate(
@@ -86,7 +84,8 @@ def get(self, request: Request, application_id: str, work_flow_version_id: str):
8684
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.MANAGE,
8785
dynamic_tag=keywords.get('application_id'))],
8886
compare=CompareConstants.AND))
89-
@log(menu='Application', operate="Modify application version information")
87+
@log(menu='Application', operate="Modify application version information",
88+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
9089
def put(self, request: Request, application_id: str, work_flow_version_id: str):
9190
return result.success(
9291
ApplicationVersionSerializer.Operate(

apps/application/views/application_views.py

Lines changed: 27 additions & 33 deletions
Large diffs are not rendered by default.

apps/application/views/chat_views.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from application.serializers.chat_serializers import ChatSerializers, ChatRecordSerializer
2020
from application.swagger_api.chat_api import ChatApi, VoteApi, ChatRecordApi, ImproveApi, ChatRecordImproveApi, \
2121
ChatClientHistoryApi, OpenAIChatApi
22+
from application.views import get_application_operation_object
2223
from common.auth import TokenAuth, has_permissions, OpenAIKeyAuth
2324
from common.constants.authentication_type import AuthenticationType
2425
from common.constants.permission_constants import Permission, Group, Operate, \
@@ -178,7 +179,8 @@ class Operate(APIView):
178179
dynamic_tag=keywords.get('application_id'))],
179180
compare=CompareConstants.AND),
180181
compare=CompareConstants.AND)
181-
@log(menu='Application/Conversation Log', operate="Delete a conversation")
182+
@log(menu='Application/Conversation Log', operate="Delete a conversation",
183+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
182184
def delete(self, request: Request, application_id: str, chat_id: str):
183185
return result.success(
184186
ChatSerializers.Operate(
@@ -201,7 +203,6 @@ class ClientChatHistoryPage(APIView):
201203
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
202204
dynamic_tag=keywords.get('application_id'))])
203205
)
204-
@log(menu='Application/Conversation Log', operate="Get client conversation list by paging")
205206
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
206207
return result.success(ChatSerializers.ClientChatHistory(
207208
data={'client_id': request.auth.client_id, 'application_id': application_id}).page(
@@ -221,7 +222,8 @@ class Operate(APIView):
221222
dynamic_tag=keywords.get('application_id'))],
222223
compare=CompareConstants.AND),
223224
compare=CompareConstants.AND)
224-
@log(menu='Application/Conversation Log', operate="Client deletes conversation")
225+
@log(menu='Application/Conversation Log', operate="Client deletes conversation",
226+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
225227
def delete(self, request: Request, application_id: str, chat_id: str):
226228
return result.success(
227229
ChatSerializers.Operate(
@@ -239,7 +241,8 @@ def delete(self, request: Request, application_id: str, chat_id: str):
239241
dynamic_tag=keywords.get('application_id'))],
240242
compare=CompareConstants.AND),
241243
compare=CompareConstants.AND)
242-
@log(menu='Application/Conversation Log', operate="Client modifies dialogue summary")
244+
@log(menu='Application/Conversation Log', operate="Client modifies dialogue summary",
245+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
243246
def put(self, request: Request, application_id: str, chat_id: str):
244247
return result.success(
245248
ChatSerializers.Operate(
@@ -261,7 +264,6 @@ class Page(APIView):
261264
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
262265
dynamic_tag=keywords.get('application_id'))])
263266
)
264-
@log(menu='Application/Conversation Log', operate="Get the conversation list by page")
265267
def get(self, request: Request, application_id: str, current_page: int, page_size: int):
266268
return result.success(ChatSerializers.Query(
267269
data={**query_params_to_single_dict(request.query_params), 'application_id': application_id,
@@ -287,7 +289,6 @@ class Operate(APIView):
287289
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
288290
dynamic_tag=keywords.get('application_id'))])
289291
)
290-
@log(menu='Application/Conversation Log', operate="Get conversation record details")
291292
def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
292293
return result.success(ChatRecordSerializer.Operate(
293294
data={'application_id': application_id,
@@ -306,7 +307,6 @@ def get(self, request: Request, application_id: str, chat_id: str, chat_record_i
306307
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
307308
dynamic_tag=keywords.get('application_id'))])
308309
)
309-
@log(menu='Application/Conversation Log', operate="Get a list of conversation records")
310310
def get(self, request: Request, application_id: str, chat_id: str):
311311
return result.success(ChatRecordSerializer.Query(
312312
data={'application_id': application_id,
@@ -328,7 +328,6 @@ class Page(APIView):
328328
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
329329
dynamic_tag=keywords.get('application_id'))])
330330
)
331-
@log(menu='Application/Conversation Log', operate="Get the conversation history list by page")
332331
def get(self, request: Request, application_id: str, chat_id: str, current_page: int, page_size: int):
333332
return result.success(ChatRecordSerializer.Query(
334333
data={'application_id': application_id,
@@ -352,7 +351,8 @@ class Vote(APIView):
352351
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
353352
dynamic_tag=keywords.get('application_id'))])
354353
)
355-
@log(menu='Application/Conversation Log', operate="Like, Dislike")
354+
@log(menu='Application/Conversation Log', operate="Like, Dislike",
355+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
356356
def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
357357
return result.success(ChatRecordSerializer.Vote(
358358
data={'vote_status': request.data.get('vote_status'), 'chat_id': chat_id,
@@ -373,7 +373,6 @@ class ChatRecordImprove(APIView):
373373
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
374374
dynamic_tag=keywords.get('application_id'))]
375375
))
376-
@log(menu='Application/Conversation Log', operate="Get the list of marked paragraphs")
377376
def get(self, request: Request, application_id: str, chat_id: str, chat_record_id: str):
378377
return result.success(ChatRecordSerializer.ChatRecordImprove(
379378
data={'chat_id': chat_id, 'chat_record_id': chat_record_id}).get())
@@ -401,7 +400,8 @@ class Improve(APIView):
401400
'dataset_id'))],
402401
compare=CompareConstants.AND
403402
), compare=CompareConstants.AND)
404-
@log(menu='Application/Conversation Log', operate="Annotation")
403+
@log(menu='Application/Conversation Log', operate="Annotation",
404+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
405405
def put(self, request: Request, application_id: str, chat_id: str, chat_record_id: str, dataset_id: str,
406406
document_id: str):
407407
return result.success(ChatRecordSerializer.Improve(
@@ -427,7 +427,8 @@ def put(self, request: Request, application_id: str, chat_id: str, chat_record_i
427427
'dataset_id'))],
428428
compare=CompareConstants.AND
429429
), compare=CompareConstants.AND)
430-
@log(menu='Application/Conversation Log', operate="Add to Knowledge Base")
430+
@log(menu='Application/Conversation Log', operate="Add to Knowledge Base",
431+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
431432
def post(self, request: Request, application_id: str, dataset_id: str):
432433
return result.success(ChatRecordSerializer.PostImprove().post_improve(request.data))
433434

@@ -453,7 +454,8 @@ class Operate(APIView):
453454
'dataset_id'))],
454455
compare=CompareConstants.AND
455456
), compare=CompareConstants.AND)
456-
@log(menu='Application/Conversation Log', operate="Delete a Annotation")
457+
@log(menu='Application/Conversation Log', operate="Delete a Annotation",
458+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
457459
def delete(self, request: Request, application_id: str, chat_id: str, chat_record_id: str,
458460
dataset_id: str,
459461
document_id: str, paragraph_id: str):

apps/application/views/common.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎
5+
@file: common.py
6+
@date:2025/3/25 16:56
7+
@desc:
8+
"""
9+
10+
from django.db.models import QuerySet
11+
12+
from application.models import Application
13+
14+
15+
def get_application_operation_object(application_id):
16+
application_model = QuerySet(model=Application).filter(id=application_id).first()
17+
if application_model is not None:
18+
return {
19+
"name": application_model.name
20+
}
21+
return {}

apps/common/log/log.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,28 @@ def _get_details(request):
5757
}
5858

5959

60-
def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details):
60+
def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details,
61+
get_operation_object=None):
6162
"""
6263
记录审计日志
6364
@param menu: 操作菜单 str
6465
@param operate: 操作 str|func 如果是一个函数 入参将是一个request 响应为str def operate(request): return "操作菜单"
6566
@param get_user: 获取用户
6667
@param get_ip_address:获取IP地址
6768
@param get_details: 获取执行详情
69+
@param get_operation_object: 获取操作对象
6870
@return:
6971
"""
7072

7173
def inner(func):
7274
def run(view, request, **kwargs):
7375
status = 200
76+
operation_object = {}
77+
try:
78+
if get_operation_object is not None:
79+
operation_object = get_operation_object(request, kwargs)
80+
except Exception as e:
81+
pass
7482
try:
7583
return func(view, request, **kwargs)
7684
except Exception as e:
@@ -84,7 +92,8 @@ def run(view, request, **kwargs):
8492
if callable(operate):
8593
_operate = operate(request)
8694
# 插入审计日志
87-
Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details).save()
95+
Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details,
96+
operation_object=operation_object).save()
8897

8998
return run
9099

apps/dataset/views/common.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎
5+
@file: common.py.py
6+
@date:2025/3/25 15:43
7+
@desc:
8+
"""
9+
from django.db.models import QuerySet
10+
11+
from dataset.models import DataSet, Document
12+
13+
14+
def get_dataset_operation_object(dataset_id: str):
15+
dataset_model = QuerySet(model=DataSet).filter(id=dataset_id).first()
16+
if dataset_model is not None:
17+
return {
18+
"name": dataset_model.name,
19+
"desc": dataset_model.desc,
20+
"type": dataset_model.type,
21+
"create_time": dataset_model.create_time,
22+
"update_time": dataset_model.update_time
23+
}
24+
return {}
25+
26+
27+
def get_document_operation_object(document_id: str):
28+
document_model = QuerySet(model=Document).filter(id=document_id).first()
29+
if document_model is not None:
30+
return {
31+
"name": document_model.name,
32+
"type": document_model.type,
33+
}
34+
return {}
35+
36+
37+
def get_document_operation_object_batch(document_id_list: str):
38+
document_model_list = QuerySet(model=Document).filter(id__in=document_id_list)
39+
if document_model_list is not None:
40+
return {
41+
"name": f'[{",".join([document_model.name for document_model in document_model_list])}]',
42+
'document_list': [{'name': document_model.name, 'type': document_model.type} for document_model in
43+
document_model_list]
44+
}
45+
return {}
46+
47+
48+
def get_dataset_document_operation_object(dataset_dict: dict, document_dict: dict):
49+
return {
50+
'name': f'{dataset_dict.get("name", "")}/{document_dict.get("name", "")}',
51+
'dataset_name': dataset_dict.get("name", ""),
52+
'dataset_desc': dataset_dict.get("desc", ""),
53+
'dataset_type': dataset_dict.get("type", ""),
54+
'document_name': document_dict.get("name", ""),
55+
'document_type': document_dict.get("type", ""),
56+
}

0 commit comments

Comments
 (0)