|
15 | 15 | from pylint.reporters import JSON2Reporter |
16 | 16 | from rest_framework import serializers, status |
17 | 17 |
|
18 | | -from common.db.search import page_search |
| 18 | +from common.db.search import page_search, native_page_search |
19 | 19 | from common.exception.app_exception import AppApiException |
20 | 20 | from common.result import result |
| 21 | +from common.utils.common import get_file_content |
21 | 22 | from common.utils.tool_code import ToolExecutor |
22 | 23 | from maxkb.const import CONFIG, PROJECT_DIR |
23 | 24 | from tools.models import Tool, ToolScope, ToolFolder |
@@ -418,27 +419,47 @@ def page_tool(self, current_page: int, page_size: int): |
418 | 419 | Q(tool_type=self.data.get('tool_type'))) |
419 | 420 | return page_search(current_page, page_size, tools, lambda record: ToolModelSerializer(record).data) |
420 | 421 |
|
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) |
431 | 452 |
|
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'))) |
441 | 453 | 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 |
444 | 457 | } |
| 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 | + ) |
0 commit comments