Skip to content

Commit aa593f3

Browse files
committed
feat: refactor user_id handling and enhance tool query logic
1 parent a8a19f3 commit aa593f3

File tree

6 files changed

+130
-67
lines changed

6 files changed

+130
-67
lines changed

apps/knowledge/api/knowledge.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,6 @@ def get_parameters():
185185
location='query',
186186
required=True,
187187
),
188-
OpenApiParameter(
189-
name="user_id",
190-
description="用户id",
191-
type=OpenApiTypes.STR,
192-
location='query',
193-
required=False,
194-
),
195188
OpenApiParameter(
196189
name="name",
197190
description="名称",

apps/knowledge/serializers/knowledge.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from knowledge.serializers.common import ProblemParagraphManage, get_embedding_model_id_by_knowledge_id, MetaSerializer, \
2929
GenerateRelatedSerializer, get_embedding_model_by_knowledge_id, list_paragraph
3030
from knowledge.serializers.document import DocumentSerializers
31-
from knowledge.serializers.knowledge_folder import KnowledgeFolderFlatSerializer
3231
from knowledge.task.embedding import embedding_by_knowledge, delete_embedding_by_knowledge
3332
from knowledge.task.generate import generate_related_by_knowledge_id
3433
from knowledge.task.sync import sync_web_knowledge, sync_replace_web_knowledge
@@ -117,23 +116,30 @@ def get_query_set(self):
117116
'temp.folder_id': models.CharField(),
118117
'temp.id': models.CharField()
119118
}))
119+
folder_query_set = QuerySet(KnowledgeFolder)
120+
120121
if "desc" in self.data and self.data.get('desc') is not None:
121122
query_set = query_set.filter(**{'temp.desc__icontains': self.data.get("desc")})
123+
folder_query_set = folder_query_set.filter(**{'desc__icontains': self.data.get("desc")})
122124
if "name" in self.data and self.data.get('name') is not None:
123125
query_set = query_set.filter(**{'temp.name__icontains': self.data.get("name")})
126+
folder_query_set = folder_query_set.filter(**{'name__icontains': self.data.get("name")})
124127
if "user_id" in self.data and self.data.get('user_id') is not None:
125128
query_set = query_set.filter(**{'temp.user_id': self.data.get("user_id")})
129+
folder_query_set = folder_query_set.filter(**{'user_id': self.data.get("user_id")})
126130
if "workspace_id" in self.data and self.data.get('workspace_id') is not None:
127131
query_set = query_set.filter(**{'temp.workspace_id': self.data.get("workspace_id")})
132+
folder_query_set = folder_query_set.filter(**{'workspace_id': self.data.get("workspace_id")})
128133
if "folder_id" in self.data and self.data.get('folder_id') is not None:
129134
query_set = query_set.filter(**{'temp.folder_id': self.data.get("folder_id")})
135+
folder_query_set = folder_query_set.filter(**{'parent_id': self.data.get("folder_id")})
130136
query_set = query_set.order_by("-temp.create_time", "temp.id")
131137
query_set_dict['default_sql'] = query_set
132138

133139
query_set_dict['knowledge_custom_sql'] = QuerySet(model=get_dynamics_model({
134140
'knowledge.workspace_id': models.CharField(),
135141
})).filter(**{'knowledge.workspace_id': workspace_id})
136-
142+
query_set_dict['folder_query_set'] = folder_query_set
137143
return query_set_dict
138144

139145
def page(self, current_page: int, page_size: int):
@@ -143,22 +149,16 @@ def page(self, current_page: int, page_size: int):
143149
root = KnowledgeFolder.objects.filter(id=folder_id).first()
144150
if not root:
145151
raise serializers.ValidationError(_('Folder not found'))
146-
# 获取当前文件夹下的直接子文件夹
147-
child_folders = KnowledgeFolder.objects.filter(parent=root)
148-
folders_data = KnowledgeFolderFlatSerializer(child_folders, many=True).data
149152

