Sfoglia il codice sorgente

Allow import/export of rack groups (#1347)

Faidon Liambotis 8 anni fa
parent
commit
beb91559e5

+ 21 - 0
netbox/dcim/forms.py

@@ -190,6 +190,27 @@ class RackGroupForm(BootstrapMixin, forms.ModelForm):
         fields = ['site', 'name', 'slug']
 
 
+class RackGroupCSVForm(forms.ModelForm):
+    site = forms.ModelChoiceField(
+        queryset=Site.objects.all(),
+        to_field_name='name',
+        help_text='Name of parent site',
+        error_messages={
+            'invalid_choice': 'Site not found.',
+        }
+    )
+
+    class Meta:
+        model = RackGroup
+        fields = [
+            'site', 'name', 'slug',
+        ]
+        help_texts = {
+            'name': 'Name of rack group',
+            'slug': 'URL-friendly slug',
+        }
+
+
 class RackGroupFilterForm(BootstrapMixin, forms.Form):
     site = FilterChoiceField(queryset=Site.objects.annotate(filter_count=Count('rack_groups')), to_field_name='slug')
 

+ 11 - 0
netbox/dcim/models.py

@@ -159,6 +159,10 @@ class RackGroup(models.Model):
     slug = models.SlugField()
     site = models.ForeignKey('Site', related_name='rack_groups', on_delete=models.CASCADE)
 
+    csv_headers = [
+        'site', 'name', 'slug',
+    ]
+
     class Meta:
         ordering = ['site', 'name']
         unique_together = [
@@ -172,6 +176,13 @@ class RackGroup(models.Model):
     def get_absolute_url(self):
         return "{}?group_id={}".format(reverse('dcim:rack_list'), self.pk)
 
+    def to_csv(self):
+        return csv_format([
+            self.site,
+            self.name,
+            self.slug,
+        ])
+
 
 @python_2_unicode_compatible
 class RackRole(models.Model):

+ 1 - 0
netbox/dcim/urls.py

@@ -32,6 +32,7 @@ urlpatterns = [
     # Rack groups
     url(r'^rack-groups/$', views.RackGroupListView.as_view(), name='rackgroup_list'),
     url(r'^rack-groups/add/$', views.RackGroupCreateView.as_view(), name='rackgroup_add'),
+    url(r'^rack-groups/import/$', views.RackGroupBulkImportView.as_view(), name='rackgroup_import'),
     url(r'^rack-groups/delete/$', views.RackGroupBulkDeleteView.as_view(), name='rackgroup_bulk_delete'),
     url(r'^rack-groups/(?P<pk>\d+)/edit/$', views.RackGroupEditView.as_view(), name='rackgroup_edit'),
 

+ 7 - 0
netbox/dcim/views.py

@@ -314,6 +314,13 @@ class RackGroupEditView(RackGroupCreateView):
     permission_required = 'dcim.change_rackgroup'
 
 
+class RackGroupBulkImportView(PermissionRequiredMixin, BulkImportView):
+    permission_required = 'dcim.add_rackgroup'
+    model_form = forms.RackGroupCSVForm
+    table = tables.RackGroupTable
+    default_return_url = 'dcim:rackgroup_list'
+
+
 class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
     permission_required = 'dcim.delete_rackgroup'
     cls = RackGroup

+ 1 - 1
netbox/extras/constants.py

@@ -37,7 +37,7 @@ GRAPH_TYPE_CHOICES = (
 
 # Models which support export templates
 EXPORTTEMPLATE_MODELS = [
-    'site', 'region', 'rack', 'device',                                             # DCIM
+    'site', 'region', 'rack', 'rackgroup', 'device',                                # DCIM
     'consoleport', 'powerport', 'interfaceconnection',                              # DCIM
     'aggregate', 'prefix', 'ipaddress', 'vlan',                                     # IPAM
     'provider', 'circuit',                                                          # Circuits

+ 1 - 0
netbox/templates/_base.html

@@ -68,6 +68,7 @@
                             <li><a href="{% url 'dcim:rackgroup_list' %}"><i class="fa fa-search" aria-hidden="true"></i> Rack Groups</a></li>
                             {% if perms.dcim.add_rackgroup %}
                                 <li><a href="{% url 'dcim:rackgroup_add' %}"><i class="fa fa-plus" aria-hidden="true"></i> Add a Rack Group</a></li>
+                                <li><a href="{% url 'dcim:rackgroup_import' %}"><i class="fa fa-download" aria-hidden="true"></i> Import Rack Groups</a></li>
                             {% endif %}
                             <li class="divider"></li>
                             <li><a href="{% url 'dcim:rackrole_list' %}"><i class="fa fa-search" aria-hidden="true"></i> Rack Roles</a></li>

+ 5 - 0
netbox/templates/dcim/rackgroup_list.html

@@ -10,7 +10,12 @@
             <span class="fa fa-plus" aria-hidden="true"></span>
             Add a rack group
         </a>
+        <a href="{% url 'dcim:rackgroup_import' %}" class="btn btn-info">
+            <span class="fa fa-download" aria-hidden="true"></span>
+            Import rack groups
+        </a>
     {% endif %}
+    {% include 'inc/export_button.html' with obj_type='rackgroups' %}
 </div>
 <h1>Rack Groups</h1>
 <div class="row">