diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index e2b1d5ac9..557b97019 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1,4 +1,5 @@ import re +from operator import attrgetter from django.contrib import messages from django.contrib.auth.decorators import permission_required @@ -12,6 +13,8 @@ from django.shortcuts import get_object_or_404, redirect, render from django.utils.http import urlencode from django.views.generic import View +from natsort import natsorted + from ipam.models import Prefix, IPAddress, VLAN from circuits.models import Circuit from extras.models import TopologyMap @@ -521,7 +524,10 @@ def device(request, pk): .select_related('connected_as_a', 'connected_as_b', 'circuit') mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True)\ .select_related('connected_as_a', 'connected_as_b', 'circuit') - device_bays = DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer') + device_bays = natsorted( + DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer'), + key=attrgetter("name") + ) # Gather any secrets which belong to this device secrets = device.secrets.all() diff --git a/requirements.txt b/requirements.txt index c1afc1b21..7b87785df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ py-gfm==0.1.3 pycrypto==2.6.1 sqlparse==0.1.19 xmltodict==0.10.2 +natsort>=5.0.0