mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-14 01:41:22 -06:00
Merge pull request #19315 from netbox-community/19270-config-context-device-roles
Closes #19270: Apply config contexts from parent devices roles
This commit is contained in:
commit
89fd071f37
@ -22,8 +22,6 @@ class ConfigContextQuerySet(RestrictedQuerySet):
|
|||||||
aggregate_data: If True, use the JSONBAgg aggregate function to return only the list of JSON data objects
|
aggregate_data: If True, use the JSONBAgg aggregate function to return only the list of JSON data objects
|
||||||
"""
|
"""
|
||||||
|
|
||||||
role = obj.role
|
|
||||||
|
|
||||||
# Device type and location assignment is relevant only for Devices
|
# Device type and location assignment is relevant only for Devices
|
||||||
device_type = getattr(obj, 'device_type', None)
|
device_type = getattr(obj, 'device_type', None)
|
||||||
location = getattr(obj, 'location', None)
|
location = getattr(obj, 'location', None)
|
||||||
@ -44,13 +42,16 @@ class ConfigContextQuerySet(RestrictedQuerySet):
|
|||||||
sitegroup = getattr(obj.site, 'group', None)
|
sitegroup = getattr(obj.site, 'group', None)
|
||||||
sitegroups = sitegroup.get_ancestors(include_self=True) if sitegroup else []
|
sitegroups = sitegroup.get_ancestors(include_self=True) if sitegroup else []
|
||||||
|
|
||||||
|
# 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 []
|
||||||
|
|
||||||
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),
|
||||||
Q(sites=obj.site) | Q(sites=None),
|
Q(sites=obj.site) | Q(sites=None),
|
||||||
Q(locations=location) | Q(locations=None),
|
Q(locations=location) | Q(locations=None),
|
||||||
Q(device_types=device_type) | Q(device_types=None),
|
Q(device_types=device_type) | Q(device_types=None),
|
||||||
Q(roles=role) | Q(roles=None),
|
Q(roles__in=device_roles) | Q(roles=None),
|
||||||
Q(platforms=obj.platform) | Q(platforms=None),
|
Q(platforms=obj.platform) | 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),
|
||||||
@ -107,6 +108,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|||||||
Q(clusters=OuterRef('cluster')) | Q(clusters=None),
|
Q(clusters=OuterRef('cluster')) | Q(clusters=None),
|
||||||
Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None),
|
Q(tenant_groups=OuterRef('tenant__group')) | Q(tenant_groups=None),
|
||||||
Q(tenants=OuterRef('tenant')) | Q(tenants=None),
|
Q(tenants=OuterRef('tenant')) | Q(tenants=None),
|
||||||
|
Q(sites=OuterRef('site')) | Q(sites=None),
|
||||||
Q(
|
Q(
|
||||||
tags__pk__in=Subquery(
|
tags__pk__in=Subquery(
|
||||||
TaggedItem.objects.filter(
|
TaggedItem.objects.filter(
|
||||||
@ -128,9 +130,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|||||||
base_query.add(Q(locations=None), Q.AND)
|
base_query.add(Q(locations=None), Q.AND)
|
||||||
base_query.add(Q(device_types=None), Q.AND)
|
base_query.add(Q(device_types=None), Q.AND)
|
||||||
|
|
||||||
base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
|
# MPTT-based filters
|
||||||
base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND)
|
|
||||||
|
|
||||||
base_query.add(
|
base_query.add(
|
||||||
(Q(
|
(Q(
|
||||||
regions__tree_id=OuterRef('site__region__tree_id'),
|
regions__tree_id=OuterRef('site__region__tree_id'),
|
||||||
@ -140,7 +140,6 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|||||||
) | Q(regions=None)),
|
) | Q(regions=None)),
|
||||||
Q.AND
|
Q.AND
|
||||||
)
|
)
|
||||||
|
|
||||||
base_query.add(
|
base_query.add(
|
||||||
(Q(
|
(Q(
|
||||||
site_groups__tree_id=OuterRef('site__group__tree_id'),
|
site_groups__tree_id=OuterRef('site__group__tree_id'),
|
||||||
@ -150,6 +149,15 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|||||||
) | Q(site_groups=None)),
|
) | Q(site_groups=None)),
|
||||||
Q.AND
|
Q.AND
|
||||||
)
|
)
|
||||||
|
base_query.add(
|
||||||
|
(Q(
|
||||||
|
roles__tree_id=OuterRef('role__tree_id'),
|
||||||
|
roles__level__lte=OuterRef('role__level'),
|
||||||
|
roles__lft__lte=OuterRef('role__lft'),
|
||||||
|
roles__rght__gte=OuterRef('role__rght'),
|
||||||
|
) | Q(roles=None)),
|
||||||
|
Q.AND
|
||||||
|
)
|
||||||
|
|
||||||
return base_query
|
return base_query
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user