Skip to content

Commit 2221eef

Browse files
committed
feat: integrate ResourceMappingSerializer for resource count retrieval across multiple modules
1 parent 8295e70 commit 2221eef

5 files changed

Lines changed: 78 additions & 19 deletions

File tree

‎apps/application/serializers/application.py‎

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
from models_provider.models import Model
5050
from models_provider.tools import get_model_instance_by_model_workspace_id
5151
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
52+
from system_manage.models.resource_mapping import ResourceMapping
53+
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
5254
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
5355
from tools.models import Tool, ToolScope
5456
from tools.serializers.tool import ToolExportModelSerializer
@@ -411,12 +413,15 @@ def page(self, current_page: int, page_size: int, instance: Dict):
411413
user_id = self.data.get("user_id")
412414
workspace_manage = is_workspace_manage(user_id, workspace_id)
413415
is_x_pack_ee = self.is_x_pack_ee()
414-
return native_page_search(current_page, page_size, self.get_query_set(instance, workspace_manage, is_x_pack_ee),
415-
get_file_content(
416-
os.path.join(PROJECT_DIR, "apps", "application", 'sql',
417-
'list_application.sql' if workspace_manage else (
418-
'list_application_user_ee.sql' if is_x_pack_ee else 'list_application_user.sql'))),
419-
)
416+
result = native_page_search(current_page, page_size,
417+
self.get_query_set(instance, workspace_manage, is_x_pack_ee),
418+
get_file_content(
419+
os.path.join(PROJECT_DIR, "apps", "application", 'sql',
420+
'list_application.sql' if workspace_manage else (
421+
'list_application_user_ee.sql' if is_x_pack_ee else 'list_application_user.sql'))),
422+
)
423+
424+
return ResourceMappingSerializer().get_resource_count(result)
420425

421426

422427
class ApplicationImportRequest(serializers.Serializer):
@@ -778,9 +783,13 @@ def get_mcp_servers(self, instance, with_valid=True):
778783
def delete(self, with_valid=True):
779784
if with_valid:
780785
self.is_valid()
781-
QuerySet(ApplicationVersion).filter(application_id=self.data.get('application_id')).delete()
782-
QuerySet(ApplicationKnowledgeMapping).filter(application_id=self.data.get('application_id')).delete()
783-
QuerySet(Application).filter(id=self.data.get('application_id')).delete()
786+
application_id = self.data.get('application_id')
787+
QuerySet(ApplicationVersion).filter(application_id=application_id).delete()
788+
QuerySet(ApplicationKnowledgeMapping).filter(application_id=application_id).delete()
789+
QuerySet(ResourceMapping).filter(
790+
Q(target_id=application_id) | Q(source_id=application_id)
791+
).delete()
792+
QuerySet(Application).filter(id=application_id).delete()
784793
return True
785794

786795
def export(self, with_valid=True):

‎apps/knowledge/serializers/knowledge.py‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
from maxkb.conf import PROJECT_DIR
4747
from models_provider.models import Model
4848
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
49+
from system_manage.models.resource_mapping import ResourceMapping
50+
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
4951
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
5052
from users.serializers.user import is_workspace_manage
5153

@@ -186,7 +188,7 @@ def page(self, current_page: int, page_size: int):
186188
raise serializers.ValidationError(_('Folder not found'))
187189
workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id'))
188190
is_x_pack_ee = self.is_x_pack_ee()
189-
return native_page_search(
191+
result = native_page_search(
190192
current_page,
191193
page_size,
192194
self.get_query_set(workspace_manage, is_x_pack_ee),
@@ -202,6 +204,7 @@ def page(self, current_page: int, page_size: int):
202204
),
203205
post_records_handler=lambda r: r
204206
)
207+
return ResourceMappingSerializer().get_resource_count(result)
205208

206209
def list(self):
207210
self.is_valid(raise_exception=True)
@@ -435,6 +438,9 @@ def delete(self):
435438
File.objects.filter(
436439
source_id=knowledge.id,
437440
).delete()
441+
QuerySet(ResourceMapping).filter(
442+
Q(target_id=knowledge) | Q(source_id=knowledge)
443+
).delete()
438444
delete_embedding_by_knowledge(self.data.get('knowledge_id'))
439445
return True
440446

‎apps/models_provider/serializers/model_serializer.py‎

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
from models_provider.models import Model, Status
2727
from models_provider.tools import get_model_credential
2828
from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType
29+
from system_manage.models.resource_mapping import ResourceMapping
30+
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
2931
from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer
3032
from users.serializers.user import is_workspace_manage
3133

@@ -190,6 +192,7 @@ def delete(self, with_valid=True):
190192
# if dataset_count > 0:
191193
# raise AppApiException(500, f"该模型关联了{dataset_count} 个应用,无法删除该模型。")
192194
model.delete()
195+
ResourceMapping.objects.filter(target_id=model_id).delete()
193196
return True
194197

