diff --git a/awx/api/serializers.py b/awx/api/serializers.py index d6aa39f706..e6b25953d1 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2322,6 +2322,9 @@ class WorkflowJobTemplateNodeSerializer(WorkflowNodeBaseSerializer): raise serializers.ValidationError({ "job_type": "%s is not a valid job type. The choices are %s." % ( attrs['char_prompts']['job_type'], job_types)}) + if self.instance is None and ('workflow_job_template' not in attrs or + attrs['workflow_job_template'] is None): + raise serializers.ValidationError({"workflow_job_template": "Workflow job template is missing during creation"}) ujt_obj = attrs.get('unified_job_template', None) if isinstance(ujt_obj, (WorkflowJobTemplate, SystemJobTemplate)): raise serializers.ValidationError({ diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 2848b38a4a..d109b43519 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -140,7 +140,6 @@ class WorkflowNodeBase(CreatedModifiedModel): 'inventory', 'credential', 'char_prompts'] class WorkflowJobTemplateNode(WorkflowNodeBase): - # TODO: Ensure the API forces workflow_job_template being set workflow_job_template = models.ForeignKey( 'WorkflowJobTemplate', related_name='workflow_job_template_nodes', @@ -149,7 +148,7 @@ class WorkflowJobTemplateNode(WorkflowNodeBase): default=None, on_delete=models.CASCADE, ) - + def get_absolute_url(self): return reverse('api:workflow_job_template_node_detail', args=(self.pk,))