diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 766a54bb875..8e3880e8b74 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -170,11 +170,16 @@ def get_extra_context(self, request, instance): 'related_models': self.get_related_models( request, instance, + omit=(CircuitTermination,), extra=( ( Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance), 'provider_network_id', ), + ( + CircuitTermination.objects.restrict(request.user, 'view').filter(_provider_network=instance), + 'provider_network_id', + ), ), ), } diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 1c54f93d126..db9024e1933 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -13,7 +13,7 @@ from circuits.models import Circuit, CircuitTermination from extras.views import ObjectConfigContextView, ObjectRenderConfigView -from ipam.models import ASN, IPAddress, Prefix, VLANGroup +from ipam.models import ASN, IPAddress, Prefix, VLANGroup, VLAN from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic @@ -237,7 +237,7 @@ def get_extra_context(self, request, instance): 'related_models': self.get_related_models( request, regions, - omit=(Cluster, Prefix, WirelessLAN), + omit=(Cluster, CircuitTermination, Prefix, WirelessLAN), extra=( (Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), @@ -247,8 +247,19 @@ def get_extra_context(self, request, instance): ).distinct(), 'region_id' ), + ( + VLANGroup.objects.restrict(request.user, 'view').filter( + scope_type=ContentType.objects.get_for_model(Region), + scope_id__in=regions + ).distinct(), + 'region' + ), # Handle these relations manually to avoid erroneous filter name resolution + ( + CircuitTermination.objects.restrict(request.user, 'view').filter(_region__in=regions), + 'region_id' + ), (Cluster.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), (Prefix.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), (WirelessLAN.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), @@ -336,10 +347,29 @@ def get_extra_context(self, request, instance): 'related_models': self.get_related_models( request, groups, - omit=(Cluster, Prefix, WirelessLAN), + omit=(Cluster, CircuitTermination, Prefix, WirelessLAN), extra=( (Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), + (Device.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), + (VLAN.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), + ( + ASN.objects.restrict(request.user, 'view').filter( + sites__group__in=groups + ).distinct(), + 'site_group_id'), + ( + VirtualMachine.objects.restrict(request.user, 'view').filter( + site__group__in=groups), + 'site_group_id' + ), + ( + VLANGroup.objects.restrict(request.user, 'view').filter( + scope_type=ContentType.objects.get_for_model(SiteGroup), + scope_id__in=groups + ).distinct(), + 'site_group' + ), ( Circuit.objects.restrict(request.user, 'view').filter( terminations___site_group=instance @@ -348,6 +378,10 @@ def get_extra_context(self, request, instance): ), # Handle these relations manually to avoid erroneous filter name resolution + ( + CircuitTermination.objects.restrict(request.user, 'view').filter(_site_group__in=groups), + 'site_group_id' + ), ( Cluster.objects.restrict(request.user, 'view').filter(_site_group__in=groups), 'site_group_id' @@ -455,6 +489,7 @@ def get_extra_context(self, request, instance): (Cluster.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), (Prefix.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), (WirelessLAN.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), + (CircuitTermination.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), ), ), } @@ -539,7 +574,7 @@ def get_extra_context(self, request, instance): 'related_models': self.get_related_models( request, locations, - omit=[CableTermination, Cluster, Prefix, WirelessLAN], + omit=[CableTermination, CircuitTermination, Cluster, Prefix, WirelessLAN], extra=( ( Circuit.objects.restrict(request.user, 'view').filter( @@ -549,6 +584,10 @@ def get_extra_context(self, request, instance): ), # Handle these relations manually to avoid erroneous filter name resolution + ( + CircuitTermination.objects.restrict(request.user, 'view').filter(_location=instance), + 'location_id' + ), (Cluster.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), (Prefix.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), (WirelessLAN.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), @@ -814,7 +853,18 @@ def get_extra_context(self, request, instance): ]) return { - 'related_models': self.get_related_models(request, instance, [CableTermination]), + 'related_models': self.get_related_models( + request, + instance, + omit=(CableTermination,), + extra=( + ( + VLANGroup.objects.restrict(request.user, 'view').filter( + scope_type=ContentType.objects.get_for_model(Rack), + scope_id=instance.pk + ), 'rack'), + ), + ), 'next_rack': next_rack, 'prev_rack': prev_rack, 'svg_extra': svg_extra, diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index a3b1398657f..81568b4f9fa 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -104,7 +104,17 @@ class ClusterGroupView(GetRelatedModelsMixin, generic.ObjectView): def get_extra_context(self, request, instance): return { - 'related_models': self.get_related_models(request, instance), + 'related_models': self.get_related_models( + request, + instance, + extra=( + ( + VLANGroup.objects.restrict(request.user, 'view').filter( + scope_type=ContentType.objects.get_for_model(ClusterGroup), + scope_id=instance.pk + ), 'cluster_group'), + ), + ), }