1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Closes #421: Added asset_tag field to devices

This commit is contained in:
Jeremy Stretch
2016-08-11 11:58:21 -04:00
parent e2ad1d4be0
commit c86a1123f0
11 changed files with 86 additions and 22 deletions

View File

@ -183,7 +183,8 @@ class DeviceAdmin(admin.ModelAdmin):
DeviceBayAdmin, DeviceBayAdmin,
ModuleAdmin, ModuleAdmin,
] ]
list_display = ['display_name', 'device_type', 'device_role', 'primary_ip', 'rack', 'position', 'serial'] list_display = ['display_name', 'device_type', 'device_role', 'primary_ip', 'rack', 'position', 'asset_tag',
'serial']
list_filter = ['device_role'] list_filter = ['device_role']
def get_queryset(self, request): def get_queryset(self, request):

View File

@ -250,8 +250,9 @@ class DeviceSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Device model = Device
fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'rack', fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial',
'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments'] 'asset_tag', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4',
'primary_ip6', 'comments']
def get_parent_device(self, obj): def get_parent_device(self, obj):
try: try:

View File

@ -239,15 +239,16 @@ class DeviceFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Device model = Device
fields = ['q', 'name', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', 'manufacturer_id', fields = ['q', 'name', 'serial', 'asset_tag', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id',
'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', 'is_pdu', 'manufacturer_id', 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server',
'is_network_device'] 'is_pdu', 'is_network_device']
def search(self, queryset, value): def search(self, queryset, value):
return queryset.filter( return queryset.filter(
Q(name__icontains=value) | Q(name__icontains=value) |
Q(serial__icontains=value) | Q(serial__icontains=value.strip()) |
Q(modules__serial__icontains=value) | Q(modules__serial__icontains=value.strip()) |
Q(asset_tag=value.strip()) |
Q(comments__icontains=value) Q(comments__icontains=value)
).distinct() ).distinct()

View File

@ -425,8 +425,8 @@ class DeviceForm(forms.ModelForm, BootstrapMixin):
class Meta: class Meta:
model = Device model = Device
fields = ['name', 'device_role', 'tenant', 'device_type', 'serial', 'site', 'rack', 'position', 'face', 'status', fields = ['name', 'device_role', 'tenant', 'device_type', 'serial', 'asset_tag', 'site', 'rack', 'position',
'platform', 'primary_ip4', 'primary_ip6', 'comments'] 'face', 'status', 'platform', 'primary_ip4', 'primary_ip6', 'comments']
help_texts = { help_texts = {
'device_role': "The function this device serves", 'device_role': "The function this device serves",
'serial': "Chassis serial number", 'serial': "Chassis serial number",
@ -546,8 +546,8 @@ class DeviceFromCSVForm(BaseDeviceFromCSVForm):
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', 'site', fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
'rack_name', 'position', 'face'] 'site', 'rack_name', 'position', 'face']
def clean(self): def clean(self):
@ -582,8 +582,8 @@ class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm):
device_bay_name = forms.CharField(required=False) device_bay_name = forms.CharField(required=False)
class Meta(BaseDeviceFromCSVForm.Meta): class Meta(BaseDeviceFromCSVForm.Meta):
fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'parent', fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag',
'device_bay_name'] 'parent', 'device_bay_name']
def clean(self): def clean(self):

View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10 on 2016-08-11 15:42
from __future__ import unicode_literals
from django.db import migrations
import utilities.fields
class Migration(migrations.Migration):
dependencies = [
('dcim', '0017_rack_add_role'),
]
operations = [
migrations.AddField(
model_name='device',
name='asset_tag',
field=utilities.fields.NullableCharField(blank=True, help_text=b'A unique tag used to identify this device', max_length=50, null=True, unique=True, verbose_name=b'Asset tag'),
),
]

View File

