Parcourir la source

Allow import/export of manufacturers (#1347)

Faidon Liambotis il y a 8 ans
Parent
commit
f30fa925ea

+ 12 - 0
netbox/dcim/forms.py

@@ -423,6 +423,18 @@ class ManufacturerForm(BootstrapMixin, forms.ModelForm):
         fields = ['name', 'slug']
 
 
+class ManufacturerCSVForm(forms.ModelForm):
+    class Meta:
+        model = Manufacturer
+        fields = [
+            'name', 'slug'
+        ]
+        help_texts = {
+            'name': 'Manufacturer name',
+            'slug': 'URL-friendly slug',
+        }
+
+
 #
 # Device types
 #

+ 10 - 0
netbox/dcim/models.py

@@ -455,6 +455,10 @@ class Manufacturer(models.Model):
     name = models.CharField(max_length=50, unique=True)
     slug = models.SlugField(unique=True)
 
+    csv_headers = [
+        'name', 'slug',
+    ]
+
     class Meta:
         ordering = ['name']
 
@@ -464,6 +468,12 @@ class Manufacturer(models.Model):
     def get_absolute_url(self):
         return "{}?manufacturer={}".format(reverse('dcim:devicetype_list'), self.slug)
 
+    def to_csv(self):
+        return csv_format([
+            self.name,
+            self.slug,
+        ])
+
 
 @python_2_unicode_compatible
 class DeviceType(models.Model, CustomFieldModel):

+ 1 - 0
netbox/dcim/urls.py

@@ -64,6 +64,7 @@ urlpatterns = [
     # Manufacturers
     url(r'^manufacturers/$', views.ManufacturerListView.as_view(), name='manufacturer_list'),
     url(r'^manufacturers/add/$', views.ManufacturerCreateView.as_view(), name='manufacturer_add'),
+    url(r'^manufacturers/import/$', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'),
     url(r'^manufacturers/delete/$', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'),
     url(r'^manufacturers/(?P<slug>[\w-]+)/edit/$', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
 

+ 7 - 0
netbox/dcim/views.py

@@ -561,6 +561,13 @@ class ManufacturerEditView(ManufacturerCreateView):
     permission_required = 'dcim.change_manufacturer'
 
 
+class ManufacturerBulkImportView(PermissionRequiredMixin, BulkImportView):
+    permission_required = 'dcim.add_manufacturer'
+    model_form = forms.ManufacturerCSVForm
+    table = tables.ManufacturerTable
+    default_return_url = 'dcim:manufacturer_list'
+
+
 class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
     permission_required = 'dcim.delete_manufacturer'
     cls = Manufacturer

+ 1 - 1
netbox/extras/constants.py

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

+ 1 - 0
netbox/templates/_base.html

@@ -105,6 +105,7 @@
                             <li><a href="{% url 'dcim:manufacturer_list' %}"><i class="fa fa-search" aria-hidden="true"></i> Manufacturers</a></li>
                             {% if perms.dcim.add_manufacturer %}
                                 <li><a href="{% url 'dcim:manufacturer_add' %}"><i class="fa fa-plus" aria-hidden="true"></i> Add a Manufacturer</a></li>
+                                <li><a href="{% url 'dcim:manufacturer_import' %}"><i class="fa fa-download" aria-hidden="true"></i> Import Manufacturers</a></li>
                             {% endif %}
                             {% if perms.dcim.add_manufacturer or perms.dcim.add_platform %}
                                 <li class="divider"></li>

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

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