66 @date:2026/1/14 11:48
77 @desc:
88"""
9+ from typing import Dict
910
1011import uuid_utils .compat as uuid
1112from 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
2936class TriggerCreateRequest (serializers .Serializer ):
@@ -158,21 +165,25 @@ def _validate_event_setting(setting):
158165 'trigger_setting' : 'body must be an array'
159166 })
160167
168+
161169class TriggerModelSerializer (serializers .ModelSerializer ):
162170 class Meta :
163171 model = Trigger
164172 fields = "__all__"
165173
174+
166175class TriggerTaskModelSerializer (serializers .ModelSerializer ):
167176 class Meta :
168177 model = TriggerTask
169178 fields = "__all__"
170179
180+
171181class ApplicationTriggerTaskSerializer (serializers .ModelSerializer ):
172182 class Meta :
173183 model = Application
174184 fields = ['id' , 'name' , 'work_flow' , 'icon' , 'type' ]
175185
186+
176187class 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+
275320class 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' ))
0 commit comments