Skip to content

Commit 0851cc2

Browse files
committed
feat: Trigger task tag
1 parent 8d279eb commit 0851cc2

File tree

4 files changed

+106
-59
lines changed

4 files changed

+106
-59
lines changed

apps/trigger/serializers/trigger.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def is_valid(self, *, model=None, raise_exception=False):
4343
raise AppApiException(500, _('The following id does not exist: {error_id_list}').format(
4444
error_id_list=error_id_list))
4545

46+
4647
class InputField(serializers.Serializer):
4748
source = serializers.CharField(required=True, label=_("source"), validators=[
4849
validators.RegexValidator(regex=re.compile("^custom|reference$"),
@@ -121,6 +122,7 @@ def validate(self, attrs):
121122

122123
return attrs
123124

125+
124126
class TriggerTaskEditRequest(serializers.Serializer):
125127
source_type = serializers.ChoiceField(required=False, choices=TriggerTaskTypeChoices)
126128
source_id = serializers.CharField(required=False, label=_('source_id'))
@@ -142,6 +144,7 @@ def validate(self, attrs):
142144

143145
return attrs
144146

147+
145148
class TriggerEditRequest(serializers.Serializer):
146149
name = serializers.CharField(required=False, label=_('trigger name'))
147150
desc = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('trigger description'))
@@ -392,9 +395,11 @@ def batch_switch(self, instance: Dict, with_valid=True):
392395
workspace_id = self.data.get("workspace_id")
393396
trigger_id_list = instance.get("id_list")
394397
is_active = instance.get("is_active")
395-
Trigger.objects.filter(workspace_id=workspace_id, id__in=trigger_id_list, is_active= not is_active).update(is_active=is_active)
398+
Trigger.objects.filter(workspace_id=workspace_id, id__in=trigger_id_list, is_active=not is_active).update(
399+
is_active=is_active)
396400
return True
397401

402+
398403
class TriggerOperateSerializer(serializers.Serializer):
399404
trigger_id = serializers.UUIDField(required=True, label=_('trigger id'))
400405
user_id = serializers.UUIDField(required=True, label=_("User ID"))
@@ -426,9 +431,9 @@ def edit(self, instance: Dict, with_valid=True):
426431
trigger.__setattr__(field, instance.get(field))
427432
trigger.save()
428433
# 处理trigger task
429-
TriggerTask.objects.filter(trigger_id=trigger_id).delete()
430434
trigger_tasks = instance.get('trigger_task')
431435
if trigger_tasks:
436+
TriggerTask.objects.filter(trigger_id=trigger_id).delete()
432437
trigger_task_model_list = [TriggerTask(
433438
id=uuid.uuid7(),
434439
trigger_id=trigger_id,
@@ -453,18 +458,20 @@ def one(self, with_valid=True):
453458
if with_valid:
454459
self.is_valid()
455460
trigger_id = self.data.get('trigger_id')
456-
trigger = QuerySet(Trigger).filter(id=trigger_id).first()
461+
workspace_id = self.data.get('workspace_id')
462+
trigger = QuerySet(Trigger).filter(workspace_id=workspace_id, id=trigger_id).first()
457463

458464
trigger_tasks = QuerySet(TriggerTask).filter(trigger_id=trigger_id)
459465
application_ids = [str(task.source_id) for task in trigger_tasks if
460466
task.source_type == TriggerTaskTypeChoices.APPLICATION]
461467
tool_ids = [str(task.source_id) for task in trigger_tasks if task.source_type == TriggerTaskTypeChoices.TOOL]
462468

463-
trigger_task_list = [TriggerTaskModelSerializer(task).data for task in trigger_tasks]
469+
trigger_task_list = [TriggerTaskModelSerializer(task).data for task in trigger_tasks]
464470
application_task_list = [ApplicationTriggerTaskSerializer(application).data for application in
465-
QuerySet(Application).filter(id__in=application_ids)]
471+
QuerySet(Application).filter(workspace_id=workspace_id, id__in=application_ids)]
466472

467-
tool_task_list = [ToolTriggerTaskSerializer(tool).data for tool in QuerySet(Tool).filter(id__in=tool_ids)]
473+
tool_task_list = [ToolTriggerTaskSerializer(tool).data for tool in
474+
QuerySet(Tool).filter(workspace_id=workspace_id, id__in=tool_ids)]
468475

469476
return {
470477
**TriggerModelSerializer(trigger).data,
@@ -477,7 +484,7 @@ def one(self, with_valid=True):
477484
class TriggerQuerySerializer(serializers.Serializer):
478485
name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('Trigger name'))
479486
type = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Trigger type'))
480-
is_active = serializers.BooleanField(required=False,allow_null=True, label=_('Is active'))
487+
is_active = serializers.BooleanField(required=False, allow_null=True, label=_('Is active'))
481488
task = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Trigger task'))
482489
create_user = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Create user'))
483490
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
@@ -488,34 +495,35 @@ def get_query_set(self):
488495
'name': models.CharField(),
489496
'trigger_type': models.CharField(),
490497
't.workspace_id': models.CharField(),
491-
'is_active': models.BooleanField(),
492-
'task_str': models.CharField(),
493-
'create_user': models.CharField(),
498+
't.is_active': models.BooleanField(),
499+
't.user_id': models.CharField(),
494500
}))
495-
trigger_query_set = trigger_query_set.filter(**{'t.workspace_id':self.data.get("workspace_id")})
496-
user_query_set = QuerySet(model=get_dynamics_model({'nick_name': models.CharField()}))
501+
task_query_set = QuerySet(model=get_dynamics_model({
502+
'trigger_task_str': models.CharField(),
503+
}))
504+
trigger_query_set = trigger_query_set.filter(**{'t.workspace_id': self.data.get("workspace_id")})
497505
if self.data.get("name"):
498506
trigger_query_set = trigger_query_set.filter(name__contains=self.data.get("name"))
499507
if self.data.get("type"):
500508
trigger_query_set = trigger_query_set.filter(trigger_type=self.data.get("type"))
501509
if self.data.get("is_active") is not None:
502-
trigger_query_set = trigger_query_set.filter(is_active=self.data.get("is_active"))
510+
trigger_query_set = trigger_query_set.filter(**{"t.is_active": self.data.get("is_active")})
503511
if self.data.get("task"):
504-
trigger_query_set = trigger_query_set.filter(task_str__icontains=self.data.get("task"))
512+
task_query_set = task_query_set.filter(trigger_task_str__icontains=self.data.get("task"))
505513
if self.data.get("create_user"):
506-
user_query_set = user_query_set.filter(create_user__icontains=self.data.get("create_user"))
514+
trigger_query_set = trigger_query_set.filter(**{"t.user_id": self.data.get("create_user")})
507515