150-
return {
151-
'knowledge': native_page_search(
152-
current_page,
153-
page_size,
154-
self.get_query_set(),
155-
select_string=get_file_content(
156-
os.path.join(PROJECT_DIR, "apps", "knowledge", 'sql', 'list_knowledge.sql')
157-
),
158-
post_records_handler=lambda r: r
153+
return native_page_search(
154+
current_page,
155+
page_size,
156+
self.get_query_set(),
157+
select_string=get_file_content(
158+
os.path.join(PROJECT_DIR, "apps", "knowledge", 'sql', 'list_knowledge.sql')
159159
),
160-
'folders': folders_data
161-
}
160+
post_records_handler=lambda r: r
161+
)
162162

163163
def list(self):
164164
self.is_valid(raise_exception=True)
Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,45 @@
1-
SELECT
2-
*,
3-
to_json(meta) as meta
4-
FROM
5-
(
6-
SELECT
7-
"temp_knowledge".*,
8-
"document_temp"."char_length",
9-
CASE
10-
WHEN
11-
"app_knowledge_temp"."count" IS NULL THEN 0 ELSE "app_knowledge_temp"."count" END AS application_mapping_count,
12-
"document_temp".document_count FROM (
13-
SELECT knowledge.*
14-
FROM
15-
knowledge knowledge
16-
${knowledge_custom_sql}
17-
) temp_knowledge
18-
LEFT JOIN ( SELECT "count" ( "id" ) AS document_count, "sum" ( "char_length" ) "char_length", knowledge_id FROM "document" GROUP BY knowledge_id ) "document_temp" ON temp_knowledge."id" = "document_temp".knowledge_id
19-
LEFT JOIN (SELECT "count"("id"),knowledge_id FROM application_knowledge_mapping GROUP BY knowledge_id) app_knowledge_temp ON temp_knowledge."id" = "app_knowledge_temp".knowledge_id
20-
) temp
21-
${default_sql}
1+
SELECT *
2+
FROM (SELECT "temp_knowledge".id::text, "temp_knowledge".name,
3+
"temp_knowledge".desc,
4+
"temp_knowledge".type,
5+
'knowledge' as resource_type,
6+
"temp_knowledge".workspace_id,
7+
"temp_knowledge".folder_id,
8+
"temp_knowledge".user_id,
9+
"temp_knowledge".create_time,
10+
"temp_knowledge".update_time,
11+
"document_temp"."char_length",
12+
CASE
13+
WHEN
14+
"app_knowledge_temp"."count" IS NULL THEN 0
15+
ELSE "app_knowledge_temp"."count" END AS application_mapping_count,
16+
"document_temp".document_count
17+
FROM (SELECT knowledge.*
18+
FROM knowledge knowledge ${knowledge_custom_sql}
19+
AND id in (SELECT target
20+
FROM workspace_user_resource_permission
21+
WHERE auth_target_type = 'KNOWLEDGE'
22+
AND 'VIEW' = any (permission_list))) temp_knowledge
23+
LEFT JOIN (SELECT "count"("id") AS document_count, "sum"("char_length") "char_length", knowledge_id
24+
FROM "document"
25+
GROUP BY knowledge_id) "document_temp" ON temp_knowledge."id" = "document_temp".knowledge_id
26+
LEFT JOIN (SELECT "count"("id"), knowledge_id
27+
FROM application_knowledge_mapping
28+
GROUP BY knowledge_id) app_knowledge_temp
29+
ON temp_knowledge."id" = "app_knowledge_temp".knowledge_id
30+
UNION
31+
SELECT "id",
32+
"name",
33+
"desc",
34+
0 as "type",
35+
'folder' as "resource_type",
36+
"workspace_id",
37+
"parent_id" as "folder_id",
38+
"user_id",
39+
"create_time",
40+
"update_time",
41+
0 as char_length,
42+
0 as application_mapping_count,
43+
0 as document_count
44+
from knowledge_folder ${folder_query_set}) temp
45+
${default_sql}

apps/knowledge/views/knowledge.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def get(self, request: Request, workspace_id: str, current_page: int, page_size:
108108
'folder_id': request.query_params.get('folder_id'),
109109
'name': request.query_params.get('name'),
110110
'desc': request.query_params.get("desc"),
111-
'user_id': request.query_params.get('user_id')
111+
'user_id': request.user.id
112112
}
113113
).page(current_page, page_size))
114114

apps/tools/serializers/tool.py

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
from pylint.reporters import JSON2Reporter
1616
from rest_framework import serializers, status
1717

