From 12945704e98fa107e766ae0b75c82ace79d6bbc7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 29 Mar 2021 15:57:44 -0400 Subject: [PATCH] Fix ConfigContext application for SiteGroups --- netbox/extras/querysets.py | 22 ++++++++++++++++++---- netbox/extras/tests/test_filters.py | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index f0f073e37..be5ae6416 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -31,13 +31,15 @@ class ConfigContextQuerySet(RestrictedQuerySet): # Match against the directly assigned region as well as any parent regions. region = getattr(obj.site, 'region', None) - if region: - regions = region.get_ancestors(include_self=True) - else: - regions = [] + regions = region.get_ancestors(include_self=True) if region else [] + + # Match against the directly assigned site group as well as any parent site groups. + sitegroup = getattr(obj.site, 'group', None) + sitegroups = sitegroup.get_ancestors(include_self=True) if sitegroup else [] queryset = self.filter( Q(regions__in=regions) | Q(regions=None), + Q(site_groups__in=sitegroups) | Q(site_groups=None), Q(sites=obj.site) | Q(sites=None), Q(device_types=device_type) | Q(device_types=None), Q(roles=role) | Q(roles=None), @@ -116,11 +118,13 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): base_query.add((Q(roles=OuterRef('device_role')) | Q(roles=None)), Q.AND) base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND) region_field = 'site__region' + sitegroup_field = 'site__group' elif self.model._meta.model_name == 'virtualmachine': base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND) base_query.add((Q(sites=OuterRef('cluster__site')) | Q(sites=None)), Q.AND) region_field = 'cluster__site__region' + sitegroup_field = 'cluster__site__group' base_query.add( (Q( @@ -132,4 +136,14 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): Q.AND ) + base_query.add( + (Q( + site_groups__tree_id=OuterRef(f'{sitegroup_field}__tree_id'), + site_groups__level__lte=OuterRef(f'{sitegroup_field}__level'), + site_groups__lft__lte=OuterRef(f'{sitegroup_field}__lft'), + site_groups__rght__gte=OuterRef(f'{sitegroup_field}__rght'), + ) | Q(site_groups=None)), + Q.AND + ) + return base_query diff --git a/netbox/extras/tests/test_filters.py b/netbox/extras/tests/test_filters.py index 33aaa7df2..bb78c4daf 100644 --- a/netbox/extras/tests/test_filters.py +++ b/netbox/extras/tests/test_filters.py @@ -441,7 +441,7 @@ class ConfigContextTestCase(TestCase): c.regions.set([regions[i]]) c.site_groups.set([site_groups[i]]) c.sites.set([sites[i]]) - c.roles.set([device_types[i]]) + c.device_types.set([device_types[i]]) c.roles.set([device_roles[i]]) c.platforms.set([platforms[i]]) c.cluster_groups.set([cluster_groups[i]])