diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 9afb37092..d31488f46 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -5,7 +5,8 @@ from dcim.models import Site, Rack, Device, Interface from extras.forms import CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm from tenancy.models import Tenant from utilities.forms import ( - APISelect, BootstrapMixin, CSVDataField, BulkImportForm, FilterChoiceField, Livesearch, SlugField, add_blank_choice, + APISelect, BootstrapMixin, BulkImportForm, CSVDataField, ExpandableIPAddressField, FilterChoiceField, Livesearch, + SlugField, add_blank_choice, ) from .models import ( @@ -339,6 +340,14 @@ class IPAddressForm(BootstrapMixin, CustomFieldForm): self.fields['nat_inside'].choices = [] +class IPAddressBulkAddForm(forms.Form, BootstrapMixin): + address = ExpandableIPAddressField() + vrf = forms.ModelChoiceField(queryset=VRF.objects.all(), required=False, label='VRF') + tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False) + status = forms.ChoiceField(choices=IPADDRESS_STATUS_CHOICES) + description = forms.CharField(max_length=100, required=False) + + class IPAddressAssignForm(BootstrapMixin, forms.Form): site = forms.ModelChoiceField(queryset=Site.objects.all(), label='Site', required=False, widget=forms.Select(attrs={'filter-for': 'rack'})) diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index 51bd8f849..5ef052b37 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -51,6 +51,7 @@ urlpatterns = [ # IP addresses url(r'^ip-addresses/$', views.IPAddressListView.as_view(), name='ipaddress_list'), url(r'^ip-addresses/add/$', views.IPAddressEditView.as_view(), name='ipaddress_add'), + url(r'^ip-addresses/bulk-add/$', views.IPAddressBulkAddView.as_view(), name='ipaddress_bulk_add'), url(r'^ip-addresses/import/$', views.IPAddressBulkImportView.as_view(), name='ipaddress_import'), url(r'^ip-addresses/edit/$', views.IPAddressBulkEditView.as_view(), name='ipaddress_bulk_edit'), url(r'^ip-addresses/delete/$', views.IPAddressBulkDeleteView.as_view(), name='ipaddress_bulk_delete'), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f7a851572..3087efda4 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -12,7 +12,7 @@ from dcim.models import Device from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator from utilities.views import ( - BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView, + BulkAddView, BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView, ) from . import filters, forms, tables @@ -613,6 +613,14 @@ class IPAddressDeleteView(PermissionRequiredMixin, ObjectDeleteView): redirect_url = 'ipam:ipaddress_list' +class IPAddressBulkAddView(PermissionRequiredMixin, BulkAddView): + permission_required = 'ipam.add_ipaddress' + form = forms.IPAddressBulkAddForm + model = IPAddress + template_name = 'ipam/ipaddress_bulk_add.html' + redirect_url = 'ipam:ipaddress_list' + + class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView): permission_required = 'ipam.add_ipaddress' form = forms.IPAddressImportForm diff --git a/netbox/templates/ipam/inc/ipadress_edit_header.html b/netbox/templates/ipam/inc/ipadress_edit_header.html new file mode 100644 index 000000000..7d590291a --- /dev/null +++ b/netbox/templates/ipam/inc/ipadress_edit_header.html @@ -0,0 +1,4 @@ +
diff --git a/netbox/templates/ipam/ipaddress_bulk_add.html b/netbox/templates/ipam/ipaddress_bulk_add.html new file mode 100644 index 000000000..1599ee900 --- /dev/null +++ b/netbox/templates/ipam/ipaddress_bulk_add.html @@ -0,0 +1,22 @@ +{% extends 'utilities/obj_edit.html' %} +{% load static from staticfiles %} +{% load form_helpers %} + +{% block title %}Bulk Add IP Addresses{% endblock %} + +{% block tabs %} + {% include 'ipam/inc/ipadress_edit_header.html' with active_tab='bulk_add' %} +{% endblock %} + +{% block form %} +