diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 66ca32764a..31126da821 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2709,18 +2709,15 @@ class WorkflowJobLaunchSerializer(BaseSerializer): variables_needed_to_start = serializers.ReadOnlyField() survey_enabled = serializers.SerializerMethodField() extra_vars = VerbatimField(required=False, write_only=True) - warnings = serializers.SerializerMethodField() workflow_job_template_data = serializers.SerializerMethodField() class Meta: model = WorkflowJobTemplate - fields = ('can_start_without_user_input', 'extra_vars', 'warnings', + fields = ('can_start_without_user_input', 'extra_vars', 'survey_enabled', 'variables_needed_to_start', + 'node_templates_missing', 'node_prompts_rejected', 'workflow_job_template_data') - def get_warnings(self, obj): - return obj.get_warnings() - def get_survey_enabled(self, obj): if obj: return obj.survey_enabled and 'spec' in obj.survey_spec diff --git a/awx/api/views.py b/awx/api/views.py index 7c22bdf57f..965078727a 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -2946,7 +2946,10 @@ class WorkflowJobTemplateLaunch(WorkflowsEnforcementMixin, RetrieveAPIView): always_allow_superuser = False def update_raw_data(self, data): - obj = self.get_object() + try: + obj = self.get_object() + except PermissionDenied: + return data extra_vars = data.pop('extra_vars', None) or {} if obj: for v in obj.variables_needed_to_start: diff --git a/awx/main/models/workflow.py b/awx/main/models/workflow.py index 09870cbc18..a92fbd5560 100644 --- a/awx/main/models/workflow.py +++ b/awx/main/models/workflow.py @@ -134,7 +134,7 @@ class WorkflowNodeBase(CreatedModifiedModel): scan_errors = ujt_obj._extra_job_type_errors(accepted_fields) ignored_dict.update(scan_errors) for fd in ['inventory', 'credential']: - if getattr(ujt_obj, fd) is None and not (ask_for_vars_dict.get(fd, False) and fd in prompts_dict): + if getattr(ujt_obj, "{}_id".format(fd)) is None and not (ask_for_vars_dict.get(fd, False) and fd in prompts_dict): missing_dict[fd] = 'Job Template does not have this field and workflow node does not provide it' data = {} @@ -421,18 +421,22 @@ class WorkflowJobTemplate(UnifiedJobTemplate, WorkflowJobOptions, SurveyJobTempl def can_start_without_user_input(self): '''Return whether WFJT can be launched without survey passwords.''' - return not bool(self.variables_needed_to_start) + return not bool( + self.variables_needed_to_start or + self.node_templates_missing() or + self.node_prompts_rejected()) - def get_warnings(self): - warning_data = {} - for node in self.workflow_job_template_nodes.all(): - if node.unified_job_template is None: - warning_data[node.pk] = 'Node is missing a linked unified_job_template' - continue + def node_templates_missing(self): + return [node.pk for node in self.workflow_job_template_nodes.filter( + unified_job_template__isnull=True).all()] + + def node_prompts_rejected(self): + node_list = [] + for node in self.workflow_job_template_nodes.select_related('unified_job_template').all(): node_prompts_warnings = node.get_prompts_warnings() if node_prompts_warnings: - warning_data[node.pk] = node_prompts_warnings - return warning_data + node_list.append(node.pk) + return node_list def user_copy(self, user): new_wfjt = self.copy_unified_jt()