|
13 | 13 | import uuid_utils.compat as uuid |
14 | 14 | from django.core import validators |
15 | 15 | from django.db import transaction |
16 | | -from django.db.models import QuerySet, Q |
| 16 | +from django.db.models import QuerySet, Q, Subquery, OuterRef, CharField, Value, When, Case |
17 | 17 | from django.http import HttpResponse |
18 | 18 | from django.utils import timezone |
19 | 19 | from django.utils.translation import gettext_lazy as _ |
|
22 | 22 | from pylint.reporters import JSON2Reporter |
23 | 23 | from rest_framework import serializers, status |
24 | 24 |
|
| 25 | +from application.models import Application |
25 | 26 | from common.database_model_manage.database_model_manage import DatabaseModelManage |
26 | 27 | from common.db.search import page_search, native_page_search, native_search |
27 | 28 | from common.exception.app_exception import AppApiException |
|
31 | 32 | from common.utils.logger import maxkb_logger |
32 | 33 | from common.utils.rsa_util import rsa_long_decrypt, rsa_long_encrypt |
33 | 34 | from common.utils.tool_code import ToolExecutor |
| 35 | +from knowledge.models import File, FileSourceType, Knowledge |
| 36 | +from maxkb.const import PROJECT_DIR |
| 37 | +from role_setting.models import Workspace |
| 38 | +from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission |
34 | 39 | from system_manage.models.resource_mapping import ResourceMapping |
35 | 40 | from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer |
36 | | -from knowledge.models import File, FileSourceType |
37 | | -from maxkb.const import CONFIG, PROJECT_DIR |
38 | | -from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission |
39 | 41 | from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer |
40 | | -from tools.models import Tool, ToolScope, ToolFolder, ToolType |
41 | | -from trigger.models import TriggerTask |
| 42 | +from tools.models import Tool, ToolScope, ToolFolder, ToolType, ToolRecord |
| 43 | +from trigger.models import TriggerTask, Trigger |
42 | 44 | from users.serializers.user import is_workspace_manage |
43 | 45 |
|
44 | 46 | tool_executor = ToolExecutor() |
@@ -133,6 +135,13 @@ class Meta: |
133 | 135 | 'version', 'create_time', 'update_time'] |
134 | 136 |
|
135 | 137 |
|
| 138 | +class ToolRecordModelSerializer(serializers.ModelSerializer): |
| 139 | + class Meta: |
| 140 | + model = ToolRecord |
| 141 | + fields = ['id', 'workspace_id', 'tool_id', 'source_type', 'source_id', 'meta', 'state', 'run_time', |
| 142 | + 'create_time', 'update_time'] |
| 143 | + |
| 144 | + |
136 | 145 | class ToolExportModelSerializer(serializers.ModelSerializer): |
137 | 146 | class Meta: |
138 | 147 | model = Tool |
@@ -876,6 +885,63 @@ def update_tool(self, with_valid=True): |
876 | 885 | maxkb_logger.error(f"callback appstore tool download error: {e}") |
877 | 886 | return ToolModelSerializer(tool).data |
878 | 887 |
|
| 888 | + class ToolRecord(serializers.Serializer): |
| 889 | + workspace_id = serializers.CharField(required=True, label=_('workspace id')) |
| 890 | + tool_id = serializers.UUIDField(required=True, label=_('tool id')) |
| 891 | + record_id = serializers.UUIDField(required=False, allow_null=True, label=_('record id')) |
| 892 | + source_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('source name')) |
| 893 | + source_type = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('source type')) |
| 894 | + state = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('state')) |
| 895 | + |
| 896 | + def one(self): |
| 897 | + self.is_valid(raise_exception=True) |
| 898 | + if self.data.get('record_id'): |
| 899 | + page = self.get_tool_records(1, 1) |
| 900 | + return page.get('records')[0] |
| 901 | + |
| 902 | + return None |
| 903 | + |
| 904 | + def get_tool_records(self, current_page: int, page_size: int): |
| 905 | + self.is_valid(raise_exception=True) |
| 906 | + application_subquery = Application.objects.filter(id=OuterRef('source_id')).values('name')[:1] |
| 907 | + knowledge_subquery = Knowledge.objects.filter(id=OuterRef('source_id')).values('name')[:1] |
| 908 | + trigger_subquery = Trigger.objects.filter(id=OuterRef('source_id')).values('name')[:1] |
| 909 | + workspace_subquery = Workspace.objects.filter(id=OuterRef('workspace_id')).values('name')[:1] |
| 910 | + |
| 911 | + query_set = QuerySet(ToolRecord) |
| 912 | + query_set = query_set.filter( |
| 913 | + workspace_id=self.data.get('workspace_id'), |
| 914 | + tool_id=self.data.get('tool_id') |
| 915 | + ).annotate( |
| 916 | + source_name=Case( |
| 917 | + When(source_type='APPLICATION', then=Subquery(application_subquery)), |
| 918 | + When(source_type='KNOWLEDGE', then=Subquery(knowledge_subquery)), |
| 919 | + When(source_type='TRIGGER', then=Subquery(trigger_subquery)), |
| 920 | + default=Value(''), |
| 921 | + output_field=CharField() |
| 922 | + ) |
| 923 | + ).annotate( |
| 924 | + workspace_name=Subquery(workspace_subquery) |
| 925 | + ) |
| 926 | + if self.data.get('source_type'): |
| 927 | + query_set = query_set.filter(Q(source_type=self.data.get('source_type', ''))) |
| 928 | + if self.data.get('state'): |
| 929 | + query_set = query_set.filter(Q(state=self.data.get('state', ''))) |
| 930 | + if self.data.get('source_name'): |
| 931 | + query_set = query_set.filter(Q(source_name__icontains=self.data.get('source_name', ''))) |
| 932 | + if self.data.get('record_id'): |
| 933 | + query_set = query_set.filter(Q(id=self.data.get('record_id'))) |
| 934 | + query_set = query_set.order_by('-create_time') |
| 935 | + |
| 936 | + return page_search( |
| 937 | + current_page, page_size, query_set, |
| 938 | + lambda record: { |
| 939 | + **ToolRecordModelSerializer(record).data, |
| 940 | + 'source_name': record.source_name, |
| 941 | + 'workspace_name': record.workspace_name, |
| 942 | + } |
| 943 | + ) |
| 944 | + |
879 | 945 |
|
880 | 946 | class ToolTreeSerializer(serializers.Serializer): |
881 | 947 | class Query(serializers.Serializer): |
|
0 commit comments