From 00db7f7d1e5b7eb32cb22d27b023b41a6c1f05f4 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Mon, 17 Mar 2025 22:31:19 +0000 Subject: [PATCH 1/9] Add VLAN Related Object --- netbox/dcim/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 1c54f93d126..22aa1276967 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 @@ -340,6 +340,7 @@ def get_extra_context(self, request, instance): 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'), + (VLAN.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), ( Circuit.objects.restrict(request.user, 'view').filter( terminations___site_group=instance From eaca8aa93e4b2f7c009f61723ad6cdc0371435c7 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Mon, 17 Mar 2025 23:20:32 +0000 Subject: [PATCH 2/9] Add VLANGroup Related Object --- netbox/dcim/views.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 22aa1276967..3aa2b5290da 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -341,6 +341,13 @@ def get_extra_context(self, request, instance): (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'), (VLAN.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 From 9cd36f2d4096dd9c139e753fb120f50c2c854d43 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Mon, 17 Mar 2025 23:39:27 +0000 Subject: [PATCH 3/9] add VirtualMachine --- netbox/dcim/views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 3aa2b5290da..4cbf2d0d22c 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -341,12 +341,17 @@ def get_extra_context(self, request, instance): (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'), (VLAN.objects.restrict(request.user, 'view').filter(site__group__in=groups), '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' + 'site_group' ), ( Circuit.objects.restrict(request.user, 'view').filter( From 39b5c5fded5cac63851a47575a64166d69028210 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Mon, 17 Mar 2025 23:56:36 +0000 Subject: [PATCH 4/9] add Device --- netbox/dcim/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4cbf2d0d22c..90bd4629a19 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -340,6 +340,7 @@ def get_extra_context(self, request, instance): 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'), ( VirtualMachine.objects.restrict(request.user, 'view').filter( From 2bfaab1528da7178ada1686a7b636acc27389660 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 19 Mar 2025 01:09:01 +0000 Subject: [PATCH 5/9] Add ASN to Related Objects --- netbox/dcim/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 90bd4629a19..8269d315558 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -342,6 +342,11 @@ def get_extra_context(self, request, instance): (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), From 588cf9459ee72acd8559adfc2386086591e717ca Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Thu, 27 Mar 2025 23:20:26 +0000 Subject: [PATCH 6/9] Add VLANGroup at RegionView get_related_models --- netbox/dcim/views.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8269d315558..889573c7756 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -247,6 +247,13 @@ 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 (Cluster.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), From 9d3e72fd0fa31a001e1da5fed852d86c40d8a0c9 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Thu, 27 Mar 2025 23:47:19 +0000 Subject: [PATCH 7/9] Add VLANGroup to RackView get_related_models --- netbox/dcim/views.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 889573c7756..ca025f3e330 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -840,7 +840,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, From eed4117c30a5f2b714216e2280b2827f3e995f20 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Thu, 27 Mar 2025 23:56:12 +0000 Subject: [PATCH 8/9] Add VLANGroup to ClusterGroupView get_related_models --- netbox/virtualization/views.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 343d346e490..6cd36cd863d 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -1,4 +1,5 @@ from django.contrib import messages +from django.contrib.contenttypes.models import ContentType from django.db import transaction from django.db.models import Prefetch, Sum from django.shortcuts import get_object_or_404, redirect, render @@ -10,7 +11,7 @@ from dcim.models import Device from dcim.tables import DeviceTable from extras.views import ObjectConfigContextView, ObjectRenderConfigView -from ipam.models import IPAddress +from ipam.models import IPAddress, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic @@ -103,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'), + ), + ), } From aad0acac85dab83cd91ab87acbcf343db16542a0 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Thu, 10 Apr 2025 21:57:18 +0000 Subject: [PATCH 9/9] Fix CircuitTermination relations --- netbox/circuits/views.py | 5 +++++ netbox/dcim/views.py | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) 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 ca025f3e330..db9024e1933 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -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'), @@ -256,6 +256,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(_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'), @@ -343,7 +347,7 @@ 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'), @@ -374,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' @@ -481,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'), ), ), } @@ -565,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( @@ -575,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'),