From a1dd5a4e19e02d1bf64f17c23d799fd36cd9a91f Mon Sep 17 00:00:00 2001 From: beeankha Date: Tue, 19 Mar 2019 11:29:19 -0400 Subject: [PATCH 1/4] WIP WFJT Node Activity Stream Bug Fix --- awx/api/serializers.py | 14 +++++++++++++- .../factories/build-anchor.factory.js | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index ca454a0b1e..1ab91d630b 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4021,7 +4021,7 @@ class WorkflowJobTemplateNodeDetailSerializer(WorkflowJobTemplateNodeSerializer) Influence the api browser sample data to not include workflow_job_template when editing a WorkflowNode. - Note: I was not able to accomplish this trough the use of extra_kwargs. + Note: I was not able to accomplish this through the use of extra_kwargs. Maybe something to do with workflow_job_template being a relational field? ''' def build_relational_field(self, field_name, relation_info): @@ -5070,6 +5070,18 @@ class ActivityStreamSerializer(BaseSerializer): if fval is not None: job_template_item[field] = fval summary_fields['job_template'].append(job_template_item) + if fk == 'workflow_job_template_node': + summary_fields['workflow_job_template'] = [] + workflow_job_template_item = {} + workflow_job_template_fields = SUMMARIZABLE_FK_FIELDS['workflow_job_template'] + workflow_job_template = getattr(thisItem, 'workflow_job_template', None) + if workflow_job_template is not None: + for field in workflow_job_template_fields: + fval = getattr(workflow_job_template, field, None) + if fval is not None: + workflow_job_template_item[field] = fval + summary_fields['workflow_job_template'].append(workflow_job_template_item) +# to adhere to DRY principles, the above can eventually be combined into a helper method if fk == 'schedule': unified_job_template = getattr(thisItem, 'unified_job_template', None) if unified_job_template is not None: diff --git a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js index e25607e2ae..cb913fb96e 100644 --- a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js +++ b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js @@ -75,6 +75,9 @@ export default function BuildAnchor($log, $filter) { case 'workflow_job_template': url += `templates/workflow_job_template/${obj.id}`; break; + case 'workflow_job_template_node': + url += `templates/workflow_job_template/${obj.summary_fields.workflow_job_template.id}`; + break; case 'workflow_job': url += `workflows/${obj.id}`; break; From cf62fa67bdbc44a5335600aa46348f740d2b1de6 Mon Sep 17 00:00:00 2001 From: Keith Grant Date: Wed, 20 Mar 2019 17:00:42 -0400 Subject: [PATCH 2/4] add links to activity stream for workflow_job_template_node --- .../src/activity-stream/factories/build-anchor.factory.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js index cb913fb96e..f29769b222 100644 --- a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js +++ b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js @@ -12,6 +12,7 @@ export default function BuildAnchor($log, $filter) { if (!activity.summary_fields[resource]){ throw {name : 'ResourceDeleted', message: 'The referenced resource no longer exists'}; } + let name; switch (resource) { case 'custom_inventory_script': url += 'inventory_scripts/' + obj.id + '/'; @@ -76,7 +77,8 @@ export default function BuildAnchor($log, $filter) { url += `templates/workflow_job_template/${obj.id}`; break; case 'workflow_job_template_node': - url += `templates/workflow_job_template/${obj.summary_fields.workflow_job_template.id}`; + url += `templates/workflow_job_template/${activity.summary_fields.workflow_job_template[0].id}`; + name = activity.summary_fields.workflow_job_template[0].name; break; case 'workflow_job': url += `workflows/${obj.id}`; @@ -95,7 +97,7 @@ export default function BuildAnchor($log, $filter) { url += resource + 's/' + obj.id + '/'; } - const name = $filter('sanitize')(obj.name || obj.username); + name = $filter('sanitize')(name || obj.name || obj.username); if (url) { return `  ${name}  `; From 1d03625b27942c2b53a817db92a698ecad63d953 Mon Sep 17 00:00:00 2001 From: beeankha Date: Thu, 21 Mar 2019 09:08:36 -0400 Subject: [PATCH 3/4] Remove comment from serializer --- awx/api/serializers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 1ab91d630b..31f0e19523 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -5081,7 +5081,6 @@ class ActivityStreamSerializer(BaseSerializer): if fval is not None: workflow_job_template_item[field] = fval summary_fields['workflow_job_template'].append(workflow_job_template_item) -# to adhere to DRY principles, the above can eventually be combined into a helper method if fk == 'schedule': unified_job_template = getattr(thisItem, 'unified_job_template', None) if unified_job_template is not None: From 685f4018f263642988ceb1dde4603e2144760983 Mon Sep 17 00:00:00 2001 From: Keith Grant Date: Mon, 25 Mar 2019 10:58:49 -0400 Subject: [PATCH 4/4] improve verbiage in activity stream for associating/disassociating wf nodes --- .../factories/build-anchor.factory.js | 1 + .../factories/build-description.factory.js | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js index f29769b222..aa87c91556 100644 --- a/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js +++ b/awx/ui/client/src/activity-stream/factories/build-anchor.factory.js @@ -10,6 +10,7 @@ export default function BuildAnchor($log, $filter) { // catch-all case to avoid generating urls if a resource has been deleted // if a resource still exists, it'll be serialized in the activity's summary_fields if (!activity.summary_fields[resource]){ + console.log(activity); throw {name : 'ResourceDeleted', message: 'The referenced resource no longer exists'}; } let name; diff --git a/awx/ui/client/src/activity-stream/factories/build-description.factory.js b/awx/ui/client/src/activity-stream/factories/build-description.factory.js index 967ff8bb5a..20fcb4c7b3 100644 --- a/awx/ui/client/src/activity-stream/factories/build-description.factory.js +++ b/awx/ui/client/src/activity-stream/factories/build-description.factory.js @@ -85,8 +85,12 @@ export default function BuildDescription(BuildAnchor, $log, i18n) { 'from ' + activity.object1 + BuildAnchor(activity.summary_fields.group[0], activity.object1, activity); } else { - activity.description += activity.object2 + BuildAnchor(activity.summary_fields[activity.object2][0], activity.object2, activity) + - 'from ' + activity.object1 + BuildAnchor(activity.summary_fields[activity.object1][0], activity.object1, activity); + if (activity.object1 === 'workflow_job_template_node' && activity.object2 === 'workflow_job_template_node') { + activity.description += 'two nodes on workflow' + BuildAnchor(activity.summary_fields[activity.object1[0]], activity.object1, activity); + } else { + activity.description += activity.object2 + BuildAnchor(activity.summary_fields[activity.object2][0], activity.object2, activity) + + 'from ' + activity.object1 + BuildAnchor(activity.summary_fields[activity.object1][0], activity.object1, activity); + } } break; // expected outcome "associated to " @@ -97,8 +101,12 @@ export default function BuildDescription(BuildAnchor, $log, i18n) { 'to ' + activity.object2 + BuildAnchor(activity.summary_fields.group[1], activity.object2, activity); } else { - activity.description += activity.object1 + BuildAnchor(activity.summary_fields[activity.object1][0], activity.object1, activity) + - 'to ' + activity.object2 + BuildAnchor(activity.summary_fields[activity.object2][0], activity.object2, activity); + if (activity.object1 === 'workflow_job_template_node' && activity.object2 === 'workflow_job_template_node') { + activity.description += 'two nodes on workflow' + BuildAnchor(activity.summary_fields[activity.object1[0]], activity.object1, activity); + } else { + activity.description += activity.object1 + BuildAnchor(activity.summary_fields[activity.object1][0], activity.object1, activity) + + 'to ' + activity.object2 + BuildAnchor(activity.summary_fields[activity.object2][0], activity.object2, activity); + } } break; case 'delete':