1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

add support for regions and vms

This commit is contained in:
John Anderson
2020-10-23 01:18:04 -04:00
parent 3ba18633de
commit 22d2289ed2
9 changed files with 87 additions and 49 deletions

View File

@ -1,8 +1,8 @@
from collections import OrderedDict
from django.contrib.postgres.aggregates import JSONBAgg
from django.db.models import OuterRef, Subquery, Q, QuerySet
from utilities.query_functions import EmptyGroupByJSONBAgg
from utilities.querysets import RestrictedQuerySet
@ -60,18 +60,14 @@ class ConfigContextQuerySet(RestrictedQuerySet):
).order_by('weight', 'name')
class EmptyGroupByJSONBAgg(JSONBAgg):
contains_aggregate = False
class ConfigContextModelQuerySet(RestrictedQuerySet):
class ConfigContextQuerySetMixin(RestrictedQuerySet):
def add_config_context_annotation(self):
def annotate_config_context_data(self):
from extras.models import ConfigContext
return self.annotate(
config_contexts=Subquery(
config_context_data=Subquery(
ConfigContext.objects.filter(
self._add_config_context_filters()
self._get_config_context_filters()
).order_by(
'weight',
'name'
@ -81,28 +77,42 @@ class ConfigContextQuerySetMixin(RestrictedQuerySet):
)
)
def _add_config_context_filters(self):
def _get_config_context_filters(self):
base_query = Q(
Q(platforms=OuterRef('platform')) | Q(platforms=None),
Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None),
Q(tenants=OuterRef('tenant')) | Q(tenants=None),
Q(tags=OuterRef('tags')) | Q(tags=None),
is_active=True,
)
if self.model._meta.model_name == 'device':
return Q(
Q(sites=OuterRef('site')) | Q(sites=None),
Q(roles=OuterRef('device_role')) | Q(roles=None),
Q(platforms=OuterRef('platform')) | Q(platforms=None),
Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None),
Q(tenants=OuterRef('tenant')) | Q(tenants=None),
Q(tags=OuterRef('tags')) | Q(tags=None),
is_active=True,
base_query.add((Q(roles=OuterRef('device_role')) | Q(roles=None)), Q.AND)
base_query.add(
(Q(
regions__tree_id=OuterRef('site__region__tree_id'),
regions__level__lte=OuterRef('site__region__level'),
regions__lft__lte=OuterRef('site__region__lft'),
regions__rght__gte=OuterRef('site__region__rght'),
) | Q(regions=None)),
Q.AND
)
else:
return Q(
Q(sites=OuterRef('site')) | Q(sites=None),
Q(roles=OuterRef('role')) | Q(roles=None),
Q(platforms=OuterRef('platform')) | Q(platforms=None),
Q(cluster_groups=OuterRef('cluster__group')) | Q(cluster_groups=None),
Q(clusters=OuterRef('cluster')) | Q(clusters=None),
Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None),
Q(tenants=OuterRef('tenant')) | Q(tenants=None),
Q(tags=OuterRef('tags')) | Q(tags=None),
is_active=True,
base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND)
elif self.model._meta.model_name == 'virtualmachine':
base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
base_query.add((Q(cluster_groups=OuterRef('cluster__group')) | Q(cluster_groups=None)), Q.AND)
base_query.add((Q(clusters=OuterRef('cluster')) | Q(clusters=None)), Q.AND)
base_query.add(
(Q(
regions__tree_id=OuterRef('cluster__site__region__tree_id'),
regions__level__lte=OuterRef('cluster__site__region__level'),
regions__lft__lte=OuterRef('cluster__site__region__lft'),
regions__rght__gte=OuterRef('cluster__site__region__rght'),
) | Q(regions=None)),
Q.AND
)
base_query.add((Q(sites=OuterRef('cluster__site')) | Q(sites=None)), Q.AND)
return base_query