feat(extras): Inherit ConfigContext from ancestor platforms

Apply ConfigContext to objects whose platforms descend from any
assigned platform. This aligns platform behavior with regions, site
groups, locations, and roles.

Fixes #20639
This commit is contained in:
Martin Hauser 2025-11-26 19:21:35 +01:00 committed by Jeremy Stretch
parent afba5b2791
commit b5edfa5d53

View File

@ -46,6 +46,10 @@ class ConfigContextQuerySet(RestrictedQuerySet):
# Match against the directly assigned role as well as any parent roles. # Match against the directly assigned role as well as any parent roles.
device_roles = obj.role.get_ancestors(include_self=True) if obj.role else [] device_roles = obj.role.get_ancestors(include_self=True) if obj.role else []
# Match against the directly assigned platform as well as any parent platforms.
platform = getattr(obj, 'platform', None)
platforms = platform.get_ancestors(include_self=True) if platform else []
queryset = self.filter( queryset = self.filter(
Q(regions__in=regions) | Q(regions=None), Q(regions__in=regions) | Q(regions=None),
Q(site_groups__in=sitegroups) | Q(site_groups=None), Q(site_groups__in=sitegroups) | Q(site_groups=None),
@ -53,7 +57,7 @@ class ConfigContextQuerySet(RestrictedQuerySet):
Q(locations__in=locations) | Q(locations=None), Q(locations__in=locations) | Q(locations=None),
Q(device_types=device_type) | Q(device_types=None), Q(device_types=device_type) | Q(device_types=None),
Q(roles__in=device_roles) | Q(roles=None), Q(roles__in=device_roles) | Q(roles=None),
Q(platforms=obj.platform) | Q(platforms=None), Q(platforms__in=platforms) | Q(platforms=None),
Q(cluster_types=cluster_type) | Q(cluster_types=None), Q(cluster_types=cluster_type) | Q(cluster_types=None),
Q(cluster_groups=cluster_group) | Q(cluster_groups=None), Q(cluster_groups=cluster_group) | Q(cluster_groups=None),
Q(clusters=cluster) | Q(clusters=None), Q(clusters=cluster) | Q(clusters=None),
@ -103,7 +107,6 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
"content_type__model": self.model._meta.model_name "content_type__model": self.model._meta.model_name
} }
base_query = Q( base_query = Q(
Q(platforms=OuterRef('platform')) | Q(platforms=None),
Q(cluster_types=OuterRef('cluster__type')) | Q(cluster_types=None), Q(cluster_types=OuterRef('cluster__type')) | Q(cluster_types=None),
Q(cluster_groups=OuterRef('cluster__group')) | Q(cluster_groups=None), Q(cluster_groups=OuterRef('cluster__group')) | Q(cluster_groups=None),
Q(clusters=OuterRef('cluster')) | Q(clusters=None), Q(clusters=OuterRef('cluster')) | Q(clusters=None),
@ -167,6 +170,15 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
) | Q(roles=None)), ) | Q(roles=None)),
Q.AND Q.AND
) )
base_query.add(
(Q(
platforms__tree_id=OuterRef('platform__tree_id'),
platforms__level__lte=OuterRef('platform__level'),
platforms__lft__lte=OuterRef('platform__lft'),
platforms__rght__gte=OuterRef('platform__rght'),
) | Q(platforms=None)),
Q.AND
)
return base_query return base_query