Fixes #4336: Ensure interfaces without a subinterface ID are ordered before subinterface zero

This commit is contained in:
Jeremy Stretch
2020-04-21 16:13:34 -04:00
parent ada55dfdfb
commit 131d2c97ca
7 changed files with 56 additions and 18 deletions

View File

@@ -75,7 +75,7 @@ def naturalize_interface(value, max_length):
if part is not None:
output += part.rjust(6, '0')
else:
output += '000000'
output += '......'
# Finally, naturalize any remaining text and append it
if match.group('remainder') is not None and len(output) < max_length:

View File

@@ -0,0 +1,9 @@
from django.db.models import F, Func
class CollateAsChar(Func):
"""
Disregard localization by collating a field as a plain character string. Helpful for ensuring predictable ordering.
"""
function = 'C'
template = '(%(expressions)s) COLLATE "%(function)s"'

View File

@@ -30,29 +30,32 @@ class NaturalizationTestCase(TestCase):
# Original, naturalized
data = (
# IOS/JunOS-style
('Gi', '9999999999999999Gi000000000000000000'),
('Gi1', '9999999999999999Gi000001000000000000'),
('Gi1.0', '9999999999999999Gi000001000000000000'),
('Gi1.1', '9999999999999999Gi000001000000000001'),
('Gi1:0', '9999999999999999Gi000001000000000000'),
('Gi', '9999999999999999Gi..................'),
('Gi1', '9999999999999999Gi000001............'),
('Gi1.0', '9999999999999999Gi000001......000000'),
('Gi1.1', '9999999999999999Gi000001......000001'),
('Gi1:0', '9999999999999999Gi000001000000......'),
('Gi1:0.0', '9999999999999999Gi000001000000000000'),
('Gi1:0.1', '9999999999999999Gi000001000000000001'),
('Gi1:1', '9999999999999999Gi000001000001000000'),
('Gi1:1', '9999999999999999Gi000001000001......'),
('Gi1:1.0', '9999999999999999Gi000001000001000000'),
('Gi1:1.1', '9999999999999999Gi000001000001000001'),
('Gi1/2', '0001999999999999Gi000002000000000000'),
('Gi1/2/3', '0001000299999999Gi000003000000000000'),
('Gi1/2/3/4', '0001000200039999Gi000004000000000000'),
('Gi1/2/3/4/5', '0001000200030004Gi000005000000000000'),
('Gi1/2/3/4/5:6', '0001000200030004Gi000005000006000000'),
('Gi1/2', '0001999999999999Gi000002............'),
('Gi1/2/3', '0001000299999999Gi000003............'),
('Gi1/2/3/4', '0001000200039999Gi000004............'),
('Gi1/2/3/4/5', '0001000200030004Gi000005............'),
('Gi1/2/3/4/5:6', '0001000200030004Gi000005000006......'),
('Gi1/2/3/4/5:6.7', '0001000200030004Gi000005000006000007'),
# Generic
('Interface 1', '9999999999999999Interface 000001000000000000'),
('Interface 1 (other)', '9999999999999999Interface 000001000000000000 (other)'),
('Interface 99', '9999999999999999Interface 000099000000000000'),
('PCIe1-p1', '9999999999999999PCIe000001000000000000-p00000001'),
('PCIe1-p99', '9999999999999999PCIe000001000000000000-p00000099'),
('Interface 1', '9999999999999999Interface 000001............'),
('Interface 1 (other)', '9999999999999999Interface 000001............ (other)'),
('Interface 99', '9999999999999999Interface 000099............'),
('PCIe1-p1', '9999999999999999PCIe000001............-p00000001'),
('PCIe1-p99', '9999999999999999PCIe000001............-p00000099'),
)
for origin, naturalized in data: