From e4d661f6594491042590b91344723399c9ee3d5b Mon Sep 17 00:00:00 2001 From: Michael Abashian Date: Fri, 6 Jan 2017 21:13:14 -0500 Subject: [PATCH 01/25] Fixed the column widths on the permissions modals --- .../add-rbac-resource/rbac-resource.partial.html | 2 +- .../rbac-selected-list.directive.js | 12 ++++++++++-- .../add-rbac-user-team/rbac-user-team.partial.html | 2 +- .../rbac-multiselect/permissionsUsers.list.js | 2 +- .../rbac-multiselect-list.directive.js | 13 +++++++++++++ .../shared/list-generator/list-generator.factory.js | 2 +- 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html b/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html index 75eaeb8302..f138e108d0 100644 --- a/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html +++ b/awx/ui/client/src/access/add-rbac-resource/rbac-resource.partial.html @@ -6,7 +6,7 @@
- {{ object.name }} + {{ object.name || object.username }}
Add Permissions
diff --git a/awx/ui/client/src/access/add-rbac-user-team/rbac-selected-list.directive.js b/awx/ui/client/src/access/add-rbac-user-team/rbac-selected-list.directive.js index f65d0324ad..7a66606e5f 100644 --- a/awx/ui/client/src/access/add-rbac-user-team/rbac-selected-list.directive.js +++ b/awx/ui/client/src/access/add-rbac-user-team/rbac-selected-list.directive.js @@ -42,8 +42,6 @@ export default ['$compile','templateUrl', 'i18n', 'generateList', list.listTitleBadge = false; - // @issue - fix field.columnClass values for this view - switch(scope.resourceType){ case 'projects': @@ -51,6 +49,8 @@ export default ['$compile','templateUrl', 'i18n', 'generateList', name: list.fields.name, scm_type: list.fields.scm_type }; + list.fields.name.columnClass = 'col-md-5 col-sm-5 col-xs-10'; + list.fields.scm_type.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'inventories': @@ -58,6 +58,8 @@ export default ['$compile','templateUrl', 'i18n', 'generateList', name: list.fields.name, organization: list.fields.organization }; + list.fields.name.columnClass = 'col-md-5 col-sm-5 col-xs-10'; + list.fields.organization.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'job_templates': @@ -67,6 +69,8 @@ export default ['$compile','templateUrl', 'i18n', 'generateList', name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-5 col-sm-5 col-xs-10'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'workflow_templates': @@ -77,12 +81,16 @@ export default ['$compile','templateUrl', 'i18n', 'generateList', name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-5 col-sm-5 col-xs-10'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'credentials': list.fields = { name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-5 col-sm-5 col-xs-10'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; } list.fields = _.each(list.fields, (field) => field.nosort = true); diff --git a/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html b/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html index 975870944c..a89621eda8 100644 --- a/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html +++ b/awx/ui/client/src/access/add-rbac-user-team/rbac-user-team.partial.html @@ -7,7 +7,7 @@
- {{ owner.name }} + {{ owner.name || owner.username }}
Add Permissions
diff --git a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js index 8955d30aa0..58a5605281 100644 --- a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js +++ b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js @@ -34,7 +34,7 @@ username: { key: true, label: 'Username', - columnClass: 'col-md-3 col-sm-3 col-xs-9' + columnClass: 'col-md-5 col-sm-5 col-xs-11' }, }, diff --git a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js index da80fa4a58..0e277c3f5f 100644 --- a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js +++ b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js @@ -43,6 +43,8 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL name: list.fields.name, scm_type: list.fields.scm_type }; + list.fields.name.columnClass = 'col-md-6 col-sm-6 col-xs-11'; + list.fields.scm_type.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'Inventories': @@ -50,6 +52,8 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL name: list.fields.name, organization: list.fields.organization }; + list.fields.name.columnClass = 'col-md-6 col-sm-6 col-xs-11'; + list.fields.organization.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'JobTemplates': @@ -59,6 +63,8 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-6 col-sm-6 col-xs-11'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'WorkflowTemplates': @@ -69,6 +75,8 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-6 col-sm-6 col-xs-11'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; break; case 'Users': list.fields = { @@ -76,12 +84,17 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL first_name: list.fields.first_name, last_name: list.fields.last_name }; + list.fields.username.columnClass = 'col-md-5 col-sm-5 col-xs-11'; + list.fields.first_name.columnClass = 'col-md-3 col-sm-3 hidden-xs'; + list.fields.last_name.columnClass = 'col-md-3 col-sm-3 hidden-xs'; break; default: list.fields = { name: list.fields.name, description: list.fields.description }; + list.fields.name.columnClass = 'col-md-6 col-sm-6 col-xs-11'; + list.fields.description.columnClass = 'col-md-5 col-sm-5 hidden-xs'; } list_html = generateList.build({ diff --git a/awx/ui/client/src/shared/list-generator/list-generator.factory.js b/awx/ui/client/src/shared/list-generator/list-generator.factory.js index fd664dc167..9efb118a2c 100644 --- a/awx/ui/client/src/shared/list-generator/list-generator.factory.js +++ b/awx/ui/client/src/shared/list-generator/list-generator.factory.js @@ -311,7 +311,7 @@ export default ['$location', '$compile', '$rootScope', 'Attr', 'Icon', } if (list.multiSelect) { - innerTable += ''; + innerTable += ''; } // Change layout if a lookup list, place radio buttons before labels From eeebf2ddf846e254e100b57e4da0cfd63626dee8 Mon Sep 17 00:00:00 2001 From: Ken Hoes Date: Mon, 9 Jan 2017 09:03:20 -0500 Subject: [PATCH 02/25] Fixing various audit bugs --- .../streamDetailModal.block.less | 1 + .../streamDetailModal.partial.html | 2 +- .../dashboard/lists/dashboard-list.block.less | 19 +++---------------- awx/ui/client/src/forms/Groups.js | 2 +- awx/ui/client/src/forms/Inventories.js | 2 +- awx/ui/client/src/helpers/Jobs.js | 2 +- .../add/inventory-add.controller.js | 10 ++++++++-- .../edit/inventory-edit.controller.js | 2 +- awx/ui/client/src/lists/AllJobs.js | 2 ++ awx/ui/client/src/lists/Projects.js | 4 ++-- awx/ui/client/src/partials/jobs.html | 2 +- .../list-generator/list-generator.factory.js | 2 +- 12 files changed, 23 insertions(+), 27 deletions(-) diff --git a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.block.less b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.block.less index 6b00dc76f5..9e0cc73720 100644 --- a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.block.less +++ b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.block.less @@ -35,5 +35,6 @@ margin-bottom: 0; max-height: 200px; overflow: scroll; + overflow-x: auto; color: @as-detail-changes-txt; } diff --git a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html index f5d5acf553..67e4452ebc 100644 --- a/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html +++ b/awx/ui/client/src/activity-stream/streamDetailModal/streamDetailModal.partial.html @@ -22,7 +22,7 @@
diff --git a/awx/ui/client/src/dashboard/lists/dashboard-list.block.less b/awx/ui/client/src/dashboard/lists/dashboard-list.block.less index 102188034d..0903b01c74 100644 --- a/awx/ui/client/src/dashboard/lists/dashboard-list.block.less +++ b/awx/ui/client/src/dashboard/lists/dashboard-list.block.less @@ -32,34 +32,21 @@ } .DashboardList-viewAll { - color: @btn-txt; - background-color: @btn-bg; - font-size: 12px; - border: 1px solid @default-icon-hov; - border-radius: 5px; + font-size: 11px; margin-right: 15px; - margin-top: 10px; + margin-top: 13px; margin-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-bottom: 5px; padding-top: 5px; - transition: background-color 0.2s; -} - -.DashboardList-viewAll:hover { - color: @btn-txt; - background-color: @btn-bg-hov; -} - -.DashboardList-viewAll:focus { - color: @btn-txt; } .DashboardList-container { flex: 1; width: 100%; padding: 20px; + padding-top: 0; } .DashboardList-tableHeader--name { diff --git a/awx/ui/client/src/forms/Groups.js b/awx/ui/client/src/forms/Groups.js index b5c876c3b9..22c33094f1 100644 --- a/awx/ui/client/src/forms/Groups.js +++ b/awx/ui/client/src/forms/Groups.js @@ -43,7 +43,7 @@ export default label: 'Variables', type: 'textarea', class: 'Form-textAreaLabel Form-formGroup--fullWidth', - rows: 12, + rows: 6, 'default': '---', dataTitle: 'Group Variables', dataPlacement: 'right', diff --git a/awx/ui/client/src/forms/Inventories.js b/awx/ui/client/src/forms/Inventories.js index e7106b8277..b78e16064d 100644 --- a/awx/ui/client/src/forms/Inventories.js +++ b/awx/ui/client/src/forms/Inventories.js @@ -78,7 +78,7 @@ angular.module('InventoryFormDefinition', ['ScanJobsListDefinition']) }, close: { ngClick: 'formCancel()', - ngHide: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' + ngShow: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' }, save: { ngClick: 'formSave()', diff --git a/awx/ui/client/src/helpers/Jobs.js b/awx/ui/client/src/helpers/Jobs.js index 9f64ac8906..d7649d1c33 100644 --- a/awx/ui/client/src/helpers/Jobs.js +++ b/awx/ui/client/src/helpers/Jobs.js @@ -233,7 +233,7 @@ export default hdr: hdr, body: (action_label === 'cancel' || job.status === 'new') ? cancelBody : deleteBody, action: action, - actionText: (action_label === 'cancel' || job.status === 'new') ? "YES" : "DELETE" + actionText: (action_label === 'cancel' || job.status === 'new') ? "OK" : "DELETE" }); }); diff --git a/awx/ui/client/src/inventories/add/inventory-add.controller.js b/awx/ui/client/src/inventories/add/inventory-add.controller.js index 7f08e716a6..e6f9b7e3a3 100644 --- a/awx/ui/client/src/inventories/add/inventory-add.controller.js +++ b/awx/ui/client/src/inventories/add/inventory-add.controller.js @@ -11,10 +11,16 @@ */ function InventoriesAdd($scope, $rootScope, $compile, $location, $log, - $stateParams, GenerateForm, InventoryForm, Rest, Alert, ProcessErrors, + $stateParams, GenerateForm, InventoryForm, rbacUiControlService, Rest, Alert, ProcessErrors, ClearScope, GetBasePath, ParseTypeChange, Wait, ToJSON, $state) { + $scope.canAdd = false; + rbacUiControlService.canAdd(GetBasePath('inventory')) + .then(function(canAdd) { + $scope.canAdd = canAdd; + }); + Rest.setUrl(GetBasePath('inventory')); Rest.options() .success(function(data) { @@ -91,7 +97,7 @@ function InventoriesAdd($scope, $rootScope, $compile, $location, $log, } export default ['$scope', '$rootScope', '$compile', '$location', - '$log', '$stateParams', 'GenerateForm', 'InventoryForm', 'Rest', 'Alert', + '$log', '$stateParams', 'GenerateForm', 'InventoryForm', 'rbacUiControlService', 'Rest', 'Alert', 'ProcessErrors', 'ClearScope', 'GetBasePath', 'ParseTypeChange', 'Wait', 'ToJSON', '$state', InventoriesAdd ]; diff --git a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js index ba6de0f183..3e26dec8dc 100644 --- a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js +++ b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js @@ -32,7 +32,7 @@ function InventoriesEdit($scope, $rootScope, $compile, $location, form.formFieldSize = null; $scope.inventory_id = inventory_id; - $scope.$watch('invnentory_obj.summary_fields.user_capabilities.edit', function(val) { + $scope.$watch('inventory_obj.summary_fields.user_capabilities.edit', function(val) { if (val === false) { $scope.canAdd = false; } diff --git a/awx/ui/client/src/lists/AllJobs.js b/awx/ui/client/src/lists/AllJobs.js index 16a37e5c04..051375f157 100644 --- a/awx/ui/client/src/lists/AllJobs.js +++ b/awx/ui/client/src/lists/AllJobs.js @@ -16,6 +16,8 @@ export default index: false, hover: true, well: false, + title: false, + fields: { status: { label: '', diff --git a/awx/ui/client/src/lists/Projects.js b/awx/ui/client/src/lists/Projects.js index bf8fde2d03..0a03058242 100644 --- a/awx/ui/client/src/lists/Projects.js +++ b/awx/ui/client/src/lists/Projects.js @@ -42,14 +42,14 @@ export default scm_revision: { label: i18n._('Revision'), excludeModal: true, - columnClass: 'col-lg-3 col-md-2 col-sm-3 hidden-xs', + columnClass: 'col-lg-4 col-md-2 col-sm-3 hidden-xs', class: 'List-staticColumnAdjacent--monospace' }, scm_type: { label: i18n._('Type'), ngBind: 'project.type_label', excludeModal: true, - columnClass: 'col-lg-3 col-md-2 col-sm-3 hidden-xs' + columnClass: 'col-lg-2 col-md-2 col-sm-3 hidden-xs' }, last_updated: { label: i18n._('Last Updated'), diff --git a/awx/ui/client/src/partials/jobs.html b/awx/ui/client/src/partials/jobs.html index 00de9af821..46f7b09761 100644 --- a/awx/ui/client/src/partials/jobs.html +++ b/awx/ui/client/src/partials/jobs.html @@ -16,7 +16,7 @@ -
+
diff --git a/awx/ui/client/src/shared/list-generator/list-generator.factory.js b/awx/ui/client/src/shared/list-generator/list-generator.factory.js index fd664dc167..100ab608ba 100644 --- a/awx/ui/client/src/shared/list-generator/list-generator.factory.js +++ b/awx/ui/client/src/shared/list-generator/list-generator.factory.js @@ -134,7 +134,7 @@ export default ['$location', '$compile', '$rootScope', 'Attr', 'Icon', base, action, fld, cnt, field_action, fAction, itm; if (options.mode !== 'lookup') { - if (options.title !== false) { + if (options.title !== false && list.title !== false) { html += "
"; html += "
"; From 90be8644ec2a70f2281e967785bfa42782941794 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Mon, 9 Jan 2017 12:53:45 -0500 Subject: [PATCH 03/25] move error divs down a line --- .../scheduler/schedulerForm.partial.html | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html b/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html index b619ead47a..d68ebfe3b8 100644 --- a/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html +++ b/awx/ui/client/src/management-jobs/scheduler/schedulerForm.partial.html @@ -507,11 +507,15 @@
+ +
+ + +
Please enter the number of days you would like to keep this data.
Please enter a valid number.
Please enter a non-negative number.
Please enter a number smaller than 9999.
-
@@ -520,11 +524,15 @@
+ +
+ + +
Please enter the number of days you would like to keep this data.
Please enter a valid number.
Please enter a non-negative number.
Please enter a number smaller than 9999.
-
From 7816d8e39e2d832b28140eeae9e42ec572b84400 Mon Sep 17 00:00:00 2001 From: Ken Hoes Date: Mon, 9 Jan 2017 13:39:11 -0500 Subject: [PATCH 04/25] Fixing audit bugs --- awx/ui/client/legacy-styles/forms.less | 2 -- awx/ui/client/src/access/add-rbac.block.less | 4 ++++ .../auth-form/sub-forms/auth-azure.form.js | 4 ++-- .../auth-form/sub-forms/auth-github-org.form.js | 4 ++-- .../auth-form/sub-forms/auth-github-team.form.js | 4 ++-- .../auth-form/sub-forms/auth-github.form.js | 4 ++-- .../sub-forms/auth-google-oauth2.form.js | 4 ++-- .../auth-form/sub-forms/auth-ldap.form.js | 4 ++-- .../auth-form/sub-forms/auth-radius.form.js | 4 ++-- .../auth-form/sub-forms/auth-saml.form.js | 4 ++-- .../src/configuration/configuration.block.less | 13 +++++++++++++ .../jobs-form/configuration-jobs.form.js | 4 ++-- .../sub-forms/system-activity-stream.form.js | 4 ++-- .../system-form/sub-forms/system-logging.form.js | 4 ++-- .../system-form/sub-forms/system-misc.form.js | 4 ++-- .../ui-form/configuration-ui.form.js | 4 ++-- awx/ui/client/src/lists/Projects.js | 16 ++++++++-------- awx/ui/client/src/shared/modal/modal.less | 1 - awx/ui/templates/ui/index.html | 2 +- 19 files changed, 52 insertions(+), 38 deletions(-) diff --git a/awx/ui/client/legacy-styles/forms.less b/awx/ui/client/legacy-styles/forms.less index 89ff33dd03..8d44ec661a 100644 --- a/awx/ui/client/legacy-styles/forms.less +++ b/awx/ui/client/legacy-styles/forms.less @@ -44,8 +44,6 @@ color: @list-header-txt; font-size: 14px; font-weight: bold; - padding-bottom: 25px; - min-height: 45px; word-break: break-all; max-width: 90%; word-wrap: break-word; diff --git a/awx/ui/client/src/access/add-rbac.block.less b/awx/ui/client/src/access/add-rbac.block.less index 88f5b1211f..0bc6617ba4 100644 --- a/awx/ui/client/src/access/add-rbac.block.less +++ b/awx/ui/client/src/access/add-rbac.block.less @@ -51,6 +51,10 @@ padding-top: 20px; } +.AddPermissions-list { + margin-bottom: 20px; +} + .AddPermissions-list .List-searchRow { height: 0px; } diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js index 17b36e67fb..c780814f87 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js @@ -38,8 +38,8 @@ buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js index bd547cf8b1..81eeec8329 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js @@ -28,8 +28,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js index d43d8c01be..72af97b899 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js @@ -28,8 +28,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js index 03af137a7c..e95fef41b0 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js @@ -24,8 +24,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js index ac1c23545e..1aa8cbab30 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js @@ -36,8 +36,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js index 8d38fea688..824692ea9d 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js @@ -84,8 +84,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js index b16fd649dc..cec19eb122 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js @@ -29,8 +29,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js index ca2bb50dcb..7ef0735247 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js @@ -56,8 +56,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/configuration.block.less b/awx/ui/client/src/configuration/configuration.block.less index 0b2a1ea0ee..b25d36e400 100644 --- a/awx/ui/client/src/configuration/configuration.block.less +++ b/awx/ui/client/src/configuration/configuration.block.less @@ -12,6 +12,19 @@ float: right } +.Form-resetAll { + border: none; + padding: 0; + background-color: @white; + margin-right: auto; + color: @default-link; + font-size: 12px; + + &:hover { + color: @default-link-hov; + } +} + .Form-tab { min-width: 77px; } diff --git a/awx/ui/client/src/configuration/jobs-form/configuration-jobs.form.js b/awx/ui/client/src/configuration/jobs-form/configuration-jobs.form.js index caf0392c24..99e52498c2 100644 --- a/awx/ui/client/src/configuration/jobs-form/configuration-jobs.form.js +++ b/awx/ui/client/src/configuration/jobs-form/configuration-jobs.form.js @@ -64,8 +64,8 @@ buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/system-form/sub-forms/system-activity-stream.form.js b/awx/ui/client/src/configuration/system-form/sub-forms/system-activity-stream.form.js index 09cf80eccd..3dc7fd89f7 100644 --- a/awx/ui/client/src/configuration/system-form/sub-forms/system-activity-stream.form.js +++ b/awx/ui/client/src/configuration/system-form/sub-forms/system-activity-stream.form.js @@ -22,8 +22,8 @@ buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js b/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js index ee99024b45..6fcfa0dda5 100644 --- a/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js +++ b/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js @@ -48,8 +48,8 @@ buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/system-form/sub-forms/system-misc.form.js b/awx/ui/client/src/configuration/system-form/sub-forms/system-misc.form.js index 690418f323..892dfd0bc0 100644 --- a/awx/ui/client/src/configuration/system-form/sub-forms/system-misc.form.js +++ b/awx/ui/client/src/configuration/system-form/sub-forms/system-misc.form.js @@ -26,8 +26,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/configuration/ui-form/configuration-ui.form.js b/awx/ui/client/src/configuration/ui-form/configuration-ui.form.js index 0ef2cb44ff..e566c076d1 100644 --- a/awx/ui/client/src/configuration/ui-form/configuration-ui.form.js +++ b/awx/ui/client/src/configuration/ui-form/configuration-ui.form.js @@ -32,8 +32,8 @@ export default ['i18n', function(i18n) { buttons: { reset: { ngClick: 'vm.resetAllConfirm()', - label: i18n._('Reset All'), - class: 'Form-button--left Form-cancelButton' + label: i18n._('Revert all to default'), + class: 'Form-resetAll' }, cancel: { ngClick: 'vm.formCancel()', diff --git a/awx/ui/client/src/lists/Projects.js b/awx/ui/client/src/lists/Projects.js index bf8fde2d03..e64310b458 100644 --- a/awx/ui/client/src/lists/Projects.js +++ b/awx/ui/client/src/lists/Projects.js @@ -61,6 +61,14 @@ export default }, actions: { + refresh: { + mode: 'all', + awToolTip: i18n._("Refresh the page"), + ngClick: "refresh()", + ngShow: "socketStatus === 'error'", + actionClass: 'btn List-buttonDefault', + buttonContent: i18n._('REFRESH') + }, add: { mode: 'all', // One of: edit, select, all ngClick: 'addProject()', @@ -68,14 +76,6 @@ export default actionClass: 'btn List-buttonSubmit', buttonContent: '+ ' + i18n._('ADD'), ngShow: "canAdd" - }, - refresh: { - mode: 'all', - awToolTip: i18n._("Refresh the page"), - ngClick: "refresh()", - ngShow: "socketStatus == 'error'", - actionClass: 'btn List-buttonDefault', - buttonContent: i18n._('REFRESH') } }, diff --git a/awx/ui/client/src/shared/modal/modal.less b/awx/ui/client/src/shared/modal/modal.less index da254e07f6..2b90315afa 100644 --- a/awx/ui/client/src/shared/modal/modal.less +++ b/awx/ui/client/src/shared/modal/modal.less @@ -13,7 +13,6 @@ .Modal-header { display: flex; width: 100%; - margin-bottom: 25px; } .Modal-title { diff --git a/awx/ui/templates/ui/index.html b/awx/ui/templates/ui/index.html index 9c8d91918f..3b29937bc0 100644 --- a/awx/ui/templates/ui/index.html +++ b/awx/ui/templates/ui/index.html @@ -81,7 +81,7 @@
From 69527fdb084e49b4bb55b22eea259e1785735c2d Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 9 Jan 2017 15:10:02 -0500 Subject: [PATCH 05/25] unicode conversion of paths in inventory import --- awx/main/management/commands/inventory_import.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/awx/main/management/commands/inventory_import.py b/awx/main/management/commands/inventory_import.py index 5c8c9df9c4..c1399e1a11 100644 --- a/awx/main/management/commands/inventory_import.py +++ b/awx/main/management/commands/inventory_import.py @@ -64,7 +64,7 @@ class MemObject(object): all_vars = {} files_found = 0 for suffix in ('', '.yml', '.yaml', '.json'): - path = ''.join([base_path, suffix]) + path = ''.join([base_path, suffix]).encode("utf-8") if not os.path.exists(path): continue if not os.path.isfile(path): @@ -462,7 +462,7 @@ class ExecutableJsonLoader(BaseLoader): # to set their variables for k,v in self.all_group.all_hosts.iteritems(): if 'hostvars' not in _meta: - data = self.command_to_json([self.source, '--host', k]) + data = self.command_to_json([self.source, '--host', k.encode("utf-8")]) else: data = _meta['hostvars'].get(k, {}) if isinstance(data, dict): From 1e5b3fbe31f21dbf529be4d4dd6f769bb22ec4e1 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Mon, 9 Jan 2017 16:43:02 -0500 Subject: [PATCH 06/25] handle undefined (empty) ec2 variable textarea * Adding a check for undefined, null check was not enough. applyDefaults() is only called in 'add' mode. This method is responsible for settings the fields value to the passed in 'default'. Since applyDefaults() isn't called in 'edit' mode, the field has a value of undefined. --- .../src/inventories/manage/groups/groups-edit.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js b/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js index 1b54bc92f1..ae90cae8bf 100644 --- a/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js +++ b/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js @@ -123,7 +123,7 @@ export default ['$state', '$stateParams', '$scope', 'ToggleNotification', 'Parse $scope.source = source; if (source.value === 'ec2' || source.value === 'custom' || source.value === 'vmware' || source.value === 'openstack') { - $scope[source.value + '_variables'] = $scope[source.value + '_variables'] === null ? '---' : $scope[source.value + '_variables']; + $scope[source.value + '_variables'] = $scope[source.value + '_variables'] === (null || undefined) ? '---' : $scope[source.value + '_variables']; ParseTypeChange({ scope: $scope, field_id: source.value + '_variables', From a3d8cbde253b3ba473f872322899677542675b56 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 08:51:33 -0500 Subject: [PATCH 07/25] add in defaults for cleanup facts management job --- awx/main/management/commands/cleanup_facts.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/awx/main/management/commands/cleanup_facts.py b/awx/main/management/commands/cleanup_facts.py index a709f81c1a..f6b3c76b26 100644 --- a/awx/main/management/commands/cleanup_facts.py +++ b/awx/main/management/commands/cleanup_facts.py @@ -96,12 +96,12 @@ class Command(BaseCommand): option_list = BaseCommand.option_list + ( make_option('--older_than', dest='older_than', - default=None, - help='Specify the relative time to consider facts older than (w)eek (d)ay or (y)ear (i.e. 5d, 2w, 1y).'), + default='30d', + help='Specify the relative time to consider facts older than (w)eek (d)ay or (y)ear (i.e. 5d, 2w, 1y). Defaults to 30d.'), make_option('--granularity', dest='granularity', - default=None, - help='Window duration to group same hosts by for deletion (w)eek (d)ay or (y)ear (i.e. 5d, 2w, 1y).'), + default='1w', + help='Window duration to group same hosts by for deletion (w)eek (d)ay or (y)ear (i.e. 5d, 2w, 1y). Defaults to 1w.'), make_option('--module', dest='module', default=None, From 4990a59fa747d307d66a23721f4346baa430adc2 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 09:38:52 -0500 Subject: [PATCH 08/25] mark inventory scripts as added in 2.1.0 --- awx/api/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/awx/api/views.py b/awx/api/views.py index 48892e7f00..7d0586b296 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -1553,12 +1553,14 @@ class InventoryScriptList(ListCreateAPIView): model = CustomInventoryScript serializer_class = CustomInventoryScriptSerializer + new_in_210 = True class InventoryScriptDetail(RetrieveUpdateDestroyAPIView): model = CustomInventoryScript serializer_class = CustomInventoryScriptSerializer + new_in_210 = True def destroy(self, request, *args, **kwargs): instance = self.get_object() From 8caf355857e2339db6f75c9bf44be26448478c44 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 09:47:54 -0500 Subject: [PATCH 09/25] handle reload when deleting org card under edit --- .../list/organizations-list.controller.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/awx/ui/client/src/organizations/list/organizations-list.controller.js b/awx/ui/client/src/organizations/list/organizations-list.controller.js index 9bae54afc8..769a844354 100644 --- a/awx/ui/client/src/organizations/list/organizations-list.controller.js +++ b/awx/ui/client/src/organizations/list/organizations-list.controller.js @@ -127,6 +127,16 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', }); }; + function isDeletedOrganizationBeingEdited(deleted_organization_id, editing_organization_id) { + if (editing_organization_id === undefined) { + return false; + } + if (deleted_organization_id == editing_organization_id) { + return true; + } + return false; + } + $scope.deleteOrganization = function(id, name) { var action = function() { @@ -137,7 +147,11 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', Rest.destroy() .success(function() { Wait('stop'); - $state.reload('organizations'); + if (isDeletedOrganizationBeingEdited(id, $stateParams.organization_id) === true) { + $state.go('^', null, { reload: true }); + } else { + $state.reload('organizations'); + } }) .error(function(data, status) { ProcessErrors($scope, data, status, null, { From 78d8d4139a50baa8d89915e2cb17a9e4ea785631 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 10:09:29 -0500 Subject: [PATCH 10/25] workflow docs revisions after label copy change --- docs/workflow.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/workflow.md b/docs/workflow.md index fcabb9891f..43cc6104f9 100644 --- a/docs/workflow.md +++ b/docs/workflow.md @@ -47,11 +47,11 @@ Workflow job summary: ``` ### Workflow Copy and Relaunch -Other than the normal way of creating workflow job templates, it is also possible to copy existing workflow job templates. The resulting new workflow job template will be identical to which it copies from, except for `name` field which will be appended a text to indicate it's a copy. +Other than the normal way of creating workflow job templates, it is also possible to copy existing workflow job templates. The resulting new workflow job template will be mostly identical to which it copies from, except for `name` field which will be appended a text to indicate it's a copy. -Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, labels, 'launch_type' and survey-related fields (survey_passwords, survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions on determining which workflow job template node is copied. In specific, a workflow job template is allowed to be copied if the user has at least read permission on all related resources like credential and job template. On the other hand, schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. +Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, and survey-related fields (survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions on determining which workflow job template node is copied. In specific, a workflow job template is allowed to be copied if the user has at least read permission on all related resources like credential and job template. On the other hand, schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. -Worflow jobs cannot be copied directly, instead a workflow job is implicitly copied when it needs to relaunch. Relaunching an existing workflow job is done by POSTing to endpoint `/workflow_jobs/\d+/relaunch/`. What happens next is the original workflow job is copied to create a new workflow job. The new workflow job then gets a copy of all nodes of the original as well as the topology they bear. Finally the full-fledged new workflow job is triggered to run, thus fulfilling the purpose of relaunch. +Workflow jobs cannot be copied directly, instead a workflow job is implicitly copied when it needs to relaunch. Relaunching an existing workflow job is done by POSTing to endpoint `/workflow_jobs/\d+/relaunch/`. What happens next is the original workflow job is copied to create a new workflow job. The new workflow job then gets a copy of all nodes of the original as well as the topology they bear. Finally the full-fledged new workflow job is triggered to run, thus fulfilling the purpose of relaunch. Survey password-type answers should also be redacted in the relaunched version of the workflow job. ## Test Coverage ### CRUD-related From 7f6551ec20f128a639494a27127d29ac4b03f616 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 10:12:09 -0500 Subject: [PATCH 11/25] consider org id in url an int --- .../src/organizations/list/organizations-list.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/awx/ui/client/src/organizations/list/organizations-list.controller.js b/awx/ui/client/src/organizations/list/organizations-list.controller.js index 769a844354..3849c123a4 100644 --- a/awx/ui/client/src/organizations/list/organizations-list.controller.js +++ b/awx/ui/client/src/organizations/list/organizations-list.controller.js @@ -131,7 +131,7 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', if (editing_organization_id === undefined) { return false; } - if (deleted_organization_id == editing_organization_id) { + if (deleted_organization_id === editing_organization_id) { return true; } return false; @@ -147,7 +147,7 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', Rest.destroy() .success(function() { Wait('stop'); - if (isDeletedOrganizationBeingEdited(id, $stateParams.organization_id) === true) { + if (isDeletedOrganizationBeingEdited(id, parseInt($stateParams.organization_id)) === true) { $state.go('^', null, { reload: true }); } else { $state.reload('organizations'); From 52c861503bf0242aee61d14393adde34f7b5305c Mon Sep 17 00:00:00 2001 From: Ken Hoes Date: Tue, 10 Jan 2017 10:15:00 -0500 Subject: [PATCH 12/25] Updated fix for form titles --- awx/ui/client/legacy-styles/forms.less | 1 + awx/ui/client/src/shared/modal/modal.less | 1 + 2 files changed, 2 insertions(+) diff --git a/awx/ui/client/legacy-styles/forms.less b/awx/ui/client/legacy-styles/forms.less index 8d44ec661a..570a096c7e 100644 --- a/awx/ui/client/legacy-styles/forms.less +++ b/awx/ui/client/legacy-styles/forms.less @@ -47,6 +47,7 @@ word-break: break-all; max-width: 90%; word-wrap: break-word; + margin-bottom: 20px; } .Form-secondaryTitle{ diff --git a/awx/ui/client/src/shared/modal/modal.less b/awx/ui/client/src/shared/modal/modal.less index 2b90315afa..da254e07f6 100644 --- a/awx/ui/client/src/shared/modal/modal.less +++ b/awx/ui/client/src/shared/modal/modal.less @@ -13,6 +13,7 @@ .Modal-header { display: flex; width: 100%; + margin-bottom: 25px; } .Modal-title { From 30fb6fcdd375ae929f8438dc1faf9da862c5ee4e Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 11:14:44 -0500 Subject: [PATCH 13/25] update clarification on what WFJT copy does --- docs/workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/workflow.md b/docs/workflow.md index 43cc6104f9..bb2f49e5c4 100644 --- a/docs/workflow.md +++ b/docs/workflow.md @@ -49,7 +49,7 @@ Workflow job summary: ### Workflow Copy and Relaunch Other than the normal way of creating workflow job templates, it is also possible to copy existing workflow job templates. The resulting new workflow job template will be mostly identical to which it copies from, except for `name` field which will be appended a text to indicate it's a copy. -Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, and survey-related fields (survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions on determining which workflow job template node is copied. In specific, a workflow job template is allowed to be copied if the user has at least read permission on all related resources like credential and job template. On the other hand, schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. +Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, and survey-related fields (survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions copying workflow job template nodes. A workflow job template is allowed to be copied if the user has permission to add an equivalent workflow job template. If the user performing the copy does not have access to a node's related resources (job template, inventory, or credential), those related fields will be null in the copy's version of the node. Schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. Workflow jobs cannot be copied directly, instead a workflow job is implicitly copied when it needs to relaunch. Relaunching an existing workflow job is done by POSTing to endpoint `/workflow_jobs/\d+/relaunch/`. What happens next is the original workflow job is copied to create a new workflow job. The new workflow job then gets a copy of all nodes of the original as well as the topology they bear. Finally the full-fledged new workflow job is triggered to run, thus fulfilling the purpose of relaunch. Survey password-type answers should also be redacted in the relaunched version of the workflow job. From e52e6ae19239f401c5ed6794ec5c5477b6050b1a Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 11:25:54 -0500 Subject: [PATCH 14/25] handle case where the UJT related resource is null --- docs/workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/workflow.md b/docs/workflow.md index bb2f49e5c4..e0d195d18c 100644 --- a/docs/workflow.md +++ b/docs/workflow.md @@ -32,7 +32,7 @@ As stated, workflow job templates can be created with populated `extra_vars`. Th Job resources spawned by workflow jobs are needed by workflow to run correctly. Therefore deletion of spawned job resources is blocked while the underlying workflow job is executing. -Other than success and failure, a workflow spawned job resource can also end with status 'error' and 'canceled'. When a workflow spawned job resource errors, all branches starting from that job will stop executing while the rest keep their own paces. Canceling a workflow spawned job resource follows the same rules. +Other than success and failure, a workflow spawned job resource can also end with status 'error' and 'canceled'. When a workflow spawned job resource errors, all branches starting from that job will stop executing while the rest keep their own paces. Canceling a workflow spawned job resource follows the same rules. If the unified job template of the node is null (which could be a result of deleting the unified job template or copying a its workflow when the user lacks necessary permissions to use it), then the branch should stop executing in this case as well. A workflow job itself can also be canceled. In this case all its spawned job resources will be canceled if cancelable and following paths stop executing. From 0a975736d96301a7dc0c3cf128361878dc6bcd8c Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Tue, 10 Jan 2017 11:50:58 -0500 Subject: [PATCH 15/25] further workflow doc copy edit with QE --- docs/workflow.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/workflow.md b/docs/workflow.md index e0d195d18c..d7336bce08 100644 --- a/docs/workflow.md +++ b/docs/workflow.md @@ -32,7 +32,7 @@ As stated, workflow job templates can be created with populated `extra_vars`. Th Job resources spawned by workflow jobs are needed by workflow to run correctly. Therefore deletion of spawned job resources is blocked while the underlying workflow job is executing. -Other than success and failure, a workflow spawned job resource can also end with status 'error' and 'canceled'. When a workflow spawned job resource errors, all branches starting from that job will stop executing while the rest keep their own paces. Canceling a workflow spawned job resource follows the same rules. If the unified job template of the node is null (which could be a result of deleting the unified job template or copying a its workflow when the user lacks necessary permissions to use it), then the branch should stop executing in this case as well. +Other than success and failure, a workflow spawned job resource can also end with status 'error' and 'canceled'. When a workflow spawned job resource errors, all branches starting from that job will stop executing while the rest continue executing. Canceling a workflow spawned job resource follows the same rules. If the unified job template of the node is null (which could be a result of deleting the unified job template or copying a workflow when the user lacks necessary permissions to use the resource), then the branch should stop executing in this case as well. A workflow job itself can also be canceled. In this case all its spawned job resources will be canceled if cancelable and following paths stop executing. @@ -47,9 +47,9 @@ Workflow job summary: ``` ### Workflow Copy and Relaunch -Other than the normal way of creating workflow job templates, it is also possible to copy existing workflow job templates. The resulting new workflow job template will be mostly identical to which it copies from, except for `name` field which will be appended a text to indicate it's a copy. +Other than the normal way of creating workflow job templates, it is also possible to copy existing workflow job templates. The resulting new workflow job template will be mostly identical to the original, except for `name` field which will be appended a text to indicate it's a copy. -Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, and survey-related fields (survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions copying workflow job template nodes. A workflow job template is allowed to be copied if the user has permission to add an equivalent workflow job template. If the user performing the copy does not have access to a node's related resources (job template, inventory, or credential), those related fields will be null in the copy's version of the node. Schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. +Workflow job templates can be copied by POSTing to endpoint `/workflow_job_templates/\d+/copy/`. After copy finished, the resulting new workflow job template will have identical fields including description, extra_vars, and survey-related fields (survey_spec and survey_enabled). More importantly, workflow job template node of the original workflow job template, as well as the topology they bear, will be copied. Note there are RBAC restrictions on copying workflow job template nodes. A workflow job template is allowed to be copied if the user has permission to add an equivalent workflow job template. If the user performing the copy does not have access to a node's related resources (job template, inventory, or credential), those related fields will be null in the copy's version of the node. Schedules and notification templates of the original workflow job template will not be copied nor shared, and the name of the created workflow job template is the original name plus a special-formatted suffix to indicate its copy origin as well as the copy time, such as 'copy_from_name@10:30:00 am'. Workflow jobs cannot be copied directly, instead a workflow job is implicitly copied when it needs to relaunch. Relaunching an existing workflow job is done by POSTing to endpoint `/workflow_jobs/\d+/relaunch/`. What happens next is the original workflow job is copied to create a new workflow job. The new workflow job then gets a copy of all nodes of the original as well as the topology they bear. Finally the full-fledged new workflow job is triggered to run, thus fulfilling the purpose of relaunch. Survey password-type answers should also be redacted in the relaunched version of the workflow job. From bc4bc2e8cefeafd0d864b32808bfe21cd6b4622f Mon Sep 17 00:00:00 2001 From: Ken Hoes Date: Tue, 10 Jan 2017 12:15:38 -0500 Subject: [PATCH 16/25] Enable show/hide on password and secret fields --- .../src/configuration/auth-form/sub-forms/auth-azure.form.js | 3 ++- .../configuration/auth-form/sub-forms/auth-github-org.form.js | 3 ++- .../configuration/auth-form/sub-forms/auth-github-team.form.js | 3 ++- .../src/configuration/auth-form/sub-forms/auth-github.form.js | 3 ++- .../auth-form/sub-forms/auth-google-oauth2.form.js | 3 ++- .../src/configuration/auth-form/sub-forms/auth-ldap.form.js | 3 ++- .../src/configuration/auth-form/sub-forms/auth-radius.form.js | 3 ++- .../src/configuration/auth-form/sub-forms/auth-saml.form.js | 3 ++- .../configuration/system-form/sub-forms/system-logging.form.js | 3 ++- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js index 17b36e67fb..83ee570a13 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-azure.form.js @@ -16,7 +16,8 @@ reset: 'SOCIAL_AUTH_AZUREAD_OAUTH2_KEY' }, SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET' }, SOCIAL_AUTH_AZUREAD_OAUTH2_ORGANIZATION_MAP: { diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js index bd547cf8b1..88b3d273f6 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-org.form.js @@ -16,7 +16,8 @@ export default ['i18n', function(i18n) { reset: 'SOCIAL_AUTH_GITHUB_ORG_KEY' }, SOCIAL_AUTH_GITHUB_ORG_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_GITHUB_ORG_SECRET' }, SOCIAL_AUTH_GITHUB_ORG_NAME: { diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js index d43d8c01be..42cdd3fcaf 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github-team.form.js @@ -16,7 +16,8 @@ export default ['i18n', function(i18n) { reset: 'SOCIAL_AUTH_GITHUB_TEAM_KEY' }, SOCIAL_AUTH_GITHUB_TEAM_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_GITHUB_TEAM_SECRET' }, SOCIAL_AUTH_GITHUB_TEAM_ID: { diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js index 03af137a7c..2fb983eadc 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-github.form.js @@ -16,7 +16,8 @@ export default ['i18n', function(i18n) { reset: 'SOCIAL_AUTH_GITHUB_KEY' }, SOCIAL_AUTH_GITHUB_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_GITHUB_SECRET' } }, diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js index ac1c23545e..2715c73f9a 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-google-oauth2.form.js @@ -16,7 +16,8 @@ export default ['i18n', function(i18n) { reset: 'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY' }, SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET' }, SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS: { diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js index 8d38fea688..25fb2ce934 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-ldap.form.js @@ -21,7 +21,8 @@ export default ['i18n', function(i18n) { reset: 'AUTH_LDAP_BIND_DN' }, AUTH_LDAP_BIND_PASSWORD: { - type: 'password' + type: 'sensitive', + hasShowInputButton: true, }, AUTH_LDAP_USER_SEARCH: { type: 'textarea', diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js index b16fd649dc..70d68015e0 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-radius.form.js @@ -21,7 +21,8 @@ export default ['i18n', function(i18n) { reset: 'RADIUS_PORT' }, RADIUS_SECRET: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'RADIUS_SECRET' } }, diff --git a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js index ca2bb50dcb..0d10e6e8b1 100644 --- a/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js +++ b/awx/ui/client/src/configuration/auth-form/sub-forms/auth-saml.form.js @@ -20,7 +20,8 @@ export default ['i18n', function(i18n) { reset: 'SOCIAL_AUTH_SAML_SP_PUBLIC_CERT' }, SOCIAL_AUTH_SAML_SP_PRIVATE_KEY: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'SOCIAL_AUTH_SAML_SP_PRIVATE_KEY' }, SOCIAL_AUTH_SAML_ORG_INFO: { diff --git a/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js b/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js index ee99024b45..a14844bf26 100644 --- a/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js +++ b/awx/ui/client/src/configuration/system-form/sub-forms/system-logging.form.js @@ -30,7 +30,8 @@ reset: 'LOG_AGGREGATOR_USERNAME' }, LOG_AGGREGATOR_PASSWORD: { - type: 'text', + type: 'sensitive', + hasShowInputButton: true, reset: 'LOG_AGGREGATOR_PASSWORD' }, LOG_AGGREGATOR_LOGGERS: { From fe896dbda5e8ce63e39e331b7e49a8e0cd5b8feb Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 12:57:40 -0500 Subject: [PATCH 17/25] permission tab disable for private credentials --- awx/ui/client/src/controllers/Credentials.js | 19 ++++++++++--------- awx/ui/client/src/forms/Credentials.js | 4 +++- awx/ui/client/src/shared/directives.js | 8 +++----- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/awx/ui/client/src/controllers/Credentials.js b/awx/ui/client/src/controllers/Credentials.js index a64056ccd4..2bddc26f0d 100644 --- a/awx/ui/client/src/controllers/Credentials.js +++ b/awx/ui/client/src/controllers/Credentials.js @@ -283,7 +283,7 @@ CredentialsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', export function CredentialsEdit($scope, $rootScope, $compile, $location, $log, $stateParams, CredentialForm, Rest, Alert, ProcessErrors, ClearScope, Prompt, GetBasePath, GetChoices, KindChange, Empty, OwnerChange, FormSave, Wait, - $state, CreateSelect2, Authorization) { + $state, CreateSelect2, Authorization, i18n) { ClearScope(); @@ -336,13 +336,14 @@ export function CredentialsEdit($scope, $rootScope, $compile, $location, $log, }); } - // if the credential is assigned to an organization, allow permission delegation - // do NOT use $scope.organization in a view directive to determine if a credential is associated with an org - // @todo why not? ^ and what is this type check for a number doing - should this be a type check for undefined? - $scope.disablePermissionAssignment = typeof($scope.organization) === 'number' ? false : true; - if ($scope.disablePermissionAssignment) { - $scope.permissionsTooltip = 'Credentials are only shared within an organization. Assign credentials to an organization to delegate credential permissions. The organization cannot be edited after credentials are assigned.'; - } + $scope.$watch('organization', function(val) { + if (val === undefined) { + $scope.permissionsTooltip = i18n._('Credentials are only shared within an organization. Assign credentials to an organization to delegate credential permissions. The organization cannot be edited after credentials are assigned.'); + } else { + $scope.permissionsTooltip = ''; + } + }); + setAskCheckboxes(); KindChange({ scope: $scope, @@ -613,5 +614,5 @@ CredentialsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$stateParams', 'CredentialForm', 'Rest', 'Alert', 'ProcessErrors', 'ClearScope', 'Prompt', 'GetBasePath', 'GetChoices', 'KindChange', 'Empty', 'OwnerChange', - 'FormSave', 'Wait', '$state', 'CreateSelect2', 'Authorization' + 'FormSave', 'Wait', '$state', 'CreateSelect2', 'Authorization', 'i18n', ]; diff --git a/awx/ui/client/src/forms/Credentials.js b/awx/ui/client/src/forms/Credentials.js index 9d816c9ce4..727172c94c 100644 --- a/awx/ui/client/src/forms/Credentials.js +++ b/awx/ui/client/src/forms/Credentials.js @@ -420,7 +420,9 @@ export default related: { permissions: { - disabled: 'disablePermissionAssignment', + disabled: '(organization === undefined ? true : false)', + // Do not transition the state if organization is undefined + ngClick: `(organization === undefined ? true : false)||$state.go('credentials.edit.permissions')`, awToolTip: '{{permissionsTooltip}}', dataTipWatch: 'permissionsTooltip', dataPlacement: 'top', diff --git a/awx/ui/client/src/shared/directives.js b/awx/ui/client/src/shared/directives.js index 1da55f80f8..a66ca71e9f 100644 --- a/awx/ui/client/src/shared/directives.js +++ b/awx/ui/client/src/shared/directives.js @@ -621,11 +621,9 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper']) if (attrs.tipWatch) { // Add dataTipWatch: 'variable_name' scope.$watch(attrs.tipWatch, function(newVal, oldVal) { - if (newVal !== oldVal) { - // Where did fixTitle come from?: - // http://stackoverflow.com/questions/9501921/change-twitter-bootstrap-tooltip-content-on-click - $(element).tooltip('hide').attr('data-original-title', newVal).tooltip('fixTitle'); - } + // Where did fixTitle come from?: + // http://stackoverflow.com/questions/9501921/change-twitter-bootstrap-tooltip-content-on-click + $(element).tooltip('hide').attr('data-original-title', newVal).tooltip('fixTitle'); }); } } From f3ade65ac6e8b883c61a31acc34aba4464b7b5eb Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Tue, 10 Jan 2017 14:27:55 -0500 Subject: [PATCH 18/25] Vendor pywinrm and deps for Ansible. --- requirements/requirements_ansible.in | 1 + requirements/requirements_ansible.txt | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/requirements/requirements_ansible.in b/requirements/requirements_ansible.in index 2d381c955b..5497b2a7b1 100644 --- a/requirements/requirements_ansible.in +++ b/requirements/requirements_ansible.in @@ -7,5 +7,6 @@ boto==2.45.0 psphere==0.5.2 psutil==5.0.0 pyvmomi==6.5 +pywinrm[kerberos]==0.2.2 secretstorage==2.3.1 shade==1.13.1 diff --git a/requirements/requirements_ansible.txt b/requirements/requirements_ansible.txt index 59a7fe9544..fef057d56b 100644 --- a/requirements/requirements_ansible.txt +++ b/requirements/requirements_ansible.txt @@ -64,8 +64,10 @@ msrestazure==0.4.6 # via azure-common munch==2.0.4 # via shade netaddr==0.7.18 # via oslo.config, oslo.utils, python-neutronclient netifaces==0.10.5 # via oslo.utils, shade +ntlm-auth==1.0.2 # via requests-ntlm oauthlib==2.0.1 # via requests-oauthlib openstacksdk==0.9.11 # via python-openstackclient +ordereddict==1.1 # via ntlm-auth os-client-config==1.24.0 # via openstacksdk, osc-lib, python-magnumclient, python-neutronclient, shade os-diskconfig-python-novaclient-ext==0.1.3 # via rackspace-novaclient os-networksv2-python-novaclient-ext==0.26 # via rackspace-novaclient @@ -83,6 +85,7 @@ psutil==5.0.0 pyasn1==0.1.9 # via cryptography pycparser==2.17 # via cffi PyJWT==1.4.2 # via adal +pykerberos==1.1.13 # via requests-kerberos pyparsing==2.1.10 # via cliff, cmd2, oslo.utils python-cinderclient==1.9.0 # via python-openstackclient, shade python-dateutil==2.6.0 # via adal, azure-storage @@ -100,24 +103,28 @@ python-swiftclient==3.2.0 # via python-heatclient, python-troveclient, shade python-troveclient==2.7.0 # via shade pytz==2016.10 # via babel, oslo.serialization, oslo.utils pyvmomi==6.5 +pywinrm[kerberos]==0.2.2 PyYAML==3.12 # via cliff, os-client-config, psphere, python-heatclient, python-ironicclient, python-mistralclient rackspace-auth-openstack==1.3 # via rackspace-novaclient rackspace-novaclient==2.1 rax-default-network-flags-python-novaclient-ext==0.4.0 # via rackspace-novaclient rax-scheduled-images-python-novaclient-ext==0.3.1 # via rackspace-novaclient +requests-kerberos==0.11.0 # via pywinrm +requests-ntlm==1.0.0 # via pywinrm requests-oauthlib==0.7.0 # via msrest -requests==2.11.1 # via adal, azure-servicebus, azure-servicemanagement-legacy, azure-storage, keystoneauth1, msrest, python-cinderclient, python-designateclient, python-glanceclient, python-heatclient, python-ironicclient, python-keystoneclient, python-magnumclient, python-mistralclient, python-neutronclient, python-novaclient, python-swiftclient, python-troveclient, pyvmomi, requests-oauthlib +requests==2.11.1 # via adal, azure-servicebus, azure-servicemanagement-legacy, azure-storage, keystoneauth1, msrest, python-cinderclient, python-designateclient, python-glanceclient, python-heatclient, python-ironicclient, python-keystoneclient, python-magnumclient, python-mistralclient, python-neutronclient, python-novaclient, python-swiftclient, python-troveclient, pyvmomi, pywinrm, requests-kerberos, requests-ntlm, requests-oauthlib requestsexceptions==1.1.3 # via os-client-config, shade rfc3986==0.4.1 # via oslo.config secretstorage==2.3.1 shade==1.13.1 simplejson==3.10.0 # via osc-lib, python-cinderclient, python-neutronclient, python-novaclient, python-troveclient -six==1.10.0 # via cliff, cryptography, debtcollector, keystoneauth1, mock, openstacksdk, osc-lib, oslo.config, oslo.i18n, oslo.serialization, oslo.utils, python-cinderclient, python-dateutil, python-designateclient, python-glanceclient, python-heatclient, python-ironicclient, python-keystoneclient, python-magnumclient, python-mistralclient, python-neutronclient, python-novaclient, python-openstackclient, python-swiftclient, python-troveclient, pyvmomi, shade, stevedore, warlock +six==1.10.0 # via cliff, cryptography, debtcollector, keystoneauth1, mock, ntlm-auth, openstacksdk, osc-lib, oslo.config, oslo.i18n, oslo.serialization, oslo.utils, python-cinderclient, python-dateutil, python-designateclient, python-glanceclient, python-heatclient, python-ironicclient, python-keystoneclient, python-magnumclient, python-mistralclient, python-neutronclient, python-novaclient, python-openstackclient, python-swiftclient, python-troveclient, pyvmomi, pywinrm, shade, stevedore, warlock stevedore==1.19.1 # via cliff, keystoneauth1, openstacksdk, osc-lib, oslo.config, python-designateclient, python-keystoneclient, python-magnumclient suds==0.4 # via psphere unicodecsv==0.14.1 # via cliff warlock==1.2.0 # via python-glanceclient wrapt==1.10.8 # via debtcollector, positional +xmltodict==0.10.2 # via pywinrm # The following packages are considered to be unsafe in a requirements file: # setuptools # via cryptography From 0f8f53b9d0b91ac31138f2ddb99f750c67d38822 Mon Sep 17 00:00:00 2001 From: Ken Hoes Date: Tue, 10 Jan 2017 14:35:44 -0500 Subject: [PATCH 19/25] Fixed resolve in route --- awx/ui/client/src/inventories/main.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/awx/ui/client/src/inventories/main.js b/awx/ui/client/src/inventories/main.js index 8505c9b80f..ac031283cd 100644 --- a/awx/ui/client/src/inventories/main.js +++ b/awx/ui/client/src/inventories/main.js @@ -66,7 +66,19 @@ angular.module('inventory', [ ], ParentObject: ['groupData', function(groupData) { return groupData; - }] + }], + UnifiedJobsOptions: ['Rest', 'GetBasePath', '$stateParams', '$q', + function(Rest, GetBasePath, $stateParams, $q) { + Rest.setUrl(GetBasePath('unified_jobs')); + var val = $q.defer(); + Rest.options() + .then(function(data) { + val.resolve(data.data); + }, function(data) { + val.reject(data); + }); + return val.promise; + }] }, views: { // clear form template when views render in this substate From ff419921944928793178318c5ed9ec9dec3ac705 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 15:52:08 -0500 Subject: [PATCH 20/25] don't include var if not going to use it --- awx/ui/client/src/shared/directives.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/ui/client/src/shared/directives.js b/awx/ui/client/src/shared/directives.js index a66ca71e9f..55278c5ab9 100644 --- a/awx/ui/client/src/shared/directives.js +++ b/awx/ui/client/src/shared/directives.js @@ -620,7 +620,7 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper']) if (attrs.tipWatch) { // Add dataTipWatch: 'variable_name' - scope.$watch(attrs.tipWatch, function(newVal, oldVal) { + scope.$watch(attrs.tipWatch, function(newVal) { // Where did fixTitle come from?: // http://stackoverflow.com/questions/9501921/change-twitter-bootstrap-tooltip-content-on-click $(element).tooltip('hide').attr('data-original-title', newVal).tooltip('fixTitle'); From d590432590dfe8a7a3eb146d30085ed9c2355ee7 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 15:54:06 -0500 Subject: [PATCH 21/25] gracefully handle 409 on delete related to #3245 --- awx/ui/client/src/shared/Utilities.js | 2 ++ .../client/src/templates/list/templates-list.controller.js | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/awx/ui/client/src/shared/Utilities.js b/awx/ui/client/src/shared/Utilities.js index 9bc18dfd13..3bb9c02de0 100644 --- a/awx/ui/client/src/shared/Utilities.js +++ b/awx/ui/client/src/shared/Utilities.js @@ -198,6 +198,8 @@ angular.module('Utilities', ['RestServices', 'Utilities', 'sanitizeFilter']) msg += 'Please contact your system administrator.'; } Alert(defaultMsg.hdr, msg); + } else if (status === 409) { + Alert('Conflict', data.conflict || "Resource currently in use."); } else if (status === 410) { Alert('Deleted Object', 'The requested object was previously deleted and can no longer be accessed.'); } else if ((status === 'Token is expired') || (status === 401 && data.detail && data.detail === 'Token is expired') || diff --git a/awx/ui/client/src/templates/list/templates-list.controller.js b/awx/ui/client/src/templates/list/templates-list.controller.js index 5bcd659a38..820f843852 100644 --- a/awx/ui/client/src/templates/list/templates-list.controller.js +++ b/awx/ui/client/src/templates/list/templates-list.controller.js @@ -131,7 +131,7 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', handleSuccessfulDelete(); }, function (data) { Wait('stop'); - ProcessErrors($scope, data, status, null, { hdr: 'Error!', + ProcessErrors($scope, data, data.status, null, { hdr: 'Error!', msg: 'Call to delete workflow job template failed. DELETE returned status: ' + status }); }); } @@ -141,8 +141,8 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', handleSuccessfulDelete(); }, function (data) { Wait('stop'); - ProcessErrors($scope, data, status, null, { hdr: 'Error!', - msg: 'Call to delete job template failed. DELETE returned status: ' + status }); + ProcessErrors($scope, data, data.status, null, { hdr: 'Error!', + msg: 'Call to delete job template failed. DELETE returned status: ' + data.status }); }); } else { From 3e8c7127712fa630d74766cc1315f80ae9b0ece4 Mon Sep 17 00:00:00 2001 From: Bill Nottingham Date: Tue, 10 Jan 2017 17:04:48 -0500 Subject: [PATCH 22/25] Licenses + LGPL code for winrm vendoring. --- docs/licenses/ntlm-auth-1.0.2.zip | Bin 0 -> 33770 bytes docs/licenses/ntlm-auth.txt | 163 ++++++++++++++++++++++ docs/licenses/pykerberos.txt | 202 ++++++++++++++++++++++++++++ docs/licenses/pywinrm.txt | 22 ++- docs/licenses/requests-kerberos.txt | 15 +++ docs/licenses/requests-ntlm.txt | 15 +++ 6 files changed, 411 insertions(+), 6 deletions(-) create mode 100644 docs/licenses/ntlm-auth-1.0.2.zip create mode 100644 docs/licenses/ntlm-auth.txt create mode 100644 docs/licenses/pykerberos.txt create mode 100644 docs/licenses/requests-kerberos.txt create mode 100644 docs/licenses/requests-ntlm.txt diff --git a/docs/licenses/ntlm-auth-1.0.2.zip b/docs/licenses/ntlm-auth-1.0.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..d847ae6be669bb0708836f521f93bd5ecf0a2313 GIT binary patch literal 33770 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 literal 0 HcmV?d00001 diff --git a/docs/licenses/ntlm-auth.txt b/docs/licenses/ntlm-auth.txt new file mode 100644 index 0000000000..21429cb1fa --- /dev/null +++ b/docs/licenses/ntlm-auth.txt @@ -0,0 +1,163 @@ +GNU Lesser General Public License +================================= + +_Version 3, 29 June 2007_ +_Copyright © 2007 Free Software Foundation, Inc. <>_ + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + +This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + +### 0. Additional Definitions + +As used herein, “this License” refers to version 3 of the GNU Lesser +General Public License, and the “GNU GPL” refers to version 3 of the GNU +General Public License. + +“The Library” refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + +An “Application” is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A “Combined Work” is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the “Linked +Version”. + +The “Minimal Corresponding Source” for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The “Corresponding Application Code” for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +### 1. Exception to Section 3 of the GNU GPL + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +### 2. Conveying Modified Versions + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +* **a)** under this License, provided that you make a good faith effort to +ensure that, in the event an Application does not supply the +function or data, the facility still operates, and performs +whatever part of its purpose remains meaningful, or + +* **b)** under the GNU GPL, with none of the additional permissions of +this License applicable to that copy. + +### 3. Object Code Incorporating Material from Library Header Files + +The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +* **a)** Give prominent notice with each copy of the object code that the +Library is used in it and that the Library and its use are +covered by this License. +* **b)** Accompany the object code with a copy of the GNU GPL and this license +document. + +### 4. Combined Works + +You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + +* **a)** Give prominent notice with each copy of the Combined Work that +the Library is used in it and that the Library and its use are +covered by this License. + +* **b)** Accompany the Combined Work with a copy of the GNU GPL and this license +document. + +* **c)** For a Combined Work that displays copyright notices during +execution, include the copyright notice for the Library among +these notices, as well as a reference directing the user to the +copies of the GNU GPL and this license document. + +* **d)** Do one of the following: + - **0)** Convey the Minimal Corresponding Source under the terms of this +License, and the Corresponding Application Code in a form +suitable for, and under terms that permit, the user to +recombine or relink the Application with a modified version of +the Linked Version to produce a modified Combined Work, in the +manner specified by section 6 of the GNU GPL for conveying +Corresponding Source. + - **1)** Use a suitable shared library mechanism for linking with the +Library. A suitable mechanism is one that **(a)** uses at run time +a copy of the Library already present on the user's computer +system, and **(b)** will operate properly with a modified version +of the Library that is interface-compatible with the Linked +Version. + +* **e)** Provide Installation Information, but only if you would otherwise +be required to provide such information under section 6 of the +GNU GPL, and only to the extent that such information is +necessary to install and execute a modified version of the +Combined Work produced by recombining or relinking the +Application with a modified version of the Linked Version. (If +you use option **4d0**, the Installation Information must accompany +the Minimal Corresponding Source and Corresponding Application +Code. If you use option **4d1**, you must provide the Installation +Information in the manner specified by section 6 of the GNU GPL +for conveying Corresponding Source.) + +### 5. Combined Libraries + +You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +* **a)** Accompany the combined library with a copy of the same work based +on the Library, uncombined with any other library facilities, +conveyed under the terms of this License. +* **b)** Give prominent notice with the combined library that part of it +is a work based on the Library, and explaining where to find the +accompanying uncombined form of the same work. + +### 6. Revised Versions of the GNU Lesser General Public License + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License “or any later version” +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/docs/licenses/pykerberos.txt b/docs/licenses/pykerberos.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/docs/licenses/pykerberos.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/licenses/pywinrm.txt b/docs/licenses/pywinrm.txt index 3f28a5f534..3e21facc07 100644 --- a/docs/licenses/pywinrm.txt +++ b/docs/licenses/pywinrm.txt @@ -1,9 +1,19 @@ -MIT License +Copyright (c) 2013 Alexey Diyan -Copyright (c) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/docs/licenses/requests-kerberos.txt b/docs/licenses/requests-kerberos.txt new file mode 100644 index 0000000000..581f115e78 --- /dev/null +++ b/docs/licenses/requests-kerberos.txt @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2012 Kenneth Reitz + +Permission to use, copy, modify and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS-IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/docs/licenses/requests-ntlm.txt b/docs/licenses/requests-ntlm.txt new file mode 100644 index 0000000000..5f3e18de12 --- /dev/null +++ b/docs/licenses/requests-ntlm.txt @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013 Ben Toews + +Permission to use, copy, modify and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS-IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. From a41fd5bdf89e31c16cf98a9158eede2b71010d21 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 16:18:30 -0500 Subject: [PATCH 23/25] display workflow template instead of wfjt related to #3404 --- .../templates/list/templates-list.controller.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/awx/ui/client/src/templates/list/templates-list.controller.js b/awx/ui/client/src/templates/list/templates-list.controller.js index 5bcd659a38..2734232ae2 100644 --- a/awx/ui/client/src/templates/list/templates-list.controller.js +++ b/awx/ui/client/src/templates/list/templates-list.controller.js @@ -45,12 +45,14 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', $scope.$on(`${list.iterator}_options`, function(event, data){ $scope.options = data.data.actions.GET; optionsRequestDataProcessing(); + renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate(); }); $scope.$watchCollection('templates', function() { - optionsRequestDataProcessing(); - } - ); + optionsRequestDataProcessing(); + renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate(); + }); + // iterate over the list and add fields like type label, after the // OPTIONS request returns, or the list is sorted/paginated/searched function optionsRequestDataProcessing(){ @@ -70,6 +72,13 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', }); } + function renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate() { + $scope[list.name].forEach(function(item) { + if (item.type_label === "Workflow Job Template") { + item.type_label = "Workflow Template"; + } + }); + } $scope.$on(`ws-jobs`, function () { // @issue - this is no longer quite as ham-fisted but I'd like for someone else to take a peek From b903ad069e5d152a2eae25d3a99aac43e1601a8b Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 18:23:26 -0500 Subject: [PATCH 24/25] Revert "display workflow template instead of wfjt" This reverts commit 459b03e2e90b2aeaaf071a7438323890f238bf3f. --- .../templates/list/templates-list.controller.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/awx/ui/client/src/templates/list/templates-list.controller.js b/awx/ui/client/src/templates/list/templates-list.controller.js index 2734232ae2..5bcd659a38 100644 --- a/awx/ui/client/src/templates/list/templates-list.controller.js +++ b/awx/ui/client/src/templates/list/templates-list.controller.js @@ -45,14 +45,12 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', $scope.$on(`${list.iterator}_options`, function(event, data){ $scope.options = data.data.actions.GET; optionsRequestDataProcessing(); - renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate(); }); $scope.$watchCollection('templates', function() { - optionsRequestDataProcessing(); - renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate(); - }); - + optionsRequestDataProcessing(); + } + ); // iterate over the list and add fields like type label, after the // OPTIONS request returns, or the list is sorted/paginated/searched function optionsRequestDataProcessing(){ @@ -72,13 +70,6 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', }); } - function renameTypeLabelFromWorkflowJobTemplateToWorkflowTemplate() { - $scope[list.name].forEach(function(item) { - if (item.type_label === "Workflow Job Template") { - item.type_label = "Workflow Template"; - } - }); - } $scope.$on(`ws-jobs`, function () { // @issue - this is no longer quite as ham-fisted but I'd like for someone else to take a peek From e5a2671d21eb43e86e47bd23fe1f73c230405eca Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 10 Jan 2017 18:23:52 -0500 Subject: [PATCH 25/25] rename wfjt to Workflow Template in OPTIONS --- awx/api/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 05dca74cb6..66ca32764a 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -251,6 +251,7 @@ class BaseSerializer(serializers.ModelSerializer): 'inventory_update': _('Inventory Sync'), 'system_job': _('Management Job'), 'workflow_job': _('Workflow Job'), + 'workflow_job_template': _('Workflow Template'), } choices = [] for t in self.get_types():