From f007b0dbde243126a0955252f355c1a4a4ca29f2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 6 Dec 2016 13:59:13 -0500 Subject: [PATCH] Closes #695: Added is_private field to RIR --- netbox/ipam/admin.py | 2 +- netbox/ipam/api/serializers.py | 4 ++-- netbox/ipam/filters.py | 7 +++++++ netbox/ipam/fixtures/initial_data.json | 18 +++++++++++------ netbox/ipam/forms.py | 10 +++++++++- .../migrations/0011_rir_add_is_private.py | 20 +++++++++++++++++++ netbox/ipam/models.py | 2 ++ netbox/ipam/tables.py | 4 +++- netbox/ipam/views.py | 2 ++ netbox/templates/ipam/rir_list.html | 13 +++++++----- 10 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 netbox/ipam/migrations/0011_rir_add_is_private.py diff --git a/netbox/ipam/admin.py b/netbox/ipam/admin.py index 56113a44e..f3f914129 100644 --- a/netbox/ipam/admin.py +++ b/netbox/ipam/admin.py @@ -28,7 +28,7 @@ class RIRAdmin(admin.ModelAdmin): prepopulated_fields = { 'slug': ['name'], } - list_display = ['name', 'slug'] + list_display = ['name', 'slug', 'is_private'] @admin.register(Aggregate) diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index f7cf20636..742eba9ea 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -58,13 +58,13 @@ class RIRSerializer(serializers.ModelSerializer): class Meta: model = RIR - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'slug', 'is_private'] class RIRNestedSerializer(RIRSerializer): class Meta(RIRSerializer.Meta): - pass + fields = ['id', 'name', 'slug'] # diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index e7e150b34..bb04ca78e 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -46,6 +46,13 @@ class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): fields = ['name', 'rd'] +class RIRFilter(django_filters.FilterSet): + + class Meta: + model = RIR + fields = ['is_private'] + + class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): q = django_filters.MethodFilter( action='search', diff --git a/netbox/ipam/fixtures/initial_data.json b/netbox/ipam/fixtures/initial_data.json index 5e7659422..da6b4a9ca 100644 --- a/netbox/ipam/fixtures/initial_data.json +++ b/netbox/ipam/fixtures/initial_data.json @@ -43,7 +43,8 @@ "pk": 1, "fields": { "name": "ARIN", - "slug": "arin" + "slug": "arin", + "is_private": false } }, { @@ -51,7 +52,8 @@ "pk": 2, "fields": { "name": "RIPE", - "slug": "ripe" + "slug": "ripe", + "is_private": false } }, { @@ -59,7 +61,8 @@ "pk": 3, "fields": { "name": "APNIC", - "slug": "apnic" + "slug": "apnic", + "is_private": false } }, { @@ -67,7 +70,8 @@ "pk": 4, "fields": { "name": "LACNIC", - "slug": "lacnic" + "slug": "lacnic", + "is_private": false } }, { @@ -75,7 +79,8 @@ "pk": 5, "fields": { "name": "AFRINIC", - "slug": "afrinic" + "slug": "afrinic", + "is_private": false } }, { @@ -83,7 +88,8 @@ "pk": 6, "fields": { "name": "RFC 1918", - "slug": "rfc-1918" + "slug": "rfc-1918", + "is_private": true } }, { diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 1a9e25db3..08bb5db04 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -75,7 +75,15 @@ class RIRForm(forms.ModelForm, BootstrapMixin): class Meta: model = RIR - fields = ['name', 'slug'] + fields = ['name', 'slug', 'is_private'] + + +class RIRFilterForm(forms.Form, BootstrapMixin): + is_private = forms.NullBooleanField(required=False, label='Private', widget=forms.Select(choices=[ + ('', '---------'), + ('True', 'Yes'), + ('False', 'No'), + ])) # diff --git a/netbox/ipam/migrations/0011_rir_add_is_private.py b/netbox/ipam/migrations/0011_rir_add_is_private.py new file mode 100644 index 000000000..ad7732653 --- /dev/null +++ b/netbox/ipam/migrations/0011_rir_add_is_private.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-12-06 18:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0010_ipaddress_help_texts'), + ] + + operations = [ + migrations.AddField( + model_name='rir', + name='is_private', + field=models.BooleanField(default=False, help_text=b'IP space managed by this RIR is considered private', verbose_name=b'Private'), + ), + ] diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 1538251cf..5f28acaed 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -103,6 +103,8 @@ class RIR(models.Model): """ name = models.CharField(max_length=50, unique=True) slug = models.SlugField(unique=True) + is_private = models.BooleanField(default=False, verbose_name='Private', + help_text='IP space managed by this RIR is considered private') class Meta: ordering = ['name'] diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index f58dc6673..81953a348 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -126,6 +126,7 @@ class VRFTable(BaseTable): class RIRTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') + is_private = tables.BooleanColumn(verbose_name='Private') aggregate_count = tables.Column(verbose_name='Aggregates') stats_total = tables.Column(accessor='stats.total', verbose_name='Total', footer=lambda table: sum(r.stats['total'] for r in table.data)) @@ -142,7 +143,8 @@ class RIRTable(BaseTable): class Meta(BaseTable.Meta): model = RIR - fields = ('pk', 'name', 'aggregate_count', 'stats_total', 'stats_active', 'stats_reserved', 'stats_deprecated', 'stats_available', 'utilization', 'actions') + fields = ('pk', 'name', 'is_private', 'aggregate_count', 'stats_total', 'stats_active', 'stats_reserved', + 'stats_deprecated', 'stats_available', 'utilization', 'actions') # diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 78bb1c148..0be5b225e 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -154,6 +154,8 @@ class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RIRListView(ObjectListView): queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')) + filter = filters.RIRFilter + filter_form = forms.RIRFilterForm table = tables.RIRTable edit_permissions = ['ipam.change_rir', 'ipam.delete_rir'] template_name = 'ipam/rir_list.html' diff --git a/netbox/templates/ipam/rir_list.html b/netbox/templates/ipam/rir_list.html index 756e91d7f..4d71431a2 100644 --- a/netbox/templates/ipam/rir_list.html +++ b/netbox/templates/ipam/rir_list.html @@ -12,7 +12,7 @@ IPv4 Stats {% else %} - + IPv6 Stats @@ -26,11 +26,14 @@

RIRs

-
+
{% include 'utilities/obj_table.html' with bulk_delete_url='ipam:rir_bulk_delete' %} + {% if request.GET.family == '6' %} +
Note: Numbers shown indicate /64 prefixes.
+ {% endif %}
+
+ {% include 'inc/filter_panel.html' %} +
-{% if request.GET.family == '6' %} -
Note: Numbers shown indicate /64 prefixes.
-{% endif %} {% endblock %}