195198
def edit(self, instance: Dict, user_id: str, with_valid=True):
@@ -366,23 +369,25 @@ def list(self, workspace_id, with_valid):
366369
workspace_manage = is_workspace_manage(user_id, workspace_id)
367370
query_params = self._build_query_params(workspace_id, workspace_manage, user_id)
368371
is_x_pack_ee = self.is_x_pack_ee()
369-
return native_search(query_params,
370-
select_string=get_file_content(
371-
os.path.join(PROJECT_DIR, "apps", "models_provider", 'sql',
372-
'list_model.sql' if workspace_manage else (
373-
'list_model_user_ee.sql' if is_x_pack_ee else 'list_model_user.sql')
374-
)))
372+
result = native_search(query_params,
373+
select_string=get_file_content(
374+
os.path.join(PROJECT_DIR, "apps", "models_provider", 'sql',
375+
'list_model.sql' if workspace_manage else (
376+
'list_model_user_ee.sql' if is_x_pack_ee else 'list_model_user.sql')
377+
)))
378+
return ResourceMappingSerializer().get_resource_count(result)
375379

376380
def share_list(self, workspace_id, with_valid=True):
377381
if with_valid:
378382
self.is_valid(raise_exception=True)
379383
user_id = self.data.get("user_id")
380384
query_params = self._build_query_params(workspace_id, False, user_id)
381-
return [
385+
result = [
382386
self._build_model_data(
383387
model
384388
) for model in query_params.get('model_query_set')
385389
]
390+
return ResourceMappingSerializer().get_resource_count(result)
386391

387392
def model_list(self, workspace_id, with_valid=True):
388393
if with_valid:

‎apps/system_manage/serializers/resource_mapping_serializers.py‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
from rest_framework import serializers
1515

1616
from common.db.search import native_page_search, get_dynamics_model
17+
from common.result import Page
1718
from common.utils.common import get_file_content
1819
from maxkb.conf import PROJECT_DIR
20+
from system_manage.models.resource_mapping import ResourceMapping
1921

2022

2123
class ResourceMappingSerializer(serializers.Serializer):
@@ -51,3 +53,37 @@ def page(self, current_page, page_size):
5153
return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
5254
os.path.join(PROJECT_DIR, "apps", "system_manage",
5355
'sql', 'list_resource_mapping.sql')), with_table_name=False)
56+
57+
def get_resource_count(self, result_list):
58+
"""
59+
获取资源映射计数
60+
"""
61+
if not result_list:
62+
return result_list
63+
is_paginated = isinstance(result_list, Page)
64+
65+
data_to_process = result_list.get('records') if is_paginated else result_list
66+
67+
if isinstance(data_to_process, list) and data_to_process:
68+
# 提取ID列表,确保每个项目都是字典且包含'id'键
69+
ids = [item['id'] for item in data_to_process
70+
if isinstance(item, dict) and 'id' in item and item['id']]
71+
72+
if ids: # 只有在ids非空时才执行查询
73+
mapping_counts = ResourceMapping.objects.filter(
74+
target_id__in=ids
75+
).values('target_id').annotate(
76+
count=models.Count('id')
77+
)
78+
79+
# 构建目标ID到计数的映射
80+
count_dict = {str(item['target_id']): item['count'] for item in mapping_counts}
81+
82+
# 为每个结果项添加资源计数
83+
for model in data_to_process:
84+
if isinstance(model, dict) and 'id' in model:
85+
model_id = str(model['id'])
86+
model['resource_count'] = count_dict.get(model_id, 0)
87+
88+
return result_list
89+

‎apps/tools/serializers/tool.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
from common.utils.logger import maxkb_logger
3232
from common.utils.rsa_util import rsa_long_decrypt, rsa_long_encrypt
3333
from common.utils.tool_code import ToolExecutor
34+
from system_manage.models.resource_mapping import ResourceMapping
35+
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
3436
from knowledge.models import File, FileSourceType
3537
from maxkb.const import CONFIG, PROJECT_DIR
3638
from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission
@@ -523,6 +525,7 @@ def delete(self):
523525
QuerySet(File).filter(id=tool.icon.split('/')[-1]).delete()
524526
QuerySet(WorkspaceUserResourcePermission).filter(target=tool.id).delete()
525527
QuerySet(Tool).filter(id=self.data.get('id')).delete()
528+
ResourceMapping.objects.filter(target_id=self.data.get('id')).delete()
526529

527530
def one(self):
528531
self.is_one_valid(raise_exception=True)
@@ -964,8 +967,7 @@ def page_tool_with_folders(self, current_page: int, page_size: int):
964967

965968
workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id'))
966969
is_x_pack_ee = self.is_x_pack_ee()
967-
968-
return native_page_search(
970+
result = native_page_search(
969971
current_page, page_size, self.get_query_set(workspace_manage, is_x_pack_ee),
970972
get_file_content(
971973
os.path.join(
@@ -982,6 +984,7 @@ def page_tool_with_folders(self, current_page: int, page_size: int):
982984
'init_field_list': json.loads(record.get('init_field_list', '[]')),
983985
},
984986
)
987+
return ResourceMappingSerializer().get_resource_count(result)
985988

986989
def get_tools(self):
987990
self.is_valid(raise_exception=True)

0 commit comments

Comments
 (0)