(self, instance: Dict, with_valid=True)
| 513 | |
| 514 | @transaction.atomic |
| 515 | def edit(self, instance: Dict, with_valid=True): |
| 516 | from trigger.handler.simple_tools import deploy, undeploy |
| 517 | |
| 518 | if with_valid: |
| 519 | self.is_valid() |
| 520 | TriggerEditRequest(data=instance).is_valid(raise_exception=True) |
| 521 | trigger_id = self.data.get('trigger_id') |
| 522 | workspace_id = self.data.get('workspace_id') |
| 523 | trigger = Trigger.objects.filter(workspace_id=workspace_id, id=trigger_id).first() |
| 524 | if not trigger: |
| 525 | raise serializers.ValidationError(_('Trigger not found')) |
| 526 | |
| 527 | trigger_direct_edit_field_list = ['name', 'desc', 'trigger_type', 'trigger_setting', 'meta', 'is_active'] |
| 528 | trigger_deploy_edit_field_list = ['trigger_type', 'trigger_setting', 'is_active'] |
| 529 | # is need to redeploy |
| 530 | need_redeploy = any(field in instance for field in trigger_deploy_edit_field_list) |
| 531 | |
| 532 | for field in trigger_direct_edit_field_list: |
| 533 | if field in instance: |
| 534 | trigger.__setattr__(field, instance.get(field)) |
| 535 | trigger.save() |
| 536 | # 处理trigger task |
| 537 | trigger_tasks = instance.get('trigger_task') |
| 538 | |
| 539 | if trigger_tasks is not None: |
| 540 | # 检查是否为空列表 |
| 541 | if not trigger_tasks: |
| 542 | raise serializers.ValidationError(_('Trigger must have at least one task')) |
| 543 | |
| 544 | is_active_map = TriggerSerializer.batch_get_source_active_status(trigger_tasks) |
| 545 | |
| 546 | trigger_task_model_list = [TriggerTask( |
| 547 | id=task_data.get('id') or uuid.uuid7(), |
| 548 | trigger_id=trigger_id, |
| 549 | source_type=task_data.get('source_type'), |
| 550 | source_id=task_data.get('source_id'), |
| 551 | is_active=is_active_map.get((task_data.get('source_type'), task_data.get('source_id'))) or False, |
| 552 | parameter=task_data.get('parameter', []), |
| 553 | meta=task_data.get('meta', {}) |
| 554 | ) for task_data in trigger_tasks] |
| 555 | |
| 556 | TriggerTask.objects.filter(trigger_id=trigger_id).delete() |
| 557 | |
| 558 | TriggerTask.objects.bulk_create(trigger_task_model_list) |
| 559 | else: |
| 560 | # 用户没提交 trigger_task 字段,确保数据库中有 task |
| 561 | if not TriggerTask.objects.filter(trigger_id=trigger_id).exists(): |
| 562 | raise serializers.ValidationError(_('Trigger must have at least one task')) |
| 563 | |
| 564 | # 重新部署触发器任务 |
| 565 | if need_redeploy: |
| 566 | if trigger.is_active and trigger.trigger_type == 'SCHEDULED': |
| 567 | deploy(TriggerModelSerializer(trigger).data, **{}) |
| 568 | else: |
| 569 | undeploy(TriggerModelSerializer(trigger).data, **{}) |
| 570 | |
| 571 | return self.one(with_valid=False) |
| 572 |
no test coverage detected