18-
from common.db.search import page_search
18+
from common.db.search import page_search, native_page_search
1919
from common.exception.app_exception import AppApiException
2020
from common.result import result
21+
from common.utils.common import get_file_content
2122
from common.utils.tool_code import ToolExecutor
2223
from maxkb.const import CONFIG, PROJECT_DIR
2324
from tools.models import Tool, ToolScope, ToolFolder
@@ -418,27 +419,47 @@ def page_tool(self, current_page: int, page_size: int):
418419
Q(tool_type=self.data.get('tool_type')))
419420
return page_search(current_page, page_size, tools, lambda record: ToolModelSerializer(record).data)
420421

421-
def page_tool_with_folders(self, current_page: int, page_size: int):
422-
self.is_valid(raise_exception=True)
423-
424-
folder_id = self.data.get('folder_id', 'root')
425-
root = ToolFolder.objects.filter(id=folder_id).first()
426-
if not root:
427-
raise serializers.ValidationError(_('Folder not found'))
428-
# 获取当前文件夹下的直接子文件夹
429-
child_folders = ToolFolder.objects.filter(parent=root)
430-
folders_data = ToolFolderFlatSerializer(child_folders, many=True).data
422+
def get_query_set(self):
423+
tool_query_set = QuerySet(Tool)
424+
tool_type_query_set = QuerySet(Tool)
425+
folder_query_set = QuerySet(ToolFolder)
426+
workspace_id = self.data.get('workspace_id')
427+
user_id = self.data.get('user_id')
428+
tool_type = self.data.get('tool_type')
429+
desc = self.data.get('desc')
430+
name = self.data.get('name')
431+
folder_id = self.data.get('folder_id')
432+
433+
if workspace_id is not None:
434+
folder_query_set = folder_query_set.filter(workspace_id=workspace_id)
435+
tool_query_set = tool_query_set.filter(workspace_id=workspace_id)
436+
if user_id is not None:
437+
folder_query_set = folder_query_set.filter(user_id=user_id)
438+
tool_query_set = tool_query_set.filter(user_id=user_id)
439+
if folder_id is not None:
440+
folder_query_set = folder_query_set.filter(parent=folder_id)
441+
tool_query_set = tool_query_set.filter(folder_id=folder_id)
442+
if name is not None:
443+
folder_query_set = folder_query_set.filter(name__contains=name)
444+
tool_query_set = tool_query_set.filter(name__contains=name)
445+
if desc is not None:
446+
folder_query_set = folder_query_set.filter(desc__contains=desc)
447+
tool_query_set = tool_query_set.filter(desc__contains=desc)
448+
tool_query_set = tool_query_set.order_by("-update_time")
449+
450+
if tool_type is not None:
451+
tool_type_query_set = tool_type_query_set.filter(tool_type=tool_type)
431452

432-
if self.data.get('name'):
433-
tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) &
434-
Q(folder_id=root) &
435-
Q(tool_type=self.data.get('tool_type')) &
436-
Q(name__contains=self.data.get('name')))
437-
else:
438-
tools = QuerySet(Tool).filter(Q(workspace_id=self.data.get('workspace_id')) &
439-
Q(folder_id=root) &
440-
Q(tool_type=self.data.get('tool_type')))
441453
return {
442-
'tools': page_search(current_page, page_size, tools, lambda record: ToolModelSerializer(record).data),
443-
'folders': folders_data
454+
'folder_query_set': folder_query_set,
455+
'tool_query_set': tool_query_set,
456+
'tool_type_query_set': tool_type_query_set
444457
}
458+
459+
def page_tool_with_folders(self, current_page: int, page_size: int):
460+
self.is_valid(raise_exception=True)
461+
462+
return native_page_search(
463+
current_page, page_size, self.get_query_set(),
464+
get_file_content(os.path.join(PROJECT_DIR, "apps", "tools", 'sql', 'list_tool.sql'))
465+
)

apps/tools/sql/list_tool.sql

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
select *
2+
from (select "id"::text,
3+
"name",
4+
"desc",
5+
"tool_type",
6+
'tool' as "resource_type",
7+
"workspace_id",
8+
"folder_id",
9+
"user_id",
10+
"create_time",
11+
"update_time"
12+
from tool ${tool_type_query_set}
13+
UNION
14+
select "id",
15+
"name",
16+
"desc",
17+
'folder' as "tool_type",
18+
'folder' as "resource_type",
19+
"workspace_id",
20+
"parent_id" as "folder_id",
21+
"user_id",
22+
"create_time",
23+
"update_time"
24+
from tool_folder ${folder_query_set}) temp
25+
${tool_query_set}

0 commit comments

Comments
 (0)