508-
return {"trigger_query_set": trigger_query_set, "user_query_set": user_query_set}
516+
return {"trigger_query_set": trigger_query_set, "task_query_set": task_query_set}
509517

510518
def page(self, current_page: int, page_size: int, with_valid=True):
511519
if with_valid:
512520
self.is_valid(raise_exception=True)
513-
return native_page_search(current_page, page_size, self.get_query_set(),get_file_content(
514-
os.path.join(PROJECT_DIR, "apps","trigger","sql","get_trigger_page_list.sql")
521+
return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
522+
os.path.join(PROJECT_DIR, "apps", "trigger", "sql", "get_trigger_page_list.sql")
515523
))
516524

517525
def list(self, with_valid=True):
518526
if with_valid:
519527
self.is_valid(raise_exception=True)
520-
return native_search(self.get_query_set(),select_string=get_file_content(
521-
os.path.join(PROJECT_DIR, "apps","trigger","sql","get_trigger_page_list.sql")))
528+
return native_search(self.get_query_set(), select_string=get_file_content(
529+
os.path.join(PROJECT_DIR, "apps", "trigger", "sql", "get_trigger_page_list.sql")))
Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1-
SELECT t.id,
2-
t.workspace_id,
3-
t.name,
4-
t.desc,
5-
t.trigger_type,
6-
t.trigger_setting,
7-
t.meta::JSON,
8-
t.is_active,
9-
t.create_time,
10-
t.update_time,
11-
t.user_id,
12-
u.nick_name AS create_user,
13-
COALESCE(
14-
JSON_AGG(
15-
JSON_BUILD_OBJECT(
16-
'type', tt.source_type,
17-
'name', COALESCE(app.name, tool.name),
18-
'icon', COALESCE(app.icon, tool.icon)
19-
)
20-
), '[]'::JSON
21-
) AS trigger_task,
22-
STRING_AGG(COALESCE(app.name, tool.name), ' ') AS trigger_task_str
23-
FROM event_trigger t
24-
LEFT JOIN public."user" u ON u.id = t.user_id
25-
LEFT JOIN event_trigger_task tt ON t.id = tt.trigger_id
26-
LEFT JOIN application app ON tt.source_type = 'APPLICATION' AND tt.source_id = app.id
27-
LEFT JOIN tool ON tt.source_type = 'TOOL' AND tt.source_id = tool.id
28-
${trigger_query_set}
29-
${user_query_set}
30-
GROUP BY t.id, t.workspace_id, t.name, t.desc, t.trigger_type, t.trigger_setting, t.meta, t.is_active, t.create_time,
31-
t.update_time, t.user_id, u.nick_name
32-
ORDER BY t.create_time DESC
1+
2+
SELECT *
3+
FROM (SELECT t.id,
4+
t.workspace_id,
5+
t.name,
6+
t."desc",
7+
t.trigger_type,
8+
t.trigger_setting,
9+
t.meta::JSON,
10+
t.is_active,
11+
t.create_time,
12+
t.update_time,
13+
t.user_id,
14+
COALESCE(
15+
JSON_AGG(
16+
JSON_BUILD_OBJECT(
17+
'type', tt.source_type,
18+
'name', COALESCE(app.name, tool.name),
19+
'icon', COALESCE(app.icon, tool.icon)
20+
)
21+
), '[]'::JSON
22+
) AS trigger_task,
23+
STRING_AGG(COALESCE(app.name, tool.name), ' ') AS trigger_task_str
24+
FROM event_trigger t
25+
LEFT JOIN event_trigger_task tt ON t.id = tt.trigger_id
26+
LEFT JOIN application app ON tt.source_type = 'APPLICATION' AND tt.source_id = app.id
27+
LEFT JOIN tool ON tt.source_type = 'TOOL' AND tt.source_id = tool.id
28+
${trigger_query_set}
29+
GROUP BY t.id, t.workspace_id, t.name, t.desc, t.trigger_type, t.trigger_setting, t.meta, t.is_active,
30+
t.create_time,
31+
t.update_time, t.user_id) AS sub
32+
${task_query_set}
33+
ORDER BY sub.create_time DESC

