diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index a3083b0bb1..a8834186a6 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -335,7 +335,9 @@ class WorkflowJobNode(WorkflowNodeBase): # or labels, because they do not propogate WFJT-->node at all # Combine WFJT prompts with node here, WFJT at higher level - node_prompts_data.update(wj_prompts_data) + # Empty string values on the workflow job (e.g. from IaC setting limit: "") + # should not override a node's explicit non-empty prompt value + node_prompts_data.update({k: v for k, v in wj_prompts_data.items() if v != ''}) accepted_fields, ignored_fields, errors = ujt_obj._accept_or_ignore_job_kwargs(**node_prompts_data) if errors: logger.info( diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index fade45333e..a02daef166 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -476,7 +476,7 @@ class NullablePromptPseudoField: return instance.char_prompts.get(self.field_name, None) def __set__(self, instance, value): - if value in (None, {}, ''): + if value in (None, {}): instance.char_prompts.pop(self.field_name, None) else: instance.char_prompts[self.field_name] = value