Browse Source

Closes #853: Add 'status' field to device bulk import form

Jeremy Stretch 8 years ago
parent
commit
5c7db04465
4 changed files with 40 additions and 17 deletions
  1. 31 15
      netbox/dcim/forms.py
  2. 1 0
      netbox/dcim/models.py
  3. 2 1
      netbox/dcim/tables.py
  4. 6 1
      netbox/templates/dcim/device_import.html

+ 31 - 15
netbox/dcim/forms.py

@@ -654,15 +654,24 @@ class DeviceForm(BootstrapMixin, CustomFieldForm):
 
 
 class BaseDeviceFromCSVForm(forms.ModelForm):
-    device_role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), to_field_name='name',
-                                         error_messages={'invalid_choice': 'Invalid device role.'})
-    tenant = forms.ModelChoiceField(Tenant.objects.all(), to_field_name='name', required=False,
-                                    error_messages={'invalid_choice': 'Tenant not found.'})
-    manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all(), to_field_name='name',
-                                          error_messages={'invalid_choice': 'Invalid manufacturer.'})
+    device_role = forms.ModelChoiceField(
+        queryset=DeviceRole.objects.all(), to_field_name='name',
+        error_messages={'invalid_choice': 'Invalid device role.'}
+    )
+    tenant = forms.ModelChoiceField(
+        Tenant.objects.all(), to_field_name='name', required=False,
+        error_messages={'invalid_choice': 'Tenant not found.'}
+    )
+    manufacturer = forms.ModelChoiceField(
+        queryset=Manufacturer.objects.all(), to_field_name='name',
+        error_messages={'invalid_choice': 'Invalid manufacturer.'}
+    )
     model_name = forms.CharField()
-    platform = forms.ModelChoiceField(queryset=Platform.objects.all(), required=False, to_field_name='name',
-                                      error_messages={'invalid_choice': 'Invalid platform.'})
+    platform = forms.ModelChoiceField(
+        queryset=Platform.objects.all(), required=False, to_field_name='name'
+        , error_messages={'invalid_choice': 'Invalid platform.'}
+    )
+    status_name = forms.ChoiceField(choices=[(s[1], s[0]) for s in STATUS_CHOICES])
 
     class Meta:
         fields = []
@@ -680,17 +689,24 @@ class BaseDeviceFromCSVForm(forms.ModelForm):
             except DeviceType.DoesNotExist:
                 self.add_error('model_name', "Invalid device type ({} {})".format(manufacturer, model_name))
 
+    def clean_status_name(self):
+        return dict(self.fields['status_name'].choices)[self.cleaned_data['status_name']]
+
 
 class DeviceFromCSVForm(BaseDeviceFromCSVForm):
-    site = forms.ModelChoiceField(queryset=Site.objects.all(), to_field_name='name', error_messages={
-        'invalid_choice': 'Invalid site name.',
-    })
+    site = forms.ModelChoiceField(
+        queryset=Site.objects.all(), to_field_name='name', error_messages={
+            'invalid_choice': 'Invalid site name.',
+        }
+    )
     rack_name = forms.CharField(required=False)
     face = forms.CharField(required=False)
 
     class Meta(BaseDeviceFromCSVForm.Meta):
-        fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
-                  'site', 'rack_name', 'position', 'face']
+        fields = [
+            'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
+            'status_name', 'site', 'rack_name', 'position', 'face',
+        ]
 
     def clean(self):
 
@@ -732,8 +748,8 @@ class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm):
 
     class Meta(BaseDeviceFromCSVForm.Meta):
         fields = [
-            'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', 'parent',
-            'device_bay_name',
+            'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
+            'status_name', 'parent', 'device_bay_name',
         ]
 
     def clean(self):

+ 1 - 0
netbox/dcim/models.py

@@ -1089,6 +1089,7 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
             self.platform.name if self.platform else None,
             self.serial,
             self.asset_tag,
+            self.get_status_display(),
             self.site.name,
             self.rack.name if self.rack else None,
             self.position,

+ 2 - 1
netbox/dcim/tables.py

@@ -465,6 +465,7 @@ class DeviceSearchTable(SearchTable):
 
 class DeviceImportTable(BaseTable):
     name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
+    status = tables.TemplateColumn(template_code=DEVICE_STATUS, verbose_name='Status')
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
@@ -474,7 +475,7 @@ class DeviceImportTable(BaseTable):
 
     class Meta(BaseTable.Meta):
         model = Device
-        fields = ('name', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type')
+        fields = ('name', 'status', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type')
         empty_text = False
 
 

+ 6 - 1
netbox/templates/dcim/device_import.html

@@ -70,6 +70,11 @@
 					<td>Unique alphanumeric tag (optional)</td>
 					<td>ABC123456</td>
 				</tr>
+                <tr>
+                    <td>Status</td>
+                    <td>Current status</td>
+                    <td>Active</td>
+                </tr>
 				<tr>
 					<td>Site</td>
 					<td>Site name</td>
@@ -93,7 +98,7 @@
 			</tbody>
 		</table>
 		<h4>Example</h4>
-		<pre>rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,ABC123456,Ashburn-VA,R101,21,Rear</pre>
+		<pre>rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,ABC123456,Active,Ashburn-VA,R101,21,Rear</pre>
 	</div>
 </div>
 {% endblock %}