Skip to content

Commit 5ed87b1

Browse files
committed
Closes #14538 - Add available_at_site filter
1 parent d14e4ab commit 5ed87b1

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

netbox/ipam/filtersets.py

+8
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,10 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
950950
choices=VLANStatusChoices,
951951
null_value=None
952952
)
953+
available_at_site = django_filters.ModelChoiceFilter(
954+
queryset=Site.objects.all(),
955+
method='get_for_site'
956+
)
953957
available_on_device = django_filters.ModelChoiceFilter(
954958
queryset=Device.objects.all(),
955959
method='get_for_device'
@@ -984,6 +988,10 @@ def search(self, queryset, name, value):
984988
pass
985989
return queryset.filter(qs_filter)
986990

991+
@extend_schema_field(OpenApiTypes.STR)
992+
def get_for_site(self, queryset, name, value):
993+
return queryset.get_for_site(value)
994+
987995
@extend_schema_field(OpenApiTypes.STR)
988996
def get_for_device(self, queryset, name, value):
989997
return queryset.get_for_device(value)

netbox/ipam/querysets.py

+29
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,35 @@ def annotate_utilization(self):
6969

7070
class VLANQuerySet(RestrictedQuerySet):
7171

72+
def get_for_site(self, site):
73+
"""
74+
Return all VLANs in the specified site
75+
"""
76+
from .models import VLANGroup
77+
q = Q()
78+
q |= Q(
79+
scope_type=ContentType.objects.get_by_natural_key('dcim', 'site'),
80+
scope_id=site.pk
81+
)
82+
83+
if site.region:
84+
q |= Q(
85+
scope_type=ContentType.objects.get_by_natural_key('dcim', 'region'),
86+
scope_id__in=site.region.get_ancestors(include_self=True)
87+
)
88+
if site.group:
89+
q |= Q(
90+
scope_type=ContentType.objects.get_by_natural_key('dcim', 'sitegroup'),
91+
scope_id__in=site.group.get_ancestors(include_self=True)
92+
)
93+
94+
return self.filter(
95+
Q(group__in=VLANGroup.objects.filter(q)) |
96+
Q(site=site) |
97+
Q(group__scope_id__isnull=True, site__isnull=True) | # Global group VLANs
98+
Q(group__isnull=True, site__isnull=True) # Global VLANs
99+
)
100+
72101
def get_for_device(self, device):
73102
"""
74103
Return all VLANs available to the specified Device.

0 commit comments

Comments
 (0)