mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
More work on #1523 (natural ordering for interfaces)
This commit is contained in:
@ -661,28 +661,32 @@ class InterfaceQuerySet(models.QuerySet):
|
|||||||
"""
|
"""
|
||||||
sql_col = '{}.name'.format(self.model._meta.db_table)
|
sql_col = '{}.name'.format(self.model._meta.db_table)
|
||||||
ordering = {
|
ordering = {
|
||||||
IFACE_ORDERING_POSITION: ('_slot', '_subslot', '_position', '_subposition', '_channel', '_vc', '_type', 'name'),
|
IFACE_ORDERING_POSITION: (
|
||||||
IFACE_ORDERING_NAME: ('_type', '_slot', '_subslot', '_position', '_subposition', '_channel', '_vc', 'name'),
|
'_slot', '_subslot', '_position', '_subposition', '_channel', '_vc', '_type', '_id', 'name',
|
||||||
|
),
|
||||||
|
IFACE_ORDERING_NAME: (
|
||||||
|
'_type', '_slot', '_subslot', '_position', '_subposition', '_channel', '_vc', '_id', 'name',
|
||||||
|
),
|
||||||
}[method]
|
}[method]
|
||||||
|
|
||||||
|
TYPE_RE = r"SUBSTRING({} FROM '^([^0-9]+)')"
|
||||||
|
ID_RE = r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)([0-9]+)$') AS integer)"
|
||||||
|
SLOT_RE = r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)([0-9]+)\/') AS integer)"
|
||||||
|
SUBSLOT_RE = r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+\/)([0-9]+)') AS integer)"
|
||||||
|
POSITION_RE = r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+\/){{2}}([0-9]+)') AS integer)"
|
||||||
|
SUBPOSITION_RE = r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+\/){{3}}([0-9]+)') AS integer)"
|
||||||
|
CHANNEL_RE = r"COALESCE(CAST(SUBSTRING({} FROM ':([0-9]+)(\.[0-9]+)?$') AS integer), 0)"
|
||||||
|
VC_RE = r"COALESCE(CAST(SUBSTRING({} FROM '\.([0-9]+)$') AS integer), 0)"
|
||||||
|
|
||||||
fields = {
|
fields = {
|
||||||
'_type': RawSQL(r"SUBSTRING({} FROM '^([^0-9]+)')".format(sql_col), []),
|
'_type': RawSQL(TYPE_RE.format(sql_col), []),
|
||||||
'_slot': RawSQL(r"CAST(SUBSTRING({} FROM '^(?:[^0-9]+)([0-9]+)') AS integer)".format(sql_col), []),
|
'_id': RawSQL(ID_RE.format(sql_col), []),
|
||||||
'_subslot': RawSQL(
|
'_slot': RawSQL(SLOT_RE.format(sql_col), []),
|
||||||
r"COALESCE(CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+)\/([0-9]+)') AS integer), 0)".format(
|
'_subslot': RawSQL(SUBSLOT_RE.format(sql_col), []),
|
||||||
sql_col), []
|
'_position': RawSQL(POSITION_RE.format(sql_col), []),
|
||||||
),
|
'_subposition': RawSQL(SUBPOSITION_RE.format(sql_col), []),
|
||||||
'_position': RawSQL(
|
'_channel': RawSQL(CHANNEL_RE.format(sql_col), []),
|
||||||
r"COALESCE(CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+\/){{2}}([0-9]+)') AS integer), 0)".format(
|
'_vc': RawSQL(VC_RE.format(sql_col), []),
|
||||||
sql_col), []
|
|
||||||
),
|
|
||||||
'_subposition': RawSQL(
|
|
||||||
r"COALESCE(CAST(SUBSTRING({} FROM '^(?:[^0-9]+)(?:[0-9]+\/){{3}}([0-9]+)') AS integer), 0)".format(
|
|
||||||
sql_col), []
|
|
||||||
),
|
|
||||||
'_channel': RawSQL(
|
|
||||||
r"COALESCE(CAST(SUBSTRING({} FROM ':([0-9]+)(\.[0-9]+)?$') AS integer), 0)".format(sql_col), []),
|
|
||||||
'_vc': RawSQL(r"COALESCE(CAST(SUBSTRING({} FROM '\.([0-9]+)$') AS integer), 0)".format(sql_col), []),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.annotate(**fields).order_by(*ordering)
|
return self.annotate(**fields).order_by(*ordering)
|
||||||
|
@ -159,10 +159,14 @@ class InterfaceTestCase(TestCase):
|
|||||||
device=device1,
|
device=device1,
|
||||||
name='Ethernet1/3/2/1'
|
name='Ethernet1/3/2/1'
|
||||||
)
|
)
|
||||||
|
interface6 = Interface.objects.create(
|
||||||
|
device=device1,
|
||||||
|
name='Loopback1'
|
||||||
|
)
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
list(Interface.objects.all().order_naturally()),
|
list(Interface.objects.all().order_naturally()),
|
||||||
[interface1, interface5, interface4, interface3, interface2]
|
[interface1, interface5, interface4, interface3, interface2, interface6]
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_interface_order_natural_subinterfaces(self):
|
def test_interface_order_natural_subinterfaces(self):
|
||||||
@ -201,5 +205,5 @@ class InterfaceTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
list(Interface.objects.all().order_naturally()),
|
list(Interface.objects.all().order_naturally()),
|
||||||
[interface6, interface4, interface3, interface5, interface2, interface1]
|
[interface4, interface3, interface5, interface2, interface1, interface6]
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user