Skip to content

Fixes: #18881 Site Groups are missing VLAN and VM related objects #18932

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5 changes: 5 additions & 0 deletions netbox/circuits/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
),
),
),
}
Expand Down
60 changes: 55 additions & 5 deletions netbox/dcim/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'),
Expand All @@ -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'),
Expand Down Expand Up @@ -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
Expand All @@ -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'
Expand Down Expand Up @@ -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'),
),
),
}
Expand Down Expand Up @@ -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(
Expand All @@ -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'),
Expand Down Expand Up @@ -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,
Expand Down
12 changes: 11 additions & 1 deletion netbox/virtualization/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
),
),
}


Expand Down