Skip to content

Commit 71c8e53

Browse files
committed
feat: Edit trigger
1 parent 3c51b60 commit 71c8e53

3 files changed

Lines changed: 86 additions & 14 deletions

File tree

apps/trigger/api/trigger.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"""
99
from drf_spectacular.types import OpenApiTypes
1010
from drf_spectacular.utils import OpenApiParameter
11+
from rest_framework import serializers
1112

1213
from common.mixins.api_mixin import APIMixin
1314
from trigger.serializers.trigger import TriggerCreateRequest, TriggerResponse
@@ -61,4 +62,11 @@ def get_request():
6162

6263
@staticmethod
6364
def get_response():
64-
return TriggerResponse
65+
return TriggerResponse
66+
class RequestSE(serializers.Serializer):
67+
pass
68+
69+
class TriggerEditAPI(APIMixin):
70+
@staticmethod
71+
def get_request():
72+
return TriggerCreateRequest

apps/trigger/serializers/trigger.py

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@date:2026/1/14 11:48
77
@desc:
88
"""
9+
from typing import Dict
910

1011
import uuid_utils.compat as uuid
1112
from django.db import models, transaction
@@ -24,6 +25,12 @@ class TriggerTaskCreateRequest(serializers.Serializer):
2425
source_type = serializers.ChoiceField(required=True, choices=TriggerTaskTypeChoices)
2526
source_id = serializers.CharField(required=True, label=_('source_id'))
2627
is_active = serializers.BooleanField(required=False, label=_('Is active'))
28+
meta = models.JSONField(default=dict)
29+
parameter = serializers.ListField(
30+
child=serializers.DictField(),
31+
required=False,
32+
default=list
33+
)
2734

2835

2936
class TriggerCreateRequest(serializers.Serializer):
@@ -158,21 +165,25 @@ def _validate_event_setting(setting):
158165
'trigger_setting': 'body must be an array'
159166
})
160167

168+
161169
class TriggerModelSerializer(serializers.ModelSerializer):
162170
class Meta:
163171
model = Trigger
164172
fields = "__all__"
165173

174+
166175
class TriggerTaskModelSerializer(serializers.ModelSerializer):
167176
class Meta:
168177
model = TriggerTask
169178
fields = "__all__"
170179

180+
171181
class ApplicationTriggerTaskSerializer(serializers.ModelSerializer):
172182
class Meta:
173183
model = Application
174184
fields = ['id', 'name', 'work_flow', 'icon', 'type']
175185

186+
176187
class ToolTriggerTaskSerializer(serializers.ModelSerializer):
177188
class Meta:
178189
model = Tool
@@ -213,7 +224,7 @@ def insert(self, instance, with_valid=True):
213224
trigger_tasks = instance.get('trigger_task')
214225
if trigger_tasks:
215226
trigger_task_models = [
216-
self.to_trigger_task_model(trigger_id, task.get('source_type'), task.get('source_id')) for task in
227+
self.to_trigger_task_model(trigger_id, task) for task in
217228
trigger_tasks
218229
]
219230
TriggerTask.objects.bulk_create(trigger_task_models)
@@ -223,13 +234,15 @@ def insert(self, instance, with_valid=True):
223234
return TriggerResponse(trigger_model).data
224235

225236
@staticmethod
226-
def to_trigger_task_model(trigger_id: str, source_type: str, source_id: str):
237+
def to_trigger_task_model(trigger_id: str, task_data: dict):
227238
return TriggerTask(
228239
id=uuid.uuid7(),
229240
trigger_id=trigger_id,
230-
source_type=source_type,
231-
source_id=source_id,
232-
is_active=False
241+
source_type=task_data.get('source_type'),
242+
source_id=task_data.get('source_id'),
243+
is_active=task_data.get('is_active', False),
244+
parameter=task_data.get('parameter', []),
245+
meta=task_data.get('meta', {})
233246
)
234247

235248

@@ -247,8 +260,39 @@ def is_valid(self, *, raise_exception=False):
247260
if not query_set.exists():
248261
raise AppApiException(500, _('Trigger id does not exist'))
249262