ui/src/views/trigger/component/ApplicationParameter.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ const options = computed(() => {
168168
})
169169
170170
const base_node = computed(() => {
171-
return props.application?.work_flow.nodes.find((n: any) => n.type === 'base-node')
171+
return (props.application?.work_flow?.nodes || []).find((n: any) => n.type === 'base-node')
172172
})
173173
const api_input_field_list = computed(() => {
174174
const result: Array<any> = []

ui/src/views/trigger/index.vue

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<el-option :label="$t('common.name', '名称')" value="name" />
3030
<el-option :label="$t('view.trigger.type', '类型')" value="type" />
3131
<el-option :label="$t('view.trigger.task', '任务')" value="task" />
32-
<el-option :label="$t('view.trigger.status', '状态')" value="status" />
32+
<el-option :label="$t('view.trigger.status', '状态')" value="is_active" />
3333
<el-option :label="$t('view.trigger.createUser', '创建者')" value="create_user" />
3434
</el-select>
3535
<el-input
@@ -48,8 +48,19 @@
4848
clearable
4949
style="width: 220px"
5050
>
51-
<el-option :label="$t('view.trigger.scheduled')" value="SCHEDULED" />
52-
<el-option :label="$t('view.trigger.event')" value="unpublished" />
51+
<el-option :label="$t('view.trigger.scheduled', '定时触发')" value="SCHEDULED" />
52+
<el-option :label="$t('view.trigger.event', '事件触发')" value="EVENT" />
53+
</el-select>
54+
<el-select
55+
v-else-if="search_type === 'is_active'"
56+
v-model="search_form.is_active"
57+
@change="searchHandle"
58+
filterable
59+
clearable
60+
style="width: 220px"
61+
>
62+
<el-option :label="$t('view.trigger.active', '启用')" value="true" />
63+
<el-option :label="$t('view.trigger.ban', '禁用')" value="false" />
5364
</el-select>
5465
<el-select
5566
v-else-if="search_type === 'create_user'"
@@ -123,6 +134,28 @@
123134
{{ datetimeFormat(row.update_time) }}
124135
</template>
125136
</el-table-column>
137+
<el-table-column
138+
prop="trigger_task"
139+
:label="$t('views.trigger.table.task', '任务')"
140+
width="180"
141+
>
142+
<template #default="{ row }">
143+
<div class="flex">
144+
<el-check-tag type="info" class="mr-8"
145+
>智能体
146+
{{
147+
row.trigger_task.filter((item: any) => item.type === 'APPLICATION').length
148+
}}</el-check-tag
149+
>
150+
<el-check-tag type="info"
151+
>工具
152+
{{
153+
row.trigger_task.filter((item: any) => item.type === 'TOOL').length
154+
}}</el-check-tag
155+
>
156+
</div>
157+
</template>
158+
</el-table-column>
126159
<el-table-column align="left" width="160" fixed="right" :label="$t('common.operation')">
127160
<template #default="{ row }">
128161
<span @click.stop>
@@ -292,8 +325,10 @@ function updateData(triggerId: string, data: TriggerData, msg: string) {
292325
triggerAPI
293326
.putTrigger(triggerId, data, loading)
294327
.then((res: any) => {
295-
const index = triggerData.value.findIndex((v) => v.id === triggerId)
296-
triggerData.value.splice(index, 1, res.data)
328+
const trigger: TriggerData = triggerData.value.find((v) => v.id === triggerId)
329+
if (trigger) {
330+
trigger.is_active = res.data.is_active
331+
}
297332
MsgSuccess(msg)
298333
return true
299334
})
@@ -314,7 +349,10 @@ function handleSizeChange() {
314349
}
315350
316351
function getList(bool?: boolean) {
317-
const param = {}
352+
const param: any = {}
353+
if (search_form.value[search_type.value]) {
354+
param[search_type.value] = search_form.value[search_type.value]
355+
}
318356
triggerAPI
319357
.pageTrigger(paginationConfig.value, param, bool ? undefined : loading)
320358
.then((res: any) => {

0 commit comments

Comments
 (0)