From 85f5ba9a25cbeac6b34542838c0792f15fe83477 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2017 13:22:48 -0500 Subject: [PATCH] Fixes #1756: Improved natural ordering of console server ports and power outlets --- netbox/dcim/models.py | 18 +++++++----------- netbox/dcim/views.py | 8 ++------ 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 0a1a03fb7..d50b35487 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1094,16 +1094,11 @@ class ConsolePort(models.Model): class ConsoleServerPortManager(models.Manager): def get_queryset(self): - """ - Include the trailing numeric portion of each port name to allow for proper ordering. - For example: - Port 1, Port 2, Port 3 ... Port 9, Port 10, Port 11 ... - Instead of: - Port 1, Port 10, Port 11 ... Port 19, Port 2, Port 20 ... - """ + # Pad any trailing digits to effect natural sorting return super(ConsoleServerPortManager, self).get_queryset().extra(select={ - 'name_as_integer': "CAST(substring(dcim_consoleserverport.name FROM '[0-9]+$') AS INTEGER)", - }).order_by('device', 'name_as_integer') + 'name_padded': "CONCAT(REGEXP_REPLACE(dcim_consoleserverport.name, '\d+$', ''), " + "LPAD(SUBSTRING(dcim_consoleserverport.name FROM '\d+$'), 8, '0'))", + }).order_by('device', 'name_padded') @python_2_unicode_compatible @@ -1176,9 +1171,10 @@ class PowerPort(models.Model): class PowerOutletManager(models.Manager): def get_queryset(self): + # Pad any trailing digits to effect natural sorting return super(PowerOutletManager, self).get_queryset().extra(select={ - 'name_padded': "CONCAT(SUBSTRING(dcim_poweroutlet.name FROM '^[^0-9]+'), " - "LPAD(SUBSTRING(dcim_poweroutlet.name FROM '[0-9\/]+$'), 8, '0'))", + 'name_padded': "CONCAT(REGEXP_REPLACE(dcim_poweroutlet.name, '\d+$', ''), " + "LPAD(SUBSTRING(dcim_poweroutlet.name FROM '\d+$'), 8, '0'))", }).order_by('device', 'name_padded') diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 46925d3eb..9b681e4a7 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -810,15 +810,11 @@ class DeviceView(View): console_ports = natsorted( ConsolePort.objects.filter(device=device).select_related('cs_port__device'), key=attrgetter('name') ) - cs_ports = natsorted( - ConsoleServerPort.objects.filter(device=device).select_related('connected_console'), key=attrgetter('name') - ) + cs_ports = ConsoleServerPort.objects.filter(device=device).select_related('connected_console') power_ports = natsorted( PowerPort.objects.filter(device=device).select_related('power_outlet__device'), key=attrgetter('name') ) - power_outlets = natsorted( - PowerOutlet.objects.filter(device=device).select_related('connected_port'), key=attrgetter('name') - ) + power_outlets = PowerOutlet.objects.filter(device=device).select_related('connected_port') interfaces = Interface.objects.order_naturally( device.device_type.interface_ordering ).filter(