Просмотр исходного кода

Fix ConfigContext application for SiteGroups

Jeremy Stretch 4 лет назад
Родитель
Сommit
12945704e9
2 измененных файлов с 19 добавлено и 5 удалено
  1. 18 4
      netbox/extras/querysets.py
  2. 1 1
      netbox/extras/tests/test_filters.py

+ 18 - 4
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

+ 1 - 1
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]])