diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 794ee938f6..a571190199 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): @@ -5073,6 +5073,17 @@ 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) 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..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,8 +10,10 @@ 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; switch (resource) { case 'custom_inventory_script': url += 'inventory_scripts/' + obj.id + '/'; @@ -75,6 +77,10 @@ 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/${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}`; break; @@ -92,7 +98,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}  `; 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':