mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-16 12:12:53 -06:00
Closes #853: Add 'status' field to device bulk import form
This commit is contained in:
parent
838105fb65
commit
5c7db04465
@ -654,15 +654,24 @@ class DeviceForm(BootstrapMixin, CustomFieldForm):
|
|||||||
|
|
||||||
|
|
||||||
class BaseDeviceFromCSVForm(forms.ModelForm):
|
class BaseDeviceFromCSVForm(forms.ModelForm):
|
||||||
device_role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), to_field_name='name',
|
device_role = forms.ModelChoiceField(
|
||||||
error_messages={'invalid_choice': 'Invalid device role.'})
|
queryset=DeviceRole.objects.all(), to_field_name='name',
|
||||||
tenant = forms.ModelChoiceField(Tenant.objects.all(), to_field_name='name', required=False,
|
error_messages={'invalid_choice': 'Invalid device role.'}
|
||||||
error_messages={'invalid_choice': 'Tenant not found.'})
|
)
|
||||||
manufacturer = forms.ModelChoiceField(queryset=Manufacturer.objects.all(), to_field_name='name',
|
tenant = forms.ModelChoiceField(
|
||||||
error_messages={'invalid_choice': 'Invalid manufacturer.'})
|
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()
|
model_name = forms.CharField()
|
||||||
platform = forms.ModelChoiceField(queryset=Platform.objects.all(), required=False, to_field_name='name',
|
platform = forms.ModelChoiceField(
|
||||||
error_messages={'invalid_choice': 'Invalid platform.'})
|
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:
|
class Meta:
|
||||||
fields = []
|
fields = []
|
||||||
@ -680,17 +689,24 @@ class BaseDeviceFromCSVForm(forms.ModelForm):
|
|||||||
except DeviceType.DoesNotExist:
|
except DeviceType.DoesNotExist:
|
||||||
self.add_error('model_name', "Invalid device type ({} {})".format(manufacturer, model_name))
|
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):
|
class DeviceFromCSVForm(BaseDeviceFromCSVForm):
|
||||||
site = forms.ModelChoiceField(queryset=Site.objects.all(), to_field_name='name', error_messages={
|
site = forms.ModelChoiceField(
|
||||||
'invalid_choice': 'Invalid site name.',
|
queryset=Site.objects.all(), to_field_name='name', error_messages={
|
||||||
})
|
'invalid_choice': 'Invalid site name.',
|
||||||
|
}
|
||||||
|
)
|
||||||
rack_name = forms.CharField(required=False)
|
rack_name = forms.CharField(required=False)
|
||||||
face = forms.CharField(required=False)
|
face = forms.CharField(required=False)
|
||||||
|
|
||||||
class Meta(BaseDeviceFromCSVForm.Meta):
|
class Meta(BaseDeviceFromCSVForm.Meta):
|
||||||
fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
|
fields = [
|
||||||
'site', 'rack_name', 'position', 'face']
|
'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
|
||||||
|
'status_name', 'site', 'rack_name', 'position', 'face',
|
||||||
|
]
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
@ -732,8 +748,8 @@ class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm):
|
|||||||
|
|
||||||
class Meta(BaseDeviceFromCSVForm.Meta):
|
class Meta(BaseDeviceFromCSVForm.Meta):
|
||||||
fields = [
|
fields = [
|
||||||
'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', 'parent',
|
'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
|
||||||
'device_bay_name',
|
'status_name', 'parent', 'device_bay_name',
|
||||||
]
|
]
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
@ -1089,6 +1089,7 @@ class Device(CreatedUpdatedModel, CustomFieldModel):
|
|||||||
self.platform.name if self.platform else None,
|
self.platform.name if self.platform else None,
|
||||||
self.serial,
|
self.serial,
|
||||||
self.asset_tag,
|
self.asset_tag,
|
||||||
|
self.get_status_display(),
|
||||||
self.site.name,
|
self.site.name,
|
||||||
self.rack.name if self.rack else None,
|
self.rack.name if self.rack else None,
|
||||||
self.position,
|
self.position,
|
||||||
|
@ -465,6 +465,7 @@ class DeviceSearchTable(SearchTable):
|
|||||||
|
|
||||||
class DeviceImportTable(BaseTable):
|
class DeviceImportTable(BaseTable):
|
||||||
name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
|
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')
|
tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
|
||||||
site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
|
site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
|
||||||
rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
|
rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
|
||||||
@ -474,7 +475,7 @@ class DeviceImportTable(BaseTable):
|
|||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = Device
|
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
|
empty_text = False
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,6 +70,11 @@
|
|||||||
<td>Unique alphanumeric tag (optional)</td>
|
<td>Unique alphanumeric tag (optional)</td>
|
||||||
<td>ABC123456</td>
|
<td>ABC123456</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Status</td>
|
||||||
|
<td>Current status</td>
|
||||||
|
<td>Active</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Site</td>
|
<td>Site</td>
|
||||||
<td>Site name</td>
|
<td>Site name</td>
|
||||||
@ -93,7 +98,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<h4>Example</h4>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user