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

This commit is contained in:
Jeremy Stretch 2017-05-09 10:25:30 -04:00
parent 838105fb65
commit 5c7db04465
4 changed files with 40 additions and 17 deletions

View File

@ -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(
queryset=Site.objects.all(), to_field_name='name', error_messages={
'invalid_choice': 'Invalid site name.', '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):

View File

@ -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,

View File

@ -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

View File

@ -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 %}