Browse Source

Added bulk import views for RIRs, roles, and VLAN groups

Jeremy Stretch 7 years ago
parent
commit
977cad3830
5 changed files with 69 additions and 4 deletions
  1. 0 1
      netbox/dcim/forms.py
  2. 42 0
      netbox/ipam/forms.py
  3. 3 0
      netbox/ipam/urls.py
  4. 21 0
      netbox/ipam/views.py
  5. 3 3
      netbox/templates/inc/nav_menu.html

+ 0 - 1
netbox/dcim/forms.py

@@ -666,7 +666,6 @@ class PlatformCSVForm(forms.ModelForm):
         fields = ['name', 'slug', 'napalm_driver']
         help_texts = {
             'name': 'Platform name',
-            # 'color': 'RGB color in hexadecimal (e.g. 00ff00)'
         }
 
 

+ 42 - 0
netbox/ipam/forms.py

@@ -97,6 +97,17 @@ class RIRForm(BootstrapMixin, forms.ModelForm):
         fields = ['name', 'slug', 'is_private']
 
 
+class RIRCSVForm(forms.ModelForm):
+    slug = SlugField()
+
+    class Meta:
+        model = RIR
+        fields = ['name', 'slug', 'is_private']
+        help_texts = {
+            'name': 'RIR name',
+        }
+
+
 class RIRFilterForm(BootstrapMixin, forms.Form):
     is_private = forms.NullBooleanField(required=False, label='Private', widget=forms.Select(choices=[
         ('', '---------'),
@@ -169,6 +180,17 @@ class RoleForm(BootstrapMixin, forms.ModelForm):
         fields = ['name', 'slug']
 
 
+class RoleCSVForm(forms.ModelForm):
+    slug = SlugField()
+
+    class Meta:
+        model = Role
+        fields = ['name', 'slug']
+        help_texts = {
+            'name': 'Role name',
+        }
+
+
 #
 # Prefixes
 #
@@ -718,6 +740,26 @@ class VLANGroupForm(BootstrapMixin, forms.ModelForm):
         fields = ['site', 'name', 'slug']
 
 
+class VLANGroupCSVForm(forms.ModelForm):
+    site = forms.ModelChoiceField(
+        queryset=Site.objects.all(),
+        required=False,
+        to_field_name='name',
+        help_text='Name of parent site',
+        error_messages={
+            'invalid_choice': 'Site not found.',
+        }
+    )
+    slug = SlugField()
+
+    class Meta:
+        model = VLANGroup
+        fields = ['site', 'name', 'slug']
+        help_texts = {
+            'name': 'Name of VLAN group',
+        }
+
+
 class VLANGroupFilterForm(BootstrapMixin, forms.Form):
     site = FilterChoiceField(
         queryset=Site.objects.annotate(filter_count=Count('vlan_groups')),

+ 3 - 0
netbox/ipam/urls.py

@@ -21,6 +21,7 @@ urlpatterns = [
     # RIRs
     url(r'^rirs/$', views.RIRListView.as_view(), name='rir_list'),
     url(r'^rirs/add/$', views.RIRCreateView.as_view(), name='rir_add'),
+    url(r'^rirs/import/$', views.RIRBulkImportView.as_view(), name='rir_import'),
     url(r'^rirs/delete/$', views.RIRBulkDeleteView.as_view(), name='rir_bulk_delete'),
     url(r'^rirs/(?P<slug>[\w-]+)/edit/$', views.RIREditView.as_view(), name='rir_edit'),
 
@@ -37,6 +38,7 @@ urlpatterns = [
     # Roles
     url(r'^roles/$', views.RoleListView.as_view(), name='role_list'),
     url(r'^roles/add/$', views.RoleCreateView.as_view(), name='role_add'),
+    url(r'^roles/import/$', views.RoleBulkImportView.as_view(), name='role_import'),
     url(r'^roles/delete/$', views.RoleBulkDeleteView.as_view(), name='role_bulk_delete'),
     url(r'^roles/(?P<slug>[\w-]+)/edit/$', views.RoleEditView.as_view(), name='role_edit'),
 
@@ -65,6 +67,7 @@ urlpatterns = [
     # VLAN groups
     url(r'^vlan-groups/$', views.VLANGroupListView.as_view(), name='vlangroup_list'),
     url(r'^vlan-groups/add/$', views.VLANGroupCreateView.as_view(), name='vlangroup_add'),
+    url(r'^vlan-groups/import/$', views.VLANGroupBulkImportView.as_view(), name='vlangroup_import'),
     url(r'^vlan-groups/delete/$', views.VLANGroupBulkDeleteView.as_view(), name='vlangroup_bulk_delete'),
     url(r'^vlan-groups/(?P<pk>\d+)/edit/$', views.VLANGroupEditView.as_view(), name='vlangroup_edit'),
 

+ 21 - 0
netbox/ipam/views.py

@@ -261,6 +261,13 @@ class RIREditView(RIRCreateView):
     permission_required = 'ipam.change_rir'
 
 
+class RIRBulkImportView(PermissionRequiredMixin, BulkImportView):
+    permission_required = 'ipam.add_rir'
+    model_form = forms.RIRCSVForm
+    table = tables.RIRTable
+    default_return_url = 'ipam:rir_list'
+
+
 class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
     permission_required = 'ipam.delete_rir'
     cls = RIR
@@ -407,6 +414,13 @@ class RoleEditView(RoleCreateView):
     permission_required = 'ipam.change_role'
 
 
+class RoleBulkImportView(PermissionRequiredMixin, BulkImportView):
+    permission_required = 'ipam.add_role'
+    model_form = forms.RoleCSVForm
+    table = tables.RoleTable
+    default_return_url = 'ipam:role_list'
+
+
 class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
     permission_required = 'ipam.delete_role'
     cls = Role
@@ -745,6 +759,13 @@ class VLANGroupEditView(VLANGroupCreateView):
     permission_required = 'ipam.change_vlangroup'
 
 
+class VLANGroupBulkImportView(PermissionRequiredMixin, BulkImportView):
+    permission_required = 'ipam.add_vlangroup'
+    model_form = forms.VLANGroupCSVForm
+    table = tables.VLANGroupTable
+    default_return_url = 'ipam:vlangroup_list'
+
+
 class VLANGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
     permission_required = 'ipam.delete_vlangroup'
     cls = VLANGroup

+ 3 - 3
netbox/templates/inc/nav_menu.html

@@ -211,7 +211,7 @@
                             {% if perms.ipam.add_role %}
                                 <div class="buttons pull-right">
                                     <a href="{% url 'ipam:role_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
-                                    <a class="btn btn-xs btn-info disabled" title="Import"><i class="fa fa-download"></i></a>
+                                    <a href="{% url 'ipam:role_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
                                 </div>
                             {% endif %}
                             <a href="{% url 'ipam:role_list' %}">Prefix/VLAN Roles</a>
@@ -231,7 +231,7 @@
                             {% if perms.ipam.add_rir %}
                                 <div class="buttons pull-right">
                                     <a href="{% url 'ipam:rir_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
-                                    <a class="btn btn-xs btn-info disabled" title="Import"><i class="fa fa-download"></i></a>
+                                    <a href="{% url 'ipam:rir_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
                                 </div>
                             {% endif %}
                             <a href="{% url 'ipam:rir_list' %}">RIRs</a>
@@ -262,7 +262,7 @@
                             {% if perms.ipam.add_vlangroup %}
                                 <div class="buttons pull-right">
                                     <a href="{% url 'ipam:vlangroup_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
-                                    <a class="btn btn-xs btn-info disabled" title="Import"><i class="fa fa-download"></i></a>
+                                    <a href="{% url 'ipam:vlangroup_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
                                 </div>
                             {% endif %}
                             <a href="{% url 'ipam:vlangroup_list' %}">VLAN Groups</a>