Skip to content

Commit e4293df

Browse files
committed
feat: System operate log
1 parent 09dfeda commit e4293df

File tree

19 files changed

+474
-2
lines changed

19 files changed

+474
-2
lines changed

apps/application/views/application.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@date:2025/5/26 16:51
77
@desc:
88
"""
9+
from django.db.models import QuerySet
910
from django.utils.translation import gettext_lazy as _
1011
from drf_spectacular.utils import extend_schema
1112
from rest_framework.parsers import MultiPartParser
@@ -14,11 +15,22 @@
1415

1516
from application.api.application_api import ApplicationCreateAPI, ApplicationQueryAPI, ApplicationImportAPI, \
1617
ApplicationExportAPI, ApplicationOperateAPI, ApplicationEditAPI
18+
from application.models import Application
1719
from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer
1820
from common import result
1921
from common.auth import TokenAuth
2022
from common.auth.authentication import has_permissions
2123
from common.constants.permission_constants import PermissionConstants
24+
from common.log.log import log
25+
26+
27+
def get_application_operation_object(application_id):
28+
application_model = QuerySet(model=Application).filter(id=application_id).first()
29+
if application_model is not None:
30+
return{
31+
'name': application_model.name
32+
}
33+
return {}
2234

2335

2436
class Application(APIView):
@@ -35,6 +47,8 @@ class Application(APIView):
3547
tags=[_('Application')] # type: ignore
3648
)
3749
@has_permissions(PermissionConstants.APPLICATION_READ.get_workspace_permission())
50+
@log(menu='Application', operate='Create an application',
51+
get_operation_object=lambda r,k: {'name': r.data.get('name')})
3852
def post(self, request: Request, workspace_id: str):
3953
return result.success(
4054
ApplicationSerializer(data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data))
@@ -85,11 +99,14 @@ class Import(APIView):
8599
tags=[_('Application')] # type: ignore
86100
)
87101
@has_permissions(PermissionConstants.APPLICATION_READ)
102+
@log(menu='Application', operate="Import Application")
88103
def post(self, request: Request, workspace_id: str):
89104
return result.success(ApplicationSerializer(
90105
data={'user_id': request.user.id, 'workspace_id': workspace_id,
91106
}).import_({'file': request.FILES.get('file')}))
92107

108+
109+
93110
class Export(APIView):
94111
authentication_classes = [TokenAuth]
95112

@@ -104,6 +121,8 @@ class Export(APIView):
104121
tags=[_('Application')] # type: ignore
105122
)
106123
@has_permissions(PermissionConstants.APPLICATION_EXPORT.get_workspace_application_permission())
124+
@log(menu='Application', operate="Export Application",
125+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
107126
def post(self, request: Request, workspace_id: str, application_id: str):
108127
return ApplicationOperateSerializer(
109128
data={'application_id': application_id,
@@ -122,6 +141,9 @@ class Operate(APIView):
122141
tags=[_('Application')] # type: ignore
123142
)
124143
@has_permissions(PermissionConstants.APPLICATION_DELETE.get_workspace_application_permission())
144+
@log(menu='Application', operate='Deleting application',
145+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id'))
146+
)
125147
def delete(self, request: Request, workspace_id: str, application_id: str):
126148
return result.success(ApplicationOperateSerializer(
127149
data={'application_id': application_id, 'user_id': request.user.id}).delete(
@@ -138,6 +160,8 @@ def delete(self, request: Request, workspace_id: str, application_id: str):
138160
tags=[_('Application')] # type: ignore
139161
)
140162
@has_permissions(PermissionConstants.APPLICATION_EDIT.get_workspace_application_permission())
163+
@log(menu='Application', operate="Modify the application",
164+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
141165
def put(self, request: Request, workspace_id: str, application_id: str):
142166
return result.success(
143167
ApplicationOperateSerializer(
@@ -172,6 +196,9 @@ class Publish(APIView):
172196
responses=result.DefaultResultSerializer,
173197
tags=[_('Application')] # type: ignore
174198
)
199+
@log(menu='Application', operate='Publishing an application',
200+
get_operation_object=lambda r,k: get_application_operation_object(k.get('application_id'))
201+
)
175202
def put(self, request: Request, application_id: str):
176203
return result.success(
177204
ApplicationOperateSerializer(

apps/application/views/application_api_key.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
1+
from django.db.models import QuerySet
12
from drf_spectacular.utils import extend_schema
23
from rest_framework.request import Request
34
from rest_framework.views import APIView
45
from django.utils.translation import gettext_lazy as _
56

67
from application.api.application_api_key import ApplicationKeyCreateAPI
8+
from application.models import ApplicationApiKey
79
from application.serializers.application_api_key import ApplicationKeySerializer
810
from common.auth import TokenAuth
11+
from common.log.log import log
912
from common.result import result, success
1013

1114

15+
def get_application_operation_object(application_api_key_id):
16+
application_api_key_model = QuerySet(model=ApplicationApiKey).filter(id=application_api_key_id).first()
17+
if application_api_key_model is not None:
18+
return {
19+
"name": application_api_key_model.name
20+
}
21+
return {}
22+
23+
1224
class ApplicationKey(APIView):
1325
authentication_classes = [TokenAuth]
1426

@@ -20,6 +32,8 @@ class ApplicationKey(APIView):
2032
parameters=ApplicationKeyCreateAPI.get_parameters(),
2133
tags=[_('Application Api Key')] # type: ignore
2234
)
35+
@log(menu='Application', operate="Add ApiKey",
36+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_api_key_id')))
2337
def post(self,request: Request, application_id: str, workspace_id: str):
2438
return result.success(ApplicationKeySerializer(
2539
data={'application_id': application_id, 'user_id': request.user.id,

apps/application/views/application_version.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
from application.api.application_version import ApplicationVersionListAPI, ApplicationVersionPageAPI, \
1515
ApplicationVersionAPI, ApplicationVersionOperateAPI
1616
from application.serializers.application_version import ApplicationVersionSerializer
17+
from application.views import get_application_operation_object
1718
from common import result
1819
from common.auth import TokenAuth
1920
from common.auth.authentication import has_permissions
2021
from common.constants.permission_constants import PermissionConstants
22+
from common.log.log import log
2123

2224

2325
class ApplicationVersionView(APIView):
@@ -88,6 +90,8 @@ def get(self, request: Request, workspace_id: str, application_id: str, work_flo
8890
responses=ApplicationVersionOperateAPI.get_response(),
8991
tags=[_('Application/Version')] # type: ignore
9092
)
93+
@log(menu='Application', operate="Modify application version information",
94+
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')))
9195
def put(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str):
9296
return result.success(
9397
ApplicationVersionSerializer.Operate(

apps/folders/views/folder.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.db.models import QuerySet
12
from django.utils.translation import gettext_lazy as _
23
from drf_spectacular.utils import extend_schema
34
from rest_framework.request import Request
@@ -6,11 +7,29 @@
67
from common.auth import TokenAuth
78
from common.auth.authentication import has_permissions
89
from common.constants.permission_constants import Permission, Group, Operate
10+
from common.log.log import log
911
from common.result import result
1012
from folders.api.folder import FolderCreateAPI, FolderEditAPI, FolderReadAPI, FolderTreeReadAPI, FolderDeleteAPI
13+
from folders.models.folder import FolderCreateRequest, FolderEditRequest
1114
from folders.serializers.folder import FolderSerializer, FolderTreeSerializer
1215

1316

17+
def get_folder_create_operation_object(folder_name):
18+
folder_model = QuerySet(model=FolderCreateRequest).filter(name=folder_name).first()
19+
if folder_model is not None:
20+
return {
21+
'name': folder_model.name
22+
}
23+
return {}
24+
25+
def get_folder_edit_operation_object(folder_name):
26+
folder_model = QuerySet(model=FolderEditRequest).filter(name=folder_name).first()
27+
if folder_model is not None:
28+
return {
29+
'name': folder_model.name
30+
}
31+
return {}
32+
1433
class FolderView(APIView):
1534
authentication_classes = [TokenAuth]
1635

@@ -26,6 +45,9 @@ class FolderView(APIView):
2645
)
2746
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.CREATE,
2847
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
48+
@log(menu='folder', operate='Create folder',
49+
get_operation_object=lambda r,k: get_folder_create_operation_object(k.get('folder_name'))
50+
)
2951
def post(self, request: Request, workspace_id: str, source: str):
3052
return result.success(FolderSerializer.Create(
3153
data={'user_id': request.user.id,
@@ -64,6 +86,9 @@ class Operate(APIView):
6486
)
6587
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.EDIT,
6688
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
89+
@log(menu='folder', operate='Edit folder',
90+
get_operation_object=lambda r, k: get_folder_edit_operation_object(k.get('folder_name'))
91+
)
6792
def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
6893
return result.success(FolderSerializer.Operate(
6994
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}
@@ -96,6 +121,7 @@ def get(self, request: Request, workspace_id: str, source: str, folder_id: str):
96121
)
97122
@has_permissions(lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.DELETE,
98123
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"))
124+
@log(menu='folder', operate='Delete folder')
99125
def delete(self, request: Request, workspace_id: str, source: str, folder_id: str):
100126
return result.success(FolderSerializer.Operate(
101127
data={'id': folder_id, 'workspace_id': workspace_id, 'source': source}

apps/knowledge/serializers/common.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,17 @@ def or_get(exists_problem_list, content, knowledge_id, document_id, paragraph_id
221221
problem = Problem(id=uuid.uuid7(), content=content, knowledge_id=knowledge_id)
222222
problem_content_dict[content] = problem, True
223223
return problem, document_id, paragraph_id
224+
225+
226+
227+
def get_knowledge_operation_object(knowledge_id: str):
228+
knowledge_model = QuerySet(model=Knowledge).filter(id=knowledge_id).first()
229+
if knowledge_model is not None:
230+
return {
231+
"name": knowledge_model.name,
232+
"desc": knowledge_model.desc,
233+
"type": knowledge_model.type,
234+
"create_time": knowledge_model.create_time,
235+
"update_time": knowledge_model.update_time
236+
}
237+
return {}

apps/knowledge/views/common.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from django.db.models import QuerySet
2+
3+
from knowledge.models import Document
4+
5+
6+
7+
def get_document_operation_object(document_id: str):
8+
document_model = QuerySet(model=Document).filter(id=document_id).first()
9+
if document_model is not None:
10+
return {
11+
"name": document_model.name,
12+
"type": document_model.type,
13+
}
14+
return {}
15+
16+
def get_document_operation_object_batch(document_id_list: str):
17+
document_model_list = QuerySet(model=Document).filter(id__in=document_id_list)
18+
if document_model_list is not None:
19+
return {
20+
"name": f'[{",".join([document_model.name for document_model in document_model_list])}]',
21+
'document_list': [{'name': document_model.name, 'type': document_model.type} for document_model in
22+
document_model_list]
23+
}
24+
return {}
25+
26+
27+
def get_knowledge_document_operation_object(knowledge_dict: dict, document_dict: dict):
28+
return {
29+
'name': f'{knowledge_dict.get("name", "")}/{document_dict.get("name", "")}',
30+
'dataset_name': knowledge_dict.get("name", ""),
31+
'dataset_desc': knowledge_dict.get("desc", ""),
32+
'dataset_type': knowledge_dict.get("type", ""),
33+
'document_name': document_dict.get("name", ""),
34+
'document_type': document_dict.get("type", ""),
35+
}

0 commit comments

Comments
 (0)