diff --git a/netbox/dcim/admin.py b/netbox/dcim/admin.py index 001a685c7..9fd16a87d 100644 --- a/netbox/dcim/admin.py +++ b/netbox/dcim/admin.py @@ -183,7 +183,8 @@ class DeviceAdmin(admin.ModelAdmin): DeviceBayAdmin, 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'] def get_queryset(self, request): diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index a0a2776f1..706bf4a52 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -250,8 +250,9 @@ class DeviceSerializer(serializers.ModelSerializer): class Meta: model = Device - fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'rack', - 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments'] + fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', + 'asset_tag', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', + 'primary_ip6', 'comments'] def get_parent_device(self, obj): try: diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index b124d53dd..3033ce564 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -239,15 +239,16 @@ class DeviceFilter(django_filters.FilterSet): class Meta: model = Device - fields = ['q', 'name', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', 'manufacturer_id', - 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', 'is_pdu', - 'is_network_device'] + fields = ['q', 'name', 'serial', 'asset_tag', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', + 'manufacturer_id', 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', + 'is_pdu', 'is_network_device'] def search(self, queryset, value): return queryset.filter( Q(name__icontains=value) | - Q(serial__icontains=value) | - Q(modules__serial__icontains=value) | + Q(serial__icontains=value.strip()) | + Q(modules__serial__icontains=value.strip()) | + Q(asset_tag=value.strip()) | Q(comments__icontains=value) ).distinct() diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 56e786a26..5d579c709 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -425,8 +425,8 @@ class DeviceForm(forms.ModelForm, BootstrapMixin): class Meta: model = Device - fields = ['name', 'device_role', 'tenant', 'device_type', 'serial', 'site', 'rack', 'position', 'face', 'status', - 'platform', 'primary_ip4', 'primary_ip6', 'comments'] + fields = ['name', 'device_role', 'tenant', 'device_type', 'serial', 'asset_tag', 'site', 'rack', 'position', + 'face', 'status', 'platform', 'primary_ip4', 'primary_ip6', 'comments'] help_texts = { 'device_role': "The function this device serves", 'serial': "Chassis serial number", @@ -546,8 +546,8 @@ class DeviceFromCSVForm(BaseDeviceFromCSVForm): face = forms.CharField(required=False) class Meta(BaseDeviceFromCSVForm.Meta): - fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'site', - 'rack_name', 'position', 'face'] + fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', + 'site', 'rack_name', 'position', 'face'] def clean(self): @@ -582,8 +582,8 @@ class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm): device_bay_name = forms.CharField(required=False) class Meta(BaseDeviceFromCSVForm.Meta): - fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'parent', - 'device_bay_name'] + fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', + 'parent', 'device_bay_name'] def clean(self): diff --git a/netbox/dcim/migrations/0018_device_add_asset_tag.py b/netbox/dcim/migrations/0018_device_add_asset_tag.py new file mode 100644 index 000000000..706b42ac4 --- /dev/null +++ b/netbox/dcim/migrations/0018_device_add_asset_tag.py @@ -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'), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 3da9bb443..b1c6b60b7 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -737,6 +737,8 @@ class Device(CreatedUpdatedModel): 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) 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) position = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1)], verbose_name='Position (U)', @@ -832,6 +834,7 @@ class Device(CreatedUpdatedModel): self.device_type.model, self.platform.name if self.platform else '', self.serial, + self.asset_tag if self.asset_tag else '', self.rack.site.name, self.rack.name, str(self.position) if self.position else '', diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index cb2354c28..049555571 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -60,7 +60,7 @@
rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,Ashburn-VA,R101,21,Rear+
rack101_sw1,ToR Switch,Pied Piper,Juniper,EX4300-48T,Juniper Junos,CAB00577291,ABC123456,Ashburn-VA,R101,21,Rear{% endblock %} diff --git a/netbox/templates/dcim/device_import_child.html b/netbox/templates/dcim/device_import_child.html index d01c37653..eed987d46 100644 --- a/netbox/templates/dcim/device_import_child.html +++ b/netbox/templates/dcim/device_import_child.html @@ -57,10 +57,15 @@
Blade12,Blade Server,Pied Piper,Dell,BS2000T,Linux,CAB00577291,Server101,Slot4+
Blade12,Blade Server,Pied Piper,Dell,BS2000T,Linux,CAB00577291,ABC123456,Server101,Slot4{% endblock %} diff --git a/netbox/templates/dcim/device_inventory.html b/netbox/templates/dcim/device_inventory.html index a867d9eb3..b43083e71 100644 --- a/netbox/templates/dcim/device_inventory.html +++ b/netbox/templates/dcim/device_inventory.html @@ -17,7 +17,23 @@