250-
def edit(self):
251-
pass
263+
@transaction.atomic
264+
def edit(self, instance: Dict, with_valid=True):
265+
if with_valid:
266+
self.is_valid()
267+
TriggerCreateRequest(data=instance).is_valid(raise_exception=True)
268+
trigger_id = self.data.get('trigger_id')
269+
trigger = Trigger.objects.filter(id=trigger_id).first()
270+
if not trigger:
271+
raise serializers.ValidationError(_('Trigger not found'))
272+
273+
trigger_edit_field_list = ['name', 'desc', 'trigger_type', 'trigger_setting', 'meta', 'is_active']
274+
275+
for field in trigger_edit_field_list:
276+
if field in instance:
277+
trigger.__setattr__(field, instance.get(field))
278+
trigger.save()
279+
# 处理trigger task
280+
TriggerTask.objects.filter(trigger_id=trigger_id).delete()
281+
trigger_tasks = instance.get('trigger_task')
282+
if trigger_tasks:
283+
trigger_task_model_list = [TriggerTask(
284+
id=uuid.uuid7(),
285+
trigger_id=trigger_id,
286+
source_type=task_data.get('source_type'),
287+
source_id=task_data.get('source_id'),
288+
is_active=task_data.get('is_active', False),
289+
parameter=task_data.get('parameter', []),
290+
meta=task_data.get('meta', {})
291+
) for task_data in trigger_tasks]
292+
TriggerTask.objects.bulk_create(trigger_task_model_list)
293+
else:
294+
raise AppApiException(500, _('Trigger task can not be empty'))
295+
return self.one(with_valid=False)
252296

253297
def one(self, with_valid=True):
254298
if with_valid:
@@ -257,21 +301,22 @@ def one(self, with_valid=True):
257301
trigger = QuerySet(Trigger).filter(id=trigger_id).first()
258302

259303
trigger_tasks = QuerySet(TriggerTask).filter(trigger_id=trigger_id)
260-
application_ids = [str(task.source_id) for task in trigger_tasks if task.source_type == TriggerTaskTypeChoices.APPLICATION]
304+
application_ids = [str(task.source_id) for task in trigger_tasks if
305+
task.source_type == TriggerTaskTypeChoices.APPLICATION]
261306
tool_ids = [str(task.source_id) for task in trigger_tasks if task.source_type == TriggerTaskTypeChoices.TOOL]
262307

263-
264308
application_task_list = [ApplicationTriggerTaskSerializer(application).data for application in
265-
QuerySet(Application).filter(id__in=application_ids)]
309+
QuerySet(Application).filter(id__in=application_ids)]
266310

267311
tool_task_list = [ToolTriggerTaskSerializer(tool).data for tool in QuerySet(Tool).filter(id__in=tool_ids)]
268312

269313
return {
270314
**TriggerModelSerializer(trigger).data,
271-
'application_task_list':application_task_list,
272-
'tool_task_list':tool_task_list,
315+
'application_task_list': application_task_list,
316+
'tool_task_list': tool_task_list,
273317
}
274318

319+
275320
class TriggerQuerySerializer(serializers.Serializer):
276321
name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('Trigger name'))
277322
type = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_('Trigger type'))

apps/trigger/views/trigger.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"""
99
from django.utils.translation import gettext_lazy as _
1010
from drf_spectacular.utils import extend_schema
11+
from rest_framework import serializers
1112
from rest_framework.request import Request
1213
from rest_framework.views import APIView
1314

@@ -19,7 +20,7 @@
1920
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
2021
from common.log.log import log
2122
from tools.api.tool import GetInternalToolAPI
22-
from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI
23+
from trigger.api.trigger import TriggerCreateAPI, TriggerOperateAPI, TriggerEditAPI
2324
from trigger.serializers.trigger import TriggerSerializer
2425

2526

@@ -72,6 +73,24 @@ def get(self, request: Request, workspace_id: str, trigger_id: str):
7273
data={'trigger_id': trigger_id, 'workspace_id': workspace_id,'user_id': request.user.id}
7374
).one())
7475

76+
@extend_schema(
77+
methods=['PUT'],
78+
description=_('Modify the trigger'),
79+
summary=_('Modify the trigger'),
80+
operation_id=_('Modify the trigger'), # type: ignore
81+
parameters=TriggerOperateAPI.get_parameters(),
82+
request=TriggerEditAPI.get_request(),
83+
responses=result.DefaultResultSerializer,
84+
tags=[_('Trigger')] # type: ignore
85+
)
86+
def put(self, request: Request, workspace_id: str, trigger_id: str):
87+
return result.success(TriggerOperateSerializer(
88+
data={'trigger_id': trigger_id, 'workspace_id': workspace_id, 'user_id': request.user.id}
89+
).edit(request.data))
90+
91+
92+
93+
7594

7695
class Page(APIView):
7796
authentication_classes = [TokenAuth]

0 commit comments

Comments
 (0)