Skip to content

Commit 7420c25

Browse files
Fixes: #18881 Site Groups are missing VLAN and VM related objects (#18932)
1 parent 248c94b commit 7420c25

File tree

3 files changed

+71
-6
lines changed

3 files changed

+71
-6
lines changed

netbox/circuits/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,16 @@ def get_extra_context(self, request, instance):
170170
'related_models': self.get_related_models(
171171
request,
172172
instance,
173+
omit=(CircuitTermination,),
173174
extra=(
174175
(
175176
Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance),
176177
'provider_network_id',
177178
),
179+
(
180+
CircuitTermination.objects.restrict(request.user, 'view').filter(_provider_network=instance),
181+
'provider_network_id',
182+
),
178183
),
179184
),
180185
}

netbox/dcim/views.py

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from circuits.models import Circuit, CircuitTermination
1515
from extras.views import ObjectConfigContextView, ObjectRenderConfigView
16-
from ipam.models import ASN, IPAddress, Prefix, VLANGroup
16+
from ipam.models import ASN, IPAddress, Prefix, VLANGroup, VLAN
1717
from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable
1818
from netbox.constants import DEFAULT_ACTION_PERMISSIONS
1919
from netbox.views import generic
@@ -237,7 +237,7 @@ def get_extra_context(self, request, instance):
237237
'related_models': self.get_related_models(
238238
request,
239239
regions,
240-
omit=(Cluster, Prefix, WirelessLAN),
240+
omit=(Cluster, CircuitTermination, Prefix, WirelessLAN),
241241
extra=(
242242
(Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
243243
(Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'),
@@ -247,8 +247,19 @@ def get_extra_context(self, request, instance):
247247
).distinct(),
248248
'region_id'
249249
),
250+
(
251+
VLANGroup.objects.restrict(request.user, 'view').filter(
252+
scope_type=ContentType.objects.get_for_model(Region),
253+
scope_id__in=regions
254+
).distinct(),
255+
'region'
256+
),
250257

251258
# Handle these relations manually to avoid erroneous filter name resolution
259+
(
260+
CircuitTermination.objects.restrict(request.user, 'view').filter(_region__in=regions),
261+
'region_id'
262+
),
252263
(Cluster.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
253264
(Prefix.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
254265
(WirelessLAN.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'),
@@ -336,10 +347,29 @@ def get_extra_context(self, request, instance):
336347
'related_models': self.get_related_models(
337348
request,
338349
groups,
339-
omit=(Cluster, Prefix, WirelessLAN),
350+
omit=(Cluster, CircuitTermination, Prefix, WirelessLAN),
340351
extra=(
341352
(Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
342353
(Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
354+
(Device.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
355+
(VLAN.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'),
356+
(
357+
ASN.objects.restrict(request.user, 'view').filter(
358+
sites__group__in=groups
359+
).distinct(),
360+
'site_group_id'),
361+
(
362+
VirtualMachine.objects.restrict(request.user, 'view').filter(
363+
site__group__in=groups),
364+
'site_group_id'
365+
),
366+
(
367+
VLANGroup.objects.restrict(request.user, 'view').filter(
368+
scope_type=ContentType.objects.get_for_model(SiteGroup),
369+
scope_id__in=groups
370+
).distinct(),
371+
'site_group'
372+
),
343373
(
344374
Circuit.objects.restrict(request.user, 'view').filter(
345375
terminations___site_group=instance
@@ -348,6 +378,10 @@ def get_extra_context(self, request, instance):
348378
),
349379

350380
# Handle these relations manually to avoid erroneous filter name resolution
381+
(
382+
CircuitTermination.objects.restrict(request.user, 'view').filter(_site_group__in=groups),
383+
'site_group_id'
384+
),
351385
(
352386
Cluster.objects.restrict(request.user, 'view').filter(_site_group__in=groups),
353387
'site_group_id'
@@ -455,6 +489,7 @@ def get_extra_context(self, request, instance):
455489
(Cluster.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
456490
(Prefix.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
457491
(WirelessLAN.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
492+
(CircuitTermination.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'),
458493
),
459494
),
460495
}
@@ -539,7 +574,7 @@ def get_extra_context(self, request, instance):
539574
'related_models': self.get_related_models(
540575
request,
541576
locations,
542-
omit=[CableTermination, Cluster, Prefix, WirelessLAN],
577+
omit=[CableTermination, CircuitTermination, Cluster, Prefix, WirelessLAN],
543578
extra=(
544579
(
545580
Circuit.objects.restrict(request.user, 'view').filter(
@@ -549,6 +584,10 @@ def get_extra_context(self, request, instance):
549584
),
550585

551586
# Handle these relations manually to avoid erroneous filter name resolution
587+
(
588+
CircuitTermination.objects.restrict(request.user, 'view').filter(_location=instance),
589+
'location_id'
590+
),
552591
(Cluster.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
553592
(Prefix.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
554593
(WirelessLAN.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'),
@@ -814,7 +853,18 @@ def get_extra_context(self, request, instance):
814853
])
815854

816855
return {
817-
'related_models': self.get_related_models(request, instance, [CableTermination]),
856+
'related_models': self.get_related_models(
857+
request,
858+
instance,
859+
omit=(CableTermination,),
860+
extra=(
861+
(
862+
VLANGroup.objects.restrict(request.user, 'view').filter(
863+
scope_type=ContentType.objects.get_for_model(Rack),
864+
scope_id=instance.pk
865+
), 'rack'),
866+
),
867+
),
818868
'next_rack': next_rack,
819869
'prev_rack': prev_rack,
820870
'svg_extra': svg_extra,

netbox/virtualization/views.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,17 @@ class ClusterGroupView(GetRelatedModelsMixin, generic.ObjectView):
104104

105105
def get_extra_context(self, request, instance):
106106
return {
107-
'related_models': self.get_related_models(request, instance),
107+
'related_models': self.get_related_models(
108+
request,
109+
instance,
110+
extra=(
111+
(
112+
VLANGroup.objects.restrict(request.user, 'view').filter(
113+
scope_type=ContentType.objects.get_for_model(ClusterGroup),
114+
scope_id=instance.pk
115+
), 'cluster_group'),
116+
),
117+
),
108118
}
109119

110120

0 commit comments

Comments
 (0)