diff --git a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js index 1438f89f37..9cd73e1da7 100644 --- a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js +++ b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js @@ -37,8 +37,7 @@ $scope.mode = "add"; $scope.parseType = 'yaml'; $scope.credentialNotPresent = false; - $scope.canChangeProject = true; - $scope.canChangeInventory = true; + $scope.canGetAllRelatedResources = true; md5Setup({ scope: $scope, diff --git a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js index 5e38774766..b25905e7bf 100644 --- a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js +++ b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js @@ -18,7 +18,7 @@ export default 'Empty', 'Prompt', 'ToJSON', 'GetChoices', 'CallbackHelpInit', 'InitiatePlaybookRun' , 'initSurvey', '$state', 'CreateSelect2', 'ToggleNotification','$q', 'InstanceGroupsService', 'InstanceGroupsData', 'MultiCredentialService', 'availableLabels', - 'canChangeProject', 'canChangeInventory', 'jobTemplateData', 'ParseVariableString', + 'canGetProject', 'canGetInventory', 'jobTemplateData', 'ParseVariableString', function( $filter, $scope, $rootScope, $location, $stateParams, JobTemplateForm, GenerateForm, Rest, Alert, @@ -26,7 +26,7 @@ export default ParseTypeChange, Wait, selectedLabels, i18n, Empty, Prompt, ToJSON, GetChoices, CallbackHelpInit, InitiatePlaybookRun, SurveyControllerInit, $state, CreateSelect2, ToggleNotification, $q, InstanceGroupsService, InstanceGroupsData, MultiCredentialService, availableLabels, - canChangeProject, canChangeInventory, jobTemplateData, ParseVariableString + canGetProject, canGetInventory, jobTemplateData, ParseVariableString ) { $scope.$watch('job_template_obj.summary_fields.user_capabilities.edit', function(val) { @@ -60,8 +60,6 @@ export default $scope.surveyTooltip = i18n._('Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch.'); $scope.job_tag_options = []; $scope.skip_tag_options = []; - $scope.canChangeProject = canChangeProject; - $scope.canChangeInventory = canChangeInventory; SurveyControllerInit({ scope: $scope, @@ -361,7 +359,8 @@ export default if($scope.job_template_obj.summary_fields.user_capabilities.edit) { MultiCredentialService.loadCredentials(jobTemplateData) .then(([selectedCredentials, credTypes, credTypeOptions, - credTags]) => { + credTags, credentialGetPermissionDenied]) => { + $scope.canGetAllRelatedResources = canGetProject && canGetInventory && !credentialGetPermissionDenied ? true : false; $scope.selectedCredentials = selectedCredentials; $scope.credential_types = credTypes; $scope.credentialTypeOptions = credTypeOptions; diff --git a/awx/ui/client/src/templates/job_templates/job-template.form.js b/awx/ui/client/src/templates/job_templates/job-template.form.js index ec7ec3a454..891eb72dab 100644 --- a/awx/ui/client/src/templates/job_templates/job-template.form.js +++ b/awx/ui/client/src/templates/job_templates/job-template.form.js @@ -85,7 +85,7 @@ function(NotificationsList, CompletedJobsList, i18n) { ngChange: 'job_template_form.inventory_name.$validate()', text: i18n._('Prompt on launch') }, - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canChangeInventory' + ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources' }, project: { label: i18n._('Project'), @@ -100,14 +100,14 @@ function(NotificationsList, CompletedJobsList, i18n) { dataTitle: i18n._('Project'), dataPlacement: 'right', dataContainer: "body", - ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canChangeProject', - awLookupWhen: 'canChangeProject' + ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources', + awLookupWhen: 'canGetAllRelatedResources' }, playbook: { label: i18n._('Playbook'), type:'select', ngOptions: 'book for book in playbook_options track by book', - ngDisabled: "!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canChangeProject", + ngDisabled: "!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate) || !canGetAllRelatedResources", id: 'playbook-select', required: true, column: 1, diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js index 9cdf912956..806a8bb442 100644 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js +++ b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential.service.js @@ -179,6 +179,8 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro let credDefers = []; let job_template_obj = data; + let credentialGetPermissionDenied = false; + // get machine credential if (data.related.credential) { Rest.setUrl(data.related.credential); @@ -189,6 +191,7 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro .catch(({data, status}) => { if (status === 403) { /* User doesn't have read access to the machine credential, so use summary_fields */ + credentialGetPermissionDenied = true; selectedCredentials.machine = job_template_obj.summary_fields.credential; selectedCredentials.machine.credential_type = job_template_obj.summary_fields.credential.credential_type_id; selectedCredentials.machine.readOnly = true; @@ -214,6 +217,7 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro .catch(({data, status}) => { if (status === 403) { /* User doesn't have read access to the vault credential, so use summary_fields */ + credentialGetPermissionDenied = true; selectedCredentials.vault = job_template_obj.summary_fields.vault_credential; selectedCredentials.vault.credential_type = job_template_obj.summary_fields.vault_credential.credential_type_id; selectedCredentials.vault.readOnly = true; @@ -240,6 +244,7 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro .catch(({data, status}) => { if (status === 403) { /* User doesn't have read access to the extra credentials, so use summary_fields */ + credentialGetPermissionDenied = true; selectedCredentials.extra = job_template_obj.summary_fields.extra_credentials; _.map(selectedCredentials.extra, (cred) => { cred.credential_type = cred.credential_type_id; @@ -271,7 +276,7 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro .updateCredentialTags(selectedCredentials, credTypeOptions); return [selectedCredentials, credTypes, credTypeOptions, - credTags]; + credTags, credentialGetPermissionDenied]; }); }; diff --git a/awx/ui/client/src/templates/main.js b/awx/ui/client/src/templates/main.js index cd578d5d21..564309fffe 100644 --- a/awx/ui/client/src/templates/main.js +++ b/awx/ui/client/src/templates/main.js @@ -150,7 +150,7 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplates. }); }); }], - canChangeProject: ['Rest', 'ProcessErrors', 'jobTemplateData', + canGetProject: ['Rest', 'ProcessErrors', 'jobTemplateData', function(Rest, ProcessErrors, jobTemplateData) { Rest.setUrl(jobTemplateData.related.project); return Rest.get() @@ -171,7 +171,7 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplates. return false; }); }], - canChangeInventory: ['Rest', 'ProcessErrors', 'jobTemplateData', + canGetInventory: ['Rest', 'ProcessErrors', 'jobTemplateData', function(Rest, ProcessErrors, jobTemplateData) { Rest.setUrl(jobTemplateData.related.inventory); return Rest.get()