Update prefix filters

This commit is contained in:
Jeremy Stretch 2024-10-07 16:52:29 -04:00
parent f34818df71
commit fad3457d36
3 changed files with 63 additions and 47 deletions

View File

@ -9,7 +9,7 @@ from drf_spectacular.utils import extend_schema_field
from netaddr.core import AddrFormatError from netaddr.core import AddrFormatError
from circuits.models import Provider from circuits.models import Provider
from dcim.models import Device, Interface, Region, Site, SiteGroup from dcim.models import Device, Interface, Location, Region, Site, SiteGroup
from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet
from tenancy.filtersets import TenancyFilterSet from tenancy.filtersets import TenancyFilterSet
from utilities.filters import ( from utilities.filters import (
@ -332,42 +332,57 @@ class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
to_field_name='rd', to_field_name='rd',
label=_('VRF (RD)'), label=_('VRF (RD)'),
) )
# region_id = TreeNodeMultipleChoiceFilter( scope_type = ContentTypeFilter()
# queryset=Region.objects.all(), region_id = TreeNodeMultipleChoiceFilter(
# field_name='site__region', queryset=Region.objects.all(),
# lookup_expr='in', field_name='_region',
# label=_('Region (ID)'), lookup_expr='in',
# ) label=_('Region (ID)'),
# region = TreeNodeMultipleChoiceFilter( )
# queryset=Region.objects.all(), region = TreeNodeMultipleChoiceFilter(
# field_name='site__region', queryset=Region.objects.all(),
# lookup_expr='in', field_name='_region',
# to_field_name='slug', lookup_expr='in',
# label=_('Region (slug)'), to_field_name='slug',
# ) label=_('Region (slug)'),
# site_group_id = TreeNodeMultipleChoiceFilter( )
# queryset=SiteGroup.objects.all(), site_group_id = TreeNodeMultipleChoiceFilter(
# field_name='site__group', queryset=SiteGroup.objects.all(),
# lookup_expr='in', field_name='_sitegroup',
# label=_('Site group (ID)'), lookup_expr='in',
# ) label=_('Site group (ID)'),
# site_group = TreeNodeMultipleChoiceFilter( )
# queryset=SiteGroup.objects.all(), site_group = TreeNodeMultipleChoiceFilter(
# field_name='site__group', queryset=SiteGroup.objects.all(),
# lookup_expr='in', field_name='_sitegroup',
# to_field_name='slug', lookup_expr='in',
# label=_('Site group (slug)'), to_field_name='slug',
# ) label=_('Site group (slug)'),
# site_id = django_filters.ModelMultipleChoiceFilter( )
# queryset=Site.objects.all(), site_id = django_filters.ModelMultipleChoiceFilter(
# label=_('Site (ID)'), queryset=Site.objects.all(),
# ) field_name='_site',
# site = django_filters.ModelMultipleChoiceFilter( label=_('Site (ID)'),
# field_name='site__slug', )
# queryset=Site.objects.all(), site = django_filters.ModelMultipleChoiceFilter(
# to_field_name='slug', field_name='_site__slug',
# label=_('Site (slug)'), queryset=Site.objects.all(),
# ) to_field_name='slug',
label=_('Site (slug)'),
)
location_id = TreeNodeMultipleChoiceFilter(
queryset=Location.objects.all(),
field_name='_location',
lookup_expr='in',
label=_('Location (ID)'),
)
location = TreeNodeMultipleChoiceFilter(
queryset=Location.objects.all(),
field_name='_location',
lookup_expr='in',
to_field_name='slug',
label=_('Location (slug)'),
)
vlan_id = django_filters.ModelMultipleChoiceFilter( vlan_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
label=_('VLAN (ID)'), label=_('VLAN (ID)'),
@ -393,7 +408,7 @@ class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
class Meta: class Meta:
model = Prefix model = Prefix
fields = ('id', 'is_pool', 'mark_utilized', 'description') fields = ('id', 'scope_id', 'is_pool', 'mark_utilized', 'description')
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -8,9 +8,10 @@ def copy_site_assignments(apps, schema_editor):
""" """
ContentType = apps.get_model('contenttypes', 'ContentType') ContentType = apps.get_model('contenttypes', 'ContentType')
Prefix = apps.get_model('ipam', 'Prefix') Prefix = apps.get_model('ipam', 'Prefix')
Site = apps.get_model('dcim', 'Site')
Prefix.objects.filter(site__isnull=False).update( Prefix.objects.filter(site__isnull=False).update(
scope_type=ContentType.objects.get_by_natural_key('dcim', 'site'), scope_type=ContentType.objects.get_for_model(Site),
scope_id=models.F('site_id') scope_id=models.F('site_id')
) )

View File

@ -656,14 +656,14 @@ class PrefixTestCase(TestCase, ChangeLoggedFilterSetTests):
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
prefixes = ( prefixes = (
Prefix(prefix='10.0.0.0/24', tenant=None, site=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True, description='foobar1'), Prefix(prefix='10.0.0.0/24', tenant=None, scope=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True, description='foobar1'),
Prefix(prefix='10.0.1.0/24', tenant=tenants[0], site=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0], description='foobar2'), Prefix(prefix='10.0.1.0/24', tenant=tenants[0], scope=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0], description='foobar2'),
Prefix(prefix='10.0.2.0/24', tenant=tenants[1], site=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED), Prefix(prefix='10.0.2.0/24', tenant=tenants[1], scope=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED),
Prefix(prefix='10.0.3.0/24', tenant=tenants[2], site=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED), Prefix(prefix='10.0.3.0/24', tenant=tenants[2], scope=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED),
Prefix(prefix='2001:db8::/64', tenant=None, site=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True), Prefix(prefix='2001:db8::/64', tenant=None, scope=None, vrf=None, vlan=None, role=None, is_pool=True, mark_utilized=True),
Prefix(prefix='2001:db8:0:1::/64', tenant=tenants[0], site=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0]), Prefix(prefix='2001:db8:0:1::/64', tenant=tenants[0], scope=sites[0], vrf=vrfs[0], vlan=vlans[0], role=roles[0]),
Prefix(prefix='2001:db8:0:2::/64', tenant=tenants[1], site=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED), Prefix(prefix='2001:db8:0:2::/64', tenant=tenants[1], scope=sites[1], vrf=vrfs[1], vlan=vlans[1], role=roles[1], status=PrefixStatusChoices.STATUS_DEPRECATED),
Prefix(prefix='2001:db8:0:3::/64', tenant=tenants[2], site=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED), Prefix(prefix='2001:db8:0:3::/64', tenant=tenants[2], scope=sites[2], vrf=vrfs[2], vlan=vlans[2], role=roles[2], status=PrefixStatusChoices.STATUS_RESERVED),
Prefix(prefix='10.0.0.0/16'), Prefix(prefix='10.0.0.0/16'),
Prefix(prefix='2001:db8::/32'), Prefix(prefix='2001:db8::/32'),
) )