@ -737,6 +737,8 @@ class Device(CreatedUpdatedModel):
platform = models.ForeignKey('Platform', related_name='devices', blank=True, null=True, on_delete=models.SET_NULL) platform = models.ForeignKey('Platform', related_name='devices', blank=True, null=True, on_delete=models.SET_NULL)
name = NullableCharField(max_length=50, blank=True, null=True, unique=True) name = NullableCharField(max_length=50, blank=True, null=True, unique=True)
serial = models.CharField(max_length=50, blank=True, verbose_name='Serial number') serial = models.CharField(max_length=50, blank=True, verbose_name='Serial number')
asset_tag = NullableCharField(max_length=50, blank=True, null=True, unique=True, verbose_name='Asset tag',
help_text='A unique tag used to identify this device')
rack = models.ForeignKey('Rack', related_name='devices', on_delete=models.PROTECT) rack = models.ForeignKey('Rack', related_name='devices', on_delete=models.PROTECT)
position = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1)], position = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1)],
verbose_name='Position (U)', verbose_name='Position (U)',
@ -832,6 +834,7 @@ class Device(CreatedUpdatedModel):
self.device_type.model, self.device_type.model,
self.platform.name if self.platform else '', self.platform.name if self.platform else '',
self.serial, self.serial,
self.asset_tag if self.asset_tag else '',
self.rack.site.name, self.rack.site.name,
self.rack.name, self.rack.name,
str(self.position) if self.position else '', str(self.position) if self.position else '',

View File

@ -60,7 +60,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Serial</td> <td>Serial Number</td>
<td> <td>
{% if device.serial %} {% if device.serial %}
<span>{{ device.serial }}</span> <span>{{ device.serial }}</span>
@ -69,6 +69,16 @@
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr>
<td>Asset Tag</td>
<td>
{% if device.asset_tag %}
<span>{{ device.asset_tag }}</span>
{% else %}
<span class="text-muted">N/A</span>
{% endif %}
</td>
</tr>
<tr> <tr>
<td>Created</td> <td>Created</td>
<td>{{ device.created }}</td> <td>{{ device.created }}</td>

View File

@ -16,6 +16,7 @@
{% render_field form.manufacturer %} {% render_field form.manufacturer %}
{% render_field form.device_type %} {% render_field form.device_type %}
{% render_field form.serial %} {% render_field form.serial %}
{% render_field form.asset_tag %}
</div> </div>
</div> </div>
<div class="panel panel-default"> <div class="panel panel-default">

View File

@ -57,10 +57,15 @@
<td>Juniper Junos</td> <td>Juniper Junos</td>
</tr> </tr>
<tr> <tr>
<td>Serial</td> <td>Serial number</td>
<td>Serial number (optional)</td> <td>Physical serial number (optional)</td>
<td>CAB00577291</td> <td>CAB00577291</td>
</tr> </tr>
<tr>
<td>Asset tag</td>
<td>Unique alphanumeric tag (optional)</td>
<td>ABC123456</td>
</tr>
<tr> <tr>
<td>Site</td> <td>Site</td>
<td>Site name</td> <td>Site name</td>
@ -84,7 +89,7 @@
</tbody> </tbody>
</table> </table>
<h4>Example</h4> <h4>Example</h4>
<pre>rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,Ashburn-VA,R101,21,Rear</pre> <pre>rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,ABC123456,Ashburn-VA,R101,21,Rear</pre>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -57,10 +57,15 @@
<td>Linux</td> <td>Linux</td>
</tr> </tr>
<tr> <tr>
<td>Serial</td> <td>Serial number</td>
<td>Serial number (optional)</td> <td>Physical serial number (optional)</td>
<td>CAB00577291</td> <td>CAB00577291</td>
</tr> </tr>
<tr>
<td>Asset tag</td>
<td>Unique alphanumeric tag (optional)</td>
<td>ABC123456</td>
</tr>
<tr> <tr>
<td>Parent device</td> <td>Parent device</td>
<td>Parent device</td> <td>Parent device</td>
@ -74,7 +79,7 @@
</tbody> </tbody>
</table> </table>
<h4>Example</h4> <h4>Example</h4>
<pre>Blade12,Blade Server,Pied Piper,Dell,BS2000T,Linux,CAB00577291,Server101,Slot4</pre> <pre>Blade12,Blade Server,Pied Piper,Dell,BS2000T,Linux,CAB00577291,ABC123456,Server101,Slot4</pre>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -17,7 +17,23 @@
</tr> </tr>
<tr> <tr>
<td>Serial Number</td> <td>Serial Number</td>
<td>{{ device.serial }}</td> <td>
{% if device.serial %}
<span>{{ device.serial }}</span>
{% else %}
<span class="text-muted">N/A</span>
{% endif %}
</td>
</tr>
<tr>
<td>Asset Tag</td>
<td>
{% if device.asset_tag %}
<span>{{ device.asset_tag }}</span>
{% else %}
<span class="text-muted">N/A</span>
{% endif %}
</td>
</tr> </tr>
</table> </table>
</div> </div>