diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 98f5a368c4..faecaaa576 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -2973,6 +2973,10 @@ class ActivityStreamSerializer(BaseSerializer): changes = serializers.SerializerMethodField() object_association = serializers.SerializerMethodField() + # Needed related fields that are not in the default summary fields + extra_listing = [ + ('workflow_job_template_node', ('id', 'unified_job_template_id')) + ] class Meta: model = ActivityStream @@ -3014,7 +3018,7 @@ class ActivityStreamSerializer(BaseSerializer): rel = {} if obj.actor is not None: rel['actor'] = reverse('api:user_detail', args=(obj.actor.pk,)) - for fk, __ in SUMMARIZABLE_FK_FIELDS.items(): + for fk, __ in SUMMARIZABLE_FK_FIELDS.items() + self.extra_listing: if not hasattr(obj, fk): continue allm2m = getattr(obj, fk).all() @@ -3036,7 +3040,7 @@ class ActivityStreamSerializer(BaseSerializer): def get_summary_fields(self, obj): summary_fields = OrderedDict() - for fk, related_fields in SUMMARIZABLE_FK_FIELDS.items(): + for fk, related_fields in SUMMARIZABLE_FK_FIELDS.items() + self.extra_listing: try: if not hasattr(obj, fk): continue diff --git a/awx/api/views.py b/awx/api/views.py index f36404d710..f67de81191 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -3108,7 +3108,7 @@ class WorkflowJobTemplateActivityStreamList(WorkflowsEnforcementMixin, ActivityS self.check_parent_access(parent) qs = self.request.user.get_queryset(self.model) return qs.filter(Q(workflow_job_template=parent) | - Q(workflow_job_template_node__workflow_job_template=parent)) + Q(workflow_job_template_node__workflow_job_template=parent)).distinct() class WorkflowJobList(WorkflowsEnforcementMixin, ListCreateAPIView): diff --git a/awx/main/access.py b/awx/main/access.py index 059e89e655..7bef51a20f 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -2109,7 +2109,7 @@ class ActivityStreamAccess(BaseAccess): 'job_template', 'job', 'ad_hoc_command', 'notification_template', 'notification', 'label', 'role', 'actor', 'schedule', 'custom_inventory_script', 'unified_job_template', - 'workflow_job_template', 'workflow_job') + 'workflow_job_template', 'workflow_job', 'workflow_job_template_node') if self.user.is_superuser or self.user.is_system_auditor: return qs.all() diff --git a/awx/main/models/__init__.py b/awx/main/models/__init__.py index 3f7e309940..d7b65d8107 100644 --- a/awx/main/models/__init__.py +++ b/awx/main/models/__init__.py @@ -126,4 +126,5 @@ activity_stream_registrar.connect(Notification) activity_stream_registrar.connect(Label) activity_stream_registrar.connect(User) activity_stream_registrar.connect(WorkflowJobTemplate) +activity_stream_registrar.connect(WorkflowJobTemplateNode) activity_stream_registrar.connect(WorkflowJob)