mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-18 05:28:16 -06:00
Closes #14538 - Add available_at_site filter
This commit is contained in:
parent
d14e4ab52b
commit
5ed87b121a
@ -950,6 +950,10 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
|
|||||||
choices=VLANStatusChoices,
|
choices=VLANStatusChoices,
|
||||||
null_value=None
|
null_value=None
|
||||||
)
|
)
|
||||||
|
available_at_site = django_filters.ModelChoiceFilter(
|
||||||
|
queryset=Site.objects.all(),
|
||||||
|
method='get_for_site'
|
||||||
|
)
|
||||||
available_on_device = django_filters.ModelChoiceFilter(
|
available_on_device = django_filters.ModelChoiceFilter(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
method='get_for_device'
|
method='get_for_device'
|
||||||
@ -984,6 +988,10 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
|
|||||||
pass
|
pass
|
||||||
return queryset.filter(qs_filter)
|
return queryset.filter(qs_filter)
|
||||||
|
|
||||||
|
@extend_schema_field(OpenApiTypes.STR)
|
||||||
|
def get_for_site(self, queryset, name, value):
|
||||||
|
return queryset.get_for_site(value)
|
||||||
|
|
||||||
@extend_schema_field(OpenApiTypes.STR)
|
@extend_schema_field(OpenApiTypes.STR)
|
||||||
def get_for_device(self, queryset, name, value):
|
def get_for_device(self, queryset, name, value):
|
||||||
return queryset.get_for_device(value)
|
return queryset.get_for_device(value)
|
||||||
|
@ -69,6 +69,35 @@ class VLANGroupQuerySet(RestrictedQuerySet):
|
|||||||
|
|
||||||
class VLANQuerySet(RestrictedQuerySet):
|
class VLANQuerySet(RestrictedQuerySet):
|
||||||
|
|
||||||
|
def get_for_site(self, site):
|
||||||
|
"""
|
||||||
|
Return all VLANs in the specified site
|
||||||
|
"""
|
||||||
|
from .models import VLANGroup
|
||||||
|
q = Q()
|
||||||
|
q |= Q(
|
||||||
|
scope_type=ContentType.objects.get_by_natural_key('dcim', 'site'),
|
||||||
|
scope_id=site.pk
|
||||||
|
)
|
||||||
|
|
||||||
|
if site.region:
|
||||||
|
q |= Q(
|
||||||
|
scope_type=ContentType.objects.get_by_natural_key('dcim', 'region'),
|
||||||
|
scope_id__in=site.region.get_ancestors(include_self=True)
|
||||||
|
)
|
||||||
|
if site.group:
|
||||||
|
q |= Q(
|
||||||
|
scope_type=ContentType.objects.get_by_natural_key('dcim', 'sitegroup'),
|
||||||
|
scope_id__in=site.group.get_ancestors(include_self=True)
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.filter(
|
||||||
|
Q(group__in=VLANGroup.objects.filter(q)) |
|
||||||
|
Q(site=site) |
|
||||||
|
Q(group__scope_id__isnull=True, site__isnull=True) | # Global group VLANs
|
||||||
|
Q(group__isnull=True, site__isnull=True) # Global VLANs
|
||||||
|
)
|
||||||
|
|
||||||
def get_for_device(self, device):
|
def get_for_device(self, device):
|
||||||
"""
|
"""
|
||||||
Return all VLANs available to the specified Device.
|
Return all VLANs available to the specified Device.
|
||||||
|
Loading…
Reference in New Issue
Block a user