diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 1b4de28fa..408403c6f 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -39,7 +39,6 @@ class ASNRangeSerializer(NetBoxModelSerializer): class ASNSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') - range = NestedASNRangeSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) site_count = serializers.IntegerField(read_only=True) provider_count = serializers.IntegerField(read_only=True) @@ -47,7 +46,7 @@ class ASNSerializer(NetBoxModelSerializer): class Meta: model = ASN fields = [ - 'id', 'url', 'display', 'asn', 'rir', 'range', 'tenant', 'description', 'comments', 'tags', 'custom_fields', + 'id', 'url', 'display', 'asn', 'rir', 'tenant', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', ] diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index fdc4b0a8a..4eafd4d3b 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -34,9 +34,7 @@ class IPAMRootView(APIRootView): # class ASNRangeViewSet(NetBoxModelViewSet): - queryset = ASNRange.objects.prefetch_related('tenant', 'rir').annotate( - asn_count=count_related(ASN, 'range') - ) + queryset = ASNRange.objects.prefetch_related('tenant', 'rir').all() serializer_class = serializers.ASNRangeSerializer filterset_class = filtersets.ASNRangeFilterSet diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index dd178e3a9..1a70eaa9e 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -202,16 +202,6 @@ class ASNFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): to_field_name='slug', label=_('RIR (slug)'), ) - range_id = django_filters.ModelMultipleChoiceFilter( - queryset=ASNRange.objects.all(), - label=_('Range (ID)'), - ) - range = django_filters.ModelMultipleChoiceFilter( - field_name='range__slug', - queryset=ASNRange.objects.all(), - to_field_name='slug', - label=_('Range (slug)'), - ) site_id = django_filters.ModelMultipleChoiceFilter( field_name='sites', queryset=Site.objects.all(), diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index e74c6ea87..b28a9f959 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -130,10 +130,6 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): required=False, label=_('RIR') ) - range = DynamicModelChoiceField( - queryset=ASNRange.objects.all(), - required=False - ) tenant = DynamicModelChoiceField( queryset=Tenant.objects.all(), required=False @@ -149,9 +145,9 @@ class ASNBulkEditForm(NetBoxModelBulkEditForm): model = ASN fieldsets = ( - (None, ('sites', 'rir', 'range', 'tenant', 'description')), + (None, ('sites', 'rir', 'tenant', 'description')), ) - nullable_fields = ('range', 'description', 'comments') + nullable_fields = ('tenant', 'description', 'comments') class AggregateBulkEditForm(NetBoxModelBulkEditForm): diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index 803215cb1..9aa592388 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -112,12 +112,6 @@ class ASNImportForm(NetBoxModelImportForm): to_field_name='name', help_text=_('Assigned RIR') ) - range = CSVModelChoiceField( - queryset=ASNRange.objects.all(), - required=False, - to_field_name='name', - help_text=_('ASN range') - ) tenant = CSVModelChoiceField( queryset=Tenant.objects.all(), required=False, @@ -127,7 +121,7 @@ class ASNImportForm(NetBoxModelImportForm): class Meta: model = ASN - fields = ('asn', 'rir', 'range', 'tenant', 'description', 'comments', 'tags') + fields = ('asn', 'rir', 'tenant', 'description', 'comments', 'tags') class RoleImportForm(NetBoxModelImportForm): diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 737f4d16e..e86ed32f6 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -140,7 +140,7 @@ class ASNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = ASN fieldsets = ( (None, ('q', 'filter_id', 'tag')), - ('Assignment', ('rir_id', 'range_id', 'site_id')), + ('Assignment', ('rir_id', 'site_id')), ('Tenant', ('tenant_group_id', 'tenant_id')), ) rir_id = DynamicModelMultipleChoiceField( @@ -148,11 +148,6 @@ class ASNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, label=_('RIR') ) - range_id = DynamicModelMultipleChoiceField( - queryset=ASNRange.objects.all(), - required=False, - label=_('Range') - ) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, diff --git a/netbox/ipam/migrations/0064_asnrange.py b/netbox/ipam/migrations/0064_asnrange.py index c15b7b504..6f5cfe6b8 100644 --- a/netbox/ipam/migrations/0064_asnrange.py +++ b/netbox/ipam/migrations/0064_asnrange.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-02-25 21:18 +# Generated by Django 4.1.7 on 2023-02-26 19:33 from django.db import migrations, models import django.db.models.deletion @@ -38,9 +38,4 @@ class Migration(migrations.Migration): 'ordering': ('name',), }, ), - migrations.AddField( - model_name='asn', - name='range', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ipam.asnrange'), - ), ] diff --git a/netbox/ipam/models/asns.py b/netbox/ipam/models/asns.py index 345b41273..cb62b69fe 100644 --- a/netbox/ipam/models/asns.py +++ b/netbox/ipam/models/asns.py @@ -72,7 +72,7 @@ class ASNRange(OrganizationalModel): Return all available ASNs within this range. """ range = set(self.range) - existing_asns = set(ASN.objects.filter(range=self).values_list('asn', flat=True)) + existing_asns = set(self.get_child_asns().values_list('asn', flat=True)) available_asns = sorted(range - existing_asns) return available_asns @@ -89,12 +89,6 @@ class ASN(PrimaryModel): related_name='asns', verbose_name='RIR' ) - range = models.ForeignKey( - to='ipam.ASNRange', - on_delete=models.PROTECT, - blank=True, - null=True - ) asn = ASNField( unique=True, verbose_name='ASN', @@ -141,9 +135,3 @@ class ASN(PrimaryModel): return f'{self.asn} ({self.asn // 65536}.{self.asn % 65536})' else: return self.asn - - def clean(self): - super().clean() - - if self.range and self.asn not in self.range.range: - raise ValidationError(f"ASN {self.asn} is outside of assigned range ({self.range})") diff --git a/netbox/ipam/tables/asn.py b/netbox/ipam/tables/asn.py index 2db3457af..511e914ec 100644 --- a/netbox/ipam/tables/asn.py +++ b/netbox/ipam/tables/asn.py @@ -43,9 +43,6 @@ class ASNTable(TenancyColumnsMixin, NetBoxTable): rir = tables.Column( linkify=True ) - range = tables.Column( - linkify=True - ) asn_asdot = tables.Column( accessor=tables.A('asn_asdot'), linkify=True, @@ -72,9 +69,9 @@ class ASNTable(TenancyColumnsMixin, NetBoxTable): class Meta(NetBoxTable.Meta): model = ASN fields = ( - 'pk', 'asn', 'asn_asdot', 'rir', 'range', 'site_count', 'provider_count', 'tenant', 'tenant_group', - 'description', 'comments', 'sites', 'tags', 'created', 'last_updated', 'actions', + 'pk', 'asn', 'asn_asdot', 'rir', 'site_count', 'provider_count', 'tenant', 'tenant_group', 'description', + 'comments', 'sites', 'tags', 'created', 'last_updated', 'actions', ) default_columns = ( - 'pk', 'asn', 'rir', 'range', 'site_count', 'provider_count', 'sites', 'description', 'tenant', + 'pk', 'asn', 'rir', 'site_count', 'provider_count', 'sites', 'description', 'tenant', ) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 2b5903b54..b876aabc0 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -92,12 +92,6 @@ class ASNTest(APIViewTestCases.APIViewTestCase): ) RIR.objects.bulk_create(rirs) - ranges = ( - ASNRange(name='ASN Range 1', slug='asn-range-1', rir=rirs[0], start=65001, end=65100), - ASNRange(name='ASN Range 2', slug='asn-range-2', rir=rirs[1], start=4200000001, end=4200000100), - ) - ASNRange.objects.bulk_create(ranges) - sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2') @@ -112,9 +106,9 @@ class ASNTest(APIViewTestCases.APIViewTestCase): asns = ( ASN(asn=65000, rir=rirs[0], tenant=tenants[0]), - ASN(asn=65001, rir=rirs[0], tenant=tenants[1], range=ranges[0]), + ASN(asn=65001, rir=rirs[0], tenant=tenants[1]), ASN(asn=4200000000, rir=rirs[1], tenant=tenants[0]), - ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1], range=ranges[1]), + ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]), ) ASN.objects.bulk_create(asns) @@ -131,12 +125,10 @@ class ASNTest(APIViewTestCases.APIViewTestCase): { 'asn': 65002, 'rir': rirs[0].pk, - 'range': ranges[0].pk, }, { 'asn': 4200000002, 'rir': rirs[1].pk, - 'range': ranges[1].pk, }, ] diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index eb3ea0038..fee308642 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -78,14 +78,18 @@ class ASNTestCase(ViewTestCases.PrimaryObjectViewTestCase): RIR(name='RIR 2', slug='rir-2', is_private=True), ] RIR.objects.bulk_create(rirs) - sites = [ - Site.objects.create(name='Site 1', slug='site-1'), - Site.objects.create(name='Site 2', slug='site-2') - ] - tenants = [ - Tenant.objects.create(name='Tenant 1', slug='tenant-1'), - Tenant.objects.create(name='Tenant 2', slug='tenant-2'), - ] + + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2') + ) + Site.objects.bulk_create(sites) + + tenants = ( + Tenant(name='Tenant 1', slug='tenant-1'), + Tenant(name='Tenant 2', slug='tenant-2'), + ) + Tenant.objects.bulk_create(tenants) asns = ( ASN(asn=65001, rir=rirs[0], tenant=tenants[0]), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f6fde2a5d..5e9d98324 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -199,9 +199,7 @@ class RIRBulkDeleteView(generic.BulkDeleteView): # class ASNRangeListView(generic.ObjectListView): - queryset = ASNRange.objects.annotate( - asn_count=count_related(ASN, 'range'), - ) + queryset = ASNRange.objects.all() filterset = filtersets.ASNRangeFilterSet filterset_form = forms.ASNRangeFilterForm table = tables.ASNRangeTable diff --git a/netbox/templates/ipam/asn.html b/netbox/templates/ipam/asn.html index f45e087d8..f05febe47 100644 --- a/netbox/templates/ipam/asn.html +++ b/netbox/templates/ipam/asn.html @@ -29,10 +29,6 @@ {{ object.rir }} - - Range - {{ object.range|linkify|placeholder }} - Tenant