51
51
from gcloud .tasktmpl3 .signals import post_template_save_commit
52
52
from gcloud .template_base .domains .template_manager import TemplateManager
53
53
from gcloud .user_custom_config .constants import TASKTMPL_ORDERBY_OPTIONS
54
+ from gcloud .utils .webhook import apply_webhook_configs , get_webhook_configs , clear_scope_webhooks
55
+ from gcloud .constants import WebhookScopeType
54
56
55
57
logger = logging .getLogger ("root" )
56
58
manager = TemplateManager (template_model_cls = TaskTemplate )
@@ -166,10 +168,12 @@ def list(self, request, *args, **kwargs):
166
168
user_model .objects .get (username = request .user .username ).tasktemplate_set .all ().values_list ("id" , flat = True )
167
169
)
168
170
template_ids = [obj ["id" ] for obj in data ]
171
+ webhook_configs = get_webhook_configs (scope_code = template_ids )
169
172
templates_labels = TemplateLabelRelation .objects .fetch_templates_labels (template_ids )
170
173
for obj in data :
171
174
obj ["is_add" ] = 1 if obj ["id" ] in collected_templates else 0
172
175
obj ["template_labels" ] = templates_labels .get (obj ["id" ], [])
176
+ obj ["webhook_configs" ] = webhook_configs .get (str (obj ["id" ]), {})
173
177
return self .get_paginated_response (data ) if page is not None else Response (data )
174
178
175
179
@swagger_auto_schema (
@@ -196,11 +200,13 @@ def list_with_top_collection(self, request, *args, **kwargs):
196
200
# 注入权限
197
201
data = self .injection_auth_actions (request , serializer .data , serializer .instance )
198
202
template_ids = [obj ["id" ] for obj in data ]
203
+ webhook_configs = get_webhook_configs (scope_code = template_ids )
199
204
templates_labels = TemplateLabelRelation .objects .fetch_templates_labels (template_ids )
200
205
for obj in data :
201
206
obj ["template_labels" ] = templates_labels .get (obj ["id" ], [])
202
207
obj ["is_collected" ] = 1 if obj ["id" ] in collection_template_ids else 0
203
208
obj ["collection_id" ] = collection_template_map .get (obj ["id" ], - 1 )
209
+ obj ["webhook_configs" ] = webhook_configs .get (str (obj ["id" ]), {})
204
210
return self .get_paginated_response (data ) if page is not None else Response (data )
205
211
206
212
def retrieve (self , request , * args , ** kwargs ):
@@ -209,6 +215,8 @@ def retrieve(self, request, *args, **kwargs):
209
215
data = self .injection_auth_actions (request , serializer .data , instance )
210
216
labels = TemplateLabelRelation .objects .fetch_templates_labels ([instance .id ]).get (instance .id , [])
211
217
data ["template_labels" ] = [label ["label_id" ] for label in labels ]
218
+ webhook_configs = get_webhook_configs (scope_code = [str (instance .id )])
219
+ data ["webhook_configs" ] = webhook_configs .get (str (instance .id ), {})
212
220
bk_audit_add_event (
213
221
username = request .user .username ,
214
222
action_id = IAMMeta .FLOW_VIEW_ACTION ,
@@ -224,6 +232,7 @@ def create(self, request, *args, **kwargs):
224
232
creator = request .user .username
225
233
pipeline_tree = json .loads (serializer .validated_data .pop ("pipeline_tree" ))
226
234
description = serializer .validated_data .pop ("description" , "" )
235
+ webhook_configs = serializer .validated_data .pop ("webhook_configs" , {})
227
236
with transaction .atomic ():
228
237
result = manager .create_pipeline (
229
238
name = name , creator = creator , pipeline_tree = pipeline_tree , description = description
@@ -237,6 +246,14 @@ def create(self, request, *args, **kwargs):
237
246
serializer .validated_data ["pipeline_template_id" ] = result ["data" ].template_id
238
247
template_labels = serializer .validated_data .pop ("template_labels" )
239
248
self .perform_create (serializer )
249
+ if webhook_configs :
250
+ apply_result = apply_webhook_configs (webhook_configs , str (serializer .instance .id ))
251
+ if not apply_result ["result" ]:
252
+ message = apply_result ["message" ]
253
+ logger .error (message )
254
+ return Response (
255
+ {"detail" : ErrorDetail (message , err_code .REQUEST_PARAM_INVALID .code )}, exception = True
256
+ )
240
257
self ._sync_template_lables (serializer .instance .id , template_labels )
241
258
headers = self .get_success_headers (serializer .data )
242
259
# 发送信号
@@ -277,6 +294,7 @@ def update(self, request, *args, **kwargs):
277
294
editor = request .user .username
278
295
pipeline_tree = json .loads (serializer .validated_data .pop ("pipeline_tree" ))
279
296
description = serializer .validated_data .pop ("description" , "" )
297
+ webhook_config = serializer .validated_data .pop ("webhook_config" , {})
280
298
with transaction .atomic ():
281
299
result = manager .update_pipeline (
282
300
pipeline_template = template .pipeline_template ,
@@ -293,6 +311,17 @@ def update(self, request, *args, **kwargs):
293
311
294
312
serializer .validated_data ["pipeline_template" ] = template .pipeline_template
295
313
template_labels = serializer .validated_data .pop ("template_labels" )
314
+ if webhook_config :
315
+ apply_result = apply_webhook_configs (webhook_config , str (serializer .instance .id ))
316
+ if not apply_result ["result" ]:
317
+ message = apply_result ["message" ]
318
+ logger .error (message )
319
+ return Response (
320
+ {"detail" : ErrorDetail (message , err_code .REQUEST_PARAM_INVALID .code )}, exception = True
321
+ )
322
+ elif not webhook_config and get_webhook_configs ([str (serializer .instance .id )]):
323
+ clear_scope_webhooks (WebhookScopeType .TEMPLATE .value , [str (serializer .instance .id )])
324
+
296
325
self .perform_update (serializer )
297
326
self ._sync_template_lables (serializer .instance .id , template_labels )
298
327
# 发送信号
@@ -332,6 +361,11 @@ def destroy(self, request, *args, **kwargs):
332
361
relation_queryset = TemplateRelationship .objects .filter (ancestor_template_id = pipeline_template_id )
333
362
for relation in relation_queryset :
334
363
relation .templatescheme_set .clear ()
364
+ clear_result = clear_scope_webhooks (WebhookScopeType .TEMPLATE .value , [template .id ])
365
+ if not clear_result ["result" ]:
366
+ message = clear_result ["message" ]
367
+ logger .error (message )
368
+ return Response ({"detail" : ErrorDetail (message , err_code .REQUEST_PARAM_INVALID .code )}, exception = True )
335
369
# 删除流程模板
336
370
template .is_deleted = True
337
371
template .save ()
0 commit comments