Skip to content

Commit bf867f5

Browse files
committed
feat: Trigger task popover
1 parent 7d14769 commit bf867f5

File tree

6 files changed

+323
-20
lines changed

6 files changed

+323
-20
lines changed

apps/trigger/api/trigger.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,71 @@ class RequestSE(serializers.Serializer):
9191
class TriggerEditAPI(APIMixin):
9292
@staticmethod
9393
def get_request():
94-
return TriggerCreateRequest
94+
return TriggerCreateRequest
95+
96+
97+
class TaskSourceTriggerAPI(APIMixin):
98+
@staticmethod
99+
def get_parameters():
100+
return [
101+
OpenApiParameter(
102+
name="workspace_id",
103+
description="工作空间id",
104+
type=OpenApiTypes.STR,
105+
location='path',
106+
required=True,
107+
),
108+
OpenApiParameter(
109+
name="source_id",
110+
description="资源id",
111+
type=OpenApiTypes.STR,
112+
location='path',
113+
required=True,
114+
),
115+
OpenApiParameter(
116+
name="source_type",
117+
description="资源类型",
118+
type=OpenApiTypes.STR,
119+
location='path',
120+
required=True,
121+
),
122+
]
123+
124+
@staticmethod
125+
def get_response():
126+
return TriggerResponse
127+
128+
129+
class TaskSourceTriggerOperateAPI(APIMixin):
130+
@staticmethod
131+
def get_parameters():
132+
return [
133+
OpenApiParameter(
134+
name="workspace_id",
135+
description="工作空间id",
136+
type=OpenApiTypes.STR,
137+
location='path',
138+
required=True,
139+
),
140+
OpenApiParameter(
141+
name="source_id",
142+
description="资源id",
143+
type=OpenApiTypes.STR,
144+
location='path',
145+
required=True,
146+
),
147+
OpenApiParameter(
148+
name="source_type",
149+
description="资源类型",
150+
type=OpenApiTypes.STR,
151+
location='path',
152+
required=True,
153+
),
154+
OpenApiParameter(
155+
name="trigger_id",
156+
description="触发器id",
157+
type=OpenApiTypes.STR,
158+
location='path',
159+
required=True,
160+
),
161+
]
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:niu
5+
@file: task_source_trigger.py
6+
@date:2026/1/22 16:18
7+
@desc:
8+
"""
9+
import os.path
10+
import re
11+
from typing import Dict
12+
13+
import uuid_utils.compat as uuid
14+
from django.core import validators
15+
from django.db import models, transaction
16+
from django.db.models import QuerySet
17+
from django.utils.translation import gettext_lazy as _
18+
from rest_framework import serializers
19+
20+
from application.models import Application
21+
from common.db.search import page_search, get_dynamics_model, native_page_search, native_search
22+
from common.exception.app_exception import AppApiException
23+
from common.field.common import ObjectField
24+
from common.utils.common import get_file_content
25+
from knowledge.serializers.common import BatchSerializer
26+
from maxkb.conf import PROJECT_DIR
27+
from tools.models import Tool
28+
from trigger.models import TriggerTypeChoices, Trigger, TriggerTaskTypeChoices, TriggerTask
29+
from trigger.serializers.trigger import TriggerModelSerializer, TriggerSerializer, ApplicationTriggerTaskSerializer, \
30+
ToolTriggerTaskSerializer, TriggerTaskModelSerializer
31+
32+
33+
class TaskSourceTriggerSerializer(serializers.Serializer):
34+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
35+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
36+
37+
def insert(self, instance, with_valid=True):
38+
if with_valid:
39+
self.is_valid(raise_exception=True)
40+
return TriggerSerializer().insert(instance, with_valid=True)
41+
42+
43+
class TaskSourceTriggerOperateSerializer(serializers.Serializer):
44+
trigger_id = serializers.UUIDField(required=True, label=_('trigger id'))
45+
user_id = serializers.UUIDField(required=True, label=_("User ID"))
46+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
47+
source_type = serializers.CharField(required=True, label=_('source type'))
48+
source_id = serializers.CharField(required=True, label=_('source id'))
49+
50+
def is_valid(self, *, raise_exception=False):
51+
super().is_valid(raise_exception=True)
52+
workspace_id = self.data.get('workspace_id')
53+
query_set = QuerySet(Trigger).filter(id=self.data.get('trigger_id'))
54+
if workspace_id:
55+
query_set = query_set.filter(workspace_id=workspace_id)
56+
if not query_set.exists():
57+
raise AppApiException(500, _('Trigger id does not exist'))
58+
59+
def one(self, with_valid=True):
60+
if with_valid:
61+
self.is_valid()
62+
trigger_id = self.data.get('trigger_id')
63+
workspace_id = self.data.get('workspace_id')
64+
source_id = self.data.get('source_id')
65+
source_type = self.data.get('source_type')
66+
67+
trigger = QuerySet(Trigger).filter(workspace_id=workspace_id, id=trigger_id).first()
68+
trigger_task = TriggerTaskModelSerializer(TriggerTask.objects.filter(
69+
trigger_id=trigger_id, source_id=source_id, source_type=source_type).first()).data
70+
71+
if source_type == TriggerTaskTypeChoices.APPLICATION:
72+
application_task = ApplicationTriggerTaskSerializer(
73+
Application.objects.filter(workspace_id=workspace_id, id=source_id).first()).data
74+
return {
75+
**TriggerModelSerializer(trigger).data,
76+
'trigger_task': trigger_task,
77+
'application_task': application_task,
78+
}
79+
if source_type == TriggerTaskTypeChoices.TOOL:
80+
tool_task = ToolTriggerTaskSerializer(
81+
Tool.objects.filter(workspace_id=workspace_id, id=source_id).first()).data
82+
return {
83+
**TriggerModelSerializer(trigger).data,
84+
'trigger_task': trigger_task,
85+
'application_task': tool_task,
86+
}
87+
88+
def edit(self, instance: Dict, with_valid = True):
89+
if with_valid:
90+
self.is_valid(raise_exception=True)
91+
92+
93+
94+
95+
96+
97+
class TaskSourceTriggerListSerializer(serializers.Serializer):
98+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
99+
source_type = serializers.CharField(required=True, label=_('source type'))
100+
source_id = serializers.CharField(required=True, label=_('source id'))
101+
102+
def list(self, with_valid=True):
103+
if with_valid:
104+
self.is_valid(raise_exception=True)
105+
106+
triggers = Trigger.objects.filter(workspace_id=self.data.get("workspace_id"),
107+
triggertask__source_id=self.data.get("source_id"),
108+
triggertask__source_type=self.data.get("source_type"),
109+
is_active=True
110+
).distinct()
111+
112+
return [TriggerModelSerializer(trigger).data for trigger in triggers]

apps/trigger/serializers/trigger.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -461,17 +461,26 @@ def one(self, with_valid=True):
461461
workspace_id = self.data.get('workspace_id')
462462
trigger = QuerySet(Trigger).filter(workspace_id=workspace_id, id=trigger_id).first()
463463

464-
trigger_tasks = QuerySet(TriggerTask).filter(trigger_id=trigger_id)
465-
application_ids = [str(task.source_id) for task in trigger_tasks if
466-
task.source_type == TriggerTaskTypeChoices.APPLICATION]
467-
tool_ids = [str(task.source_id) for task in trigger_tasks if task.source_type == TriggerTaskTypeChoices.TOOL]
468-
469-
trigger_task_list = [TriggerTaskModelSerializer(task).data for task in trigger_tasks]
470-
application_task_list = [ApplicationTriggerTaskSerializer(application).data for application in
471-
QuerySet(Application).filter(workspace_id=workspace_id, id__in=application_ids)]
472-
473-
tool_task_list = [ToolTriggerTaskSerializer(tool).data for tool in
474-
QuerySet(Tool).filter(workspace_id=workspace_id, id__in=tool_ids)]
464+
trigger_tasks = list(QuerySet(TriggerTask).filter(trigger_id=trigger_id))
465+
466+
application_ids = []
467+
tool_ids = []
468+
for task in trigger_tasks:
469+
if task.source_type == TriggerTaskTypeChoices.APPLICATION:
470+
application_ids.append(task.source_id)
471+
elif task.source_type == TriggerTaskTypeChoices.TOOL:
472+
tool_ids.append(task.source_id)
473+
474+
trigger_task_list = TriggerTaskModelSerializer(trigger_tasks, many=True).data
475+
476+
application_task_list = []
477+
if application_ids:
478+
applications =Application.objects.filter(workspace_id=workspace_id, id__in=application_ids)
479+
application_task_list = ApplicationTriggerTaskSerializer(applications, many=True).data
480+
tool_task_list = []
481+
if tool_ids:
482+
tools = Tool.objects.filter(workspace_id=workspace_id, id__in=tool_ids)
483+
tool_task_list = ToolTriggerTaskSerializer(tools, many=True).data
475484

476485
return {
477486
**TriggerModelSerializer(trigger).data,

apps/trigger/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
path('workspace/<str:workspace_id>/trigger/<str:trigger_id>', views.TriggerView.Operate.as_view(), name='trigger operate'),
2323
path('workspace/<str:workspace_id>/trigger/<int:current_page>/<int:page_size>', views.TriggerView.Page.as_view(),
2424
name='trigger_page'),
25+
path('workspace/<str:workspace_id>/<str:source_type>/<str:source_id>/trigger/<str:trigger_id>',
26+
views.TaskSourceTriggerView.Operate.as_view(), name='task source trigger operate'),
27+
path('workspace/<str:workspace_id>/<str:source_type>/<str:source_id>/trigger', views.TaskSourceTriggerView.as_view(), name='task source trigger'),
2528
path('workspace/<str:workspace_id>/task', views.TriggerTaskView.as_view(), name='task'),
2629
path('trigger/v1/webhook/<str:trigger_id>', EventTriggerView.as_view(), name='trigger_webhook')
2730
]

apps/trigger/views/trigger.py

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
from application.api.application_api import ApplicationCreateAPI
1515
from common import result
1616
from common.auth import TokenAuth
17+
from trigger.serializers.task_source_trigger import TaskSourceTriggerListSerializer, TaskSourceTriggerOperateSerializer, \
18+
TaskSourceTriggerSerializer
1719
from trigger.serializers.trigger import TriggerQuerySerializer, TriggerOperateSerializer
1820

1921
from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI, TriggerEditAPI, TriggerBatchDeleteAPI, \
20-
TriggerBatchActiveAPI
22+
TriggerBatchActiveAPI, TaskSourceTriggerOperateAPI, TaskSourceTriggerAPI
2123
from trigger.serializers.trigger import TriggerSerializer
2224

2325

@@ -162,3 +164,86 @@ def get(self, request: Request, workspace_id: str, current_page: int, page_size:
162164
'is_active': request.query_params.get('is_active'),
163165
'create_user': request.query_params.get('create_user'),
164166
}).page(current_page, page_size))
167+
168+
169+
class TaskSourceTriggerView(APIView):
170+
authentication_classes = [TokenAuth]
171+
172+
@extend_schema(
173+
methods=['POST'],
174+
description=_('Create trigger of source'),
175+
summary=_('Create trigger of source'),
176+
operation_id=_('Create trigger of source'), # type: ignore
177+
parameters=TaskSourceTriggerAPI.get_parameters(),
178+
request=TaskSourceTriggerAPI.get_request(),
179+
responses=TaskSourceTriggerAPI.get_response(),
180+
tags=[_('Trigger')] # type: ignore
181+
)
182+
def post(self, request: Request, workspace_id: str, source_type: str, source_id: str):
183+
return result.success(TaskSourceTriggerSerializer(data={
184+
'workspace_id': workspace_id,
185+
'user_id': request.user.id
186+
}).insert({**request.data, 'source_id': source_id,
187+
'source_type': source_type}))
188+
189+
@extend_schema(
190+
methods=['GET'],
191+
description=_('Get the trigger list of source'),
192+
summary=_('Get the trigger list of source'),
193+
operation_id=_('Get the trigger list of source'), # type: ignore
194+
parameters=TaskSourceTriggerAPI.get_parameters(),
195+
responses=result.DefaultResultSerializer,
196+
tags=[_('Trigger')] # type: ignore
197+
)
198+
def get(self, request: Request, workspace_id: str, source_type: str, source_id: str):
199+
return result.success(TaskSourceTriggerListSerializer(data={
200+
'workspace_id': workspace_id,
201+
'source_id': source_id,
202+
'source_type': source_type,
203+
}).list())
204+
205+
class Operate(APIView):
206+
authentication_classes = [TokenAuth]
207+
208+
@extend_schema(
209+
methods=['GET'],
210+
description=_('Get Task source trigger details'),
211+
summary=_('Get Task source trigger details'),
212+
operation_id=_('Get Task source trigger details'), # type: ignore
213+
parameters=TaskSourceTriggerOperateAPI.get_parameters(),
214+
responses=result.DefaultResultSerializer,
215+
tags=[_('Trigger')] # type: ignore
216+
)
217+
def get(self, request: Request, workspace_id: str, source_type: str, source_id: str, trigger_id: str):
218+
return result.success(TaskSourceTriggerOperateSerializer(
219+
data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id,
220+
'source_id': source_id, 'source_type': source_type}
221+
).one())
222+
223+
224+
@extend_schema(
225+
methods=['PUT'],
226+
description=_('Modify the task source trigger'),
227+
summary=_('Modify the task source trigger'),
228+
operation_id=_('Modify the task source trigger'), # type: ignore
229+
parameters=TaskSourceTriggerOperateAPI.get_parameters(),
230+
request=TaskSourceTriggerOperateAPI.get_request(),
231+
responses=result.DefaultResultSerializer,
232+
tags=[_('Trigger')] # type: ignore
233+
)
234+
def get(self, request: Request, workspace_id: str, source_type: str, source_id: str, trigger_id: str):
235+
return result.success(TaskSourceTriggerOperateSerializer(
236+
data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id,
237+
'source_id': source_id, 'source_type': source_type}
238+
).edit(request.data))
239+
240+
241+
242+
243+
244+
245+
246+
247+
248+
249+

0 commit comments

Comments
 (0)