Skip to content

Commit f773792

Browse files
committed
refactor: log add workspace_id
1 parent 60b3bcd commit f773792

File tree

15 files changed

+200
-65
lines changed

15 files changed

+200
-65
lines changed

apps/application/views/application.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class ApplicationAPI(APIView):
5050
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
5151
@log(menu='Application', operate='Create an application',
5252
get_operation_object=lambda r, k: {'name': r.data.get('name')},
53-
workspace_id=lambda r, k: k.get('workspace_id'))
53+
)
5454
def post(self, request: Request, workspace_id: str):
5555
return result.success(
5656
ApplicationSerializer(data={'workspace_id': workspace_id, 'user_id': request.user.id}).insert(request.data))
@@ -103,7 +103,7 @@ class Import(APIView):
103103
tags=[_('Application')] # type: ignore
104104
)
105105
@has_permissions(PermissionConstants.APPLICATION_READ, RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
106-
@log(menu='Application', operate="Import Application", workspace_id=lambda r, k: k.get('workspace_id'))
106+
@log(menu='Application', operate="Import Application", )
107107
def post(self, request: Request, workspace_id: str):
108108
return result.success(ApplicationSerializer(
109109
data={'user_id': request.user.id, 'workspace_id': workspace_id,
@@ -126,7 +126,7 @@ class Export(APIView):
126126
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
127127
@log(menu='Application', operate="Export Application",
128128
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
129-
workspace_id=lambda r, k: k.get('workspace_id'))
129+
)
130130
def post(self, request: Request, workspace_id: str, application_id: str):
131131
return ApplicationOperateSerializer(
132132
data={'application_id': application_id,
@@ -148,7 +148,7 @@ class Operate(APIView):
148148
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
149149
@log(menu='Application', operate='Deleting application',
150150
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
151-
workspace_id=lambda r, k: k.get('workspace_id')
151+
152152
)
153153
def delete(self, request: Request, workspace_id: str, application_id: str):
154154
return result.success(ApplicationOperateSerializer(
@@ -169,7 +169,7 @@ def delete(self, request: Request, workspace_id: str, application_id: str):
169169
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
170170
@log(menu='Application', operate="Modify the application",
171171
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
172-
workspace_id=lambda r, k: k.get('workspace_id'))
172+
)
173173
def put(self, request: Request, workspace_id: str, application_id: str):
174174
return result.success(
175175
ApplicationOperateSerializer(
@@ -207,7 +207,7 @@ class Publish(APIView):
207207
)
208208
@log(menu='Application', operate='Publishing an application',
209209
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
210-
workspace_id=lambda r, k: k.get('workspace_id')
210+
211211
)
212212
def put(self, request: Request, workspace_id: str, application_id: str):
213213
return result.success(

apps/application/views/application_api_key.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class ApplicationKey(APIView):
3838
)
3939
@log(menu='Application', operate="Add ApiKey",
4040
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
41-
workspace_id=lambda r, k: k.get('workspace_id'))
41+
)
4242
@has_permissions(PermissionConstants.APPLICATION_OVERVIEW_API_KEY.get_workspace_application_permission(),
4343
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
4444
)
@@ -80,7 +80,7 @@ class Operate(APIView):
8080
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
8181
@log(menu='Application', operate="Modify application API_KEY",
8282
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
83-
workspace_id=lambda r, k: k.get('workspace_id'))
83+
)
8484
def put(self, request: Request, workspace_id: str, application_id: str, api_key_id: str):
8585
return result.success(
8686
ApplicationKeySerializer.Operate(
@@ -102,7 +102,7 @@ def put(self, request: Request, workspace_id: str, application_id: str, api_key_
102102
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
103103
@log(menu='Application', operate="Delete application API_KEY",
104104
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
105-
workspace_id=lambda r, k: k.get('workspace_id'))
105+
)
106106
def delete(self, request: Request, workspace_id: str, application_id: str, api_key_id: str):
107107
return result.success(
108108
ApplicationKeySerializer.Operate(

apps/application/views/application_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def get(self, request: Request, workspace_id: str, application_id: str, work_flo
9797
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
9898
@log(menu='Application', operate="Modify application version information",
9999
get_operation_object=lambda r, k: get_application_operation_object(k.get('application_id')),
100-
workspace_id=lambda r, k: k.get('workspace_id'))
100+
)
101101
def put(self, request: Request, workspace_id: str, application_id: str, work_flow_version_id: str):
102102
return result.success(
103103
ApplicationVersionSerializer.Operate(

apps/common/job/__init__.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# coding=utf-8
2+
"""
3+
@project: maxkb
4+
@Author:虎
5+
@file: __init__.py
6+
@date:2024/3/14 11:54
7+
@desc:
8+
"""
9+
#from .client_access_num_job import *
10+
from .clean_chat_job import *
11+
from .clean_debug_file_job import *
12+
13+
14+
def run():
15+
#client_access_num_job.run()
16+
clean_chat_job.run()
17+
clean_debug_file_job.run()

apps/common/job/clean_chat_job.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# coding=utf-8
2+
3+
import logging
4+
import datetime
5+
6+
from django.db import transaction
7+
from django.utils import timezone
8+
from apscheduler.schedulers.background import BackgroundScheduler
9+
from django_apscheduler.jobstores import DjangoJobStore
10+
from application.models import Application, Chat, ChatRecord
11+
from django.db.models import Q, Max
12+
from common.lock.impl.file_lock import FileLock
13+
14+
from knowledge.models import File
15+
16+
scheduler = BackgroundScheduler()
17+
scheduler.add_jobstore(DjangoJobStore(), "default")
18+
lock = FileLock()
19+
20+
21+
def clean_chat_log_job():
22+
from django.utils.translation import gettext_lazy as _
23+
logging.getLogger("max_kb").info(_('start clean chat log'))
24+
now = timezone.now()
25+
26+
applications = Application.objects.all().values('id', 'clean_time')
27+
cutoff_dates = {
28+
app['id']: now - datetime.timedelta(days=app['clean_time'] or 180)
29+
for app in applications
30+
}
31+
32+
query_conditions = Q()
33+
for app_id, cutoff_date in cutoff_dates.items():
34+
query_conditions |= Q(chat__application_id=app_id, create_time__lt=cutoff_date)
35+
batch_size = 500
36+
while True:
37+
with transaction.atomic():
38+
chat_records = ChatRecord.objects.filter(query_conditions).select_related('chat').only('id', 'chat_id',
39+
'create_time')[
40+
:batch_size]
41+
if not chat_records:
42+
break
43+
chat_record_ids = [record.id for record in chat_records]
44+
chat_ids = {record.chat_id for record in chat_records}
45+
46+
# 计算每个 chat_id 的最大 create_time
47+
max_create_times = ChatRecord.objects.filter(id__in=chat_record_ids).values('chat_id').annotate(
48+
max_create_time=Max('create_time'))
49+
50+
# 收集需要删除的文件
51+
files_to_delete = []
52+
for record in chat_records:
53+
max_create_time = next(
54+
(item['max_create_time'] for item in max_create_times if item['chat_id'] == record.chat_id), None)
55+
if max_create_time:
56+
files_to_delete.extend(
57+
File.objects.filter(meta__chat_id=str(record.chat_id), create_time__lt=max_create_time)
58+
)
59+
# 删除 ChatRecord
60+
deleted_count = ChatRecord.objects.filter(id__in=chat_record_ids).delete()[0]
61+
62+
# 删除没有关联 ChatRecord 的 Chat
63+
Chat.objects.filter(chatrecord__isnull=True, id__in=chat_ids).delete()
64+
File.objects.filter(loid__in=[file.loid for file in files_to_delete]).delete()
65+
66+
if deleted_count < batch_size:
67+
break
68+
69+
logging.getLogger("max_kb").info(_('end clean chat log'))
70+
71+
72+
def run():
73+
if lock.try_lock('clean_chat_log_job', 30 * 30):
74+
try:
75+
scheduler.start()
76+
existing_job = scheduler.get_job(job_id='clean_chat_log')
77+
if existing_job is not None:
78+
existing_job.remove()
79+
scheduler.add_job(clean_chat_log_job, 'cron', hour='0', minute='5', id='clean_chat_log')
80+
finally:
81+
lock.un_lock('clean_chat_log_job')
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# coding=utf-8
2+
3+
import logging
4+
from datetime import timedelta
5+
6+
from apscheduler.schedulers.background import BackgroundScheduler
7+
from django.db.models import Q
8+
from django.utils import timezone
9+
from django_apscheduler.jobstores import DjangoJobStore
10+
11+
from common.lock.impl.file_lock import FileLock
12+
from knowledge.models import File
13+
14+
scheduler = BackgroundScheduler()
15+
scheduler.add_jobstore(DjangoJobStore(), "default")
16+
lock = FileLock()
17+
18+
19+
def clean_debug_file():
20+
from django.utils.translation import gettext_lazy as _
21+
logging.getLogger("max_kb").info(_('start clean debug file'))
22+
two_hours_ago = timezone.now() - timedelta(hours=2)
23+
# 删除对应的文件
24+
File.objects.filter(Q(create_time__lt=two_hours_ago) & Q(meta__debug=True)).delete()
25+
logging.getLogger("max_kb").info(_('end clean debug file'))
26+
27+
28+
def run():
29+
if lock.try_lock('clean_debug_file', 30 * 30):
30+
try:
31+
scheduler.start()
32+
clean_debug_file_job = scheduler.get_job(job_id='clean_debug_file')
33+
if clean_debug_file_job is not None:
34+
clean_debug_file_job.remove()
35+
scheduler.add_job(clean_debug_file, 'cron', hour='2', minute='0', second='0', id='clean_debug_file')
36+
finally:
37+
lock.un_lock('clean_debug_file')

apps/common/log/log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def _get_details(request):
5757

5858

5959
def _get_workspace_id(request, kwargs):
60-
return kwargs.get('workspace_id', None)
60+
return kwargs.get('workspace_id', 'None')
6161

6262

6363
def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details,

apps/folders/views/folder.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class FolderView(APIView):
4444
@log(
4545
menu='folder', operate='Create folder',
4646
get_operation_object=lambda r, k: {'name': r.data.get('name')},
47-
workspace_id=lambda r, k: k.get('workspace_id')
47+
4848
)
4949
def post(self, request: Request, workspace_id: str, source: str):
5050
return result.success(FolderSerializer.Create(
@@ -93,7 +93,7 @@ class Operate(APIView):
9393
@log(
9494
menu='folder', operate='Edit folder',
9595
get_operation_object=lambda r, k: get_folder_operation_object(k.get('folder_id'), k.get('source')),
96-
workspace_id=lambda r, k: k.get('workspace_id')
96+
9797
)
9898
def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
9999
return result.success(FolderSerializer.Operate(
@@ -136,7 +136,7 @@ def get(self, request: Request, workspace_id: str, source: str, folder_id: str):
136136
@log(
137137
menu='folder', operate='Delete folder',
138138
get_operation_object=lambda r, k: get_folder_operation_object(k.get('folder_id'), k.get('source')),
139-
workspace_id=lambda r, k: k.get('workspace_id')
139+
140140
)
141141
def delete(self, request: Request, workspace_id: str, source: str, folder_id: str):
142142
return result.success(FolderSerializer.Operate(

0 commit comments

Comments
 (0)