mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #15925: Fix rendering of cable traces to circuit terminations
This commit is contained in:
@ -223,7 +223,7 @@ class CableTraceSVG:
|
|||||||
nodes_height = 0
|
nodes_height = 0
|
||||||
nodes = []
|
nodes = []
|
||||||
# Sort them by name to make renders more readable
|
# Sort them by name to make renders more readable
|
||||||
for i, term in enumerate(sorted(terminations, key=lambda x: x.name)):
|
for i, term in enumerate(sorted(terminations, key=lambda x: str(x))):
|
||||||
node = Node(
|
node = Node(
|
||||||
position=(offset_x + i * width, self.cursor),
|
position=(offset_x + i * width, self.cursor),
|
||||||
width=width,
|
width=width,
|
||||||
@ -266,7 +266,7 @@ class CableTraceSVG:
|
|||||||
Draw the far-end objects and its terminations and return all created nodes
|
Draw the far-end objects and its terminations and return all created nodes
|
||||||
"""
|
"""
|
||||||
# Make sure elements are sorted by name for readability
|
# Make sure elements are sorted by name for readability
|
||||||
objects = sorted(obj_list, key=lambda x: x.name)
|
objects = sorted(obj_list, key=lambda x: str(x))
|
||||||
width = self.width / len(objects)
|
width = self.width / len(objects)
|
||||||
|
|
||||||
# Max-height of created terminations
|
# Max-height of created terminations
|
||||||
@ -361,7 +361,8 @@ class CableTraceSVG:
|
|||||||
# Connector (a Cable or WirelessLink)
|
# Connector (a Cable or WirelessLink)
|
||||||
if links:
|
if links:
|
||||||
|
|
||||||
parent_object_nodes, far_terminations = self.draw_far_objects(set(end.parent_object for end in far_ends), far_ends)
|
obj_list = {end.parent_object for end in far_ends}
|
||||||
|
parent_object_nodes, far_terminations = self.draw_far_objects(obj_list, far_ends)
|
||||||
for cable in links:
|
for cable in links:
|
||||||
# Fill in labels and description with all available data
|
# Fill in labels and description with all available data
|
||||||
description = [
|
description = [
|
||||||
|
@ -394,6 +394,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
path1 = self.assertPathExists(
|
path1 = self.assertPathExists(
|
||||||
@ -450,6 +453,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
path1 = self.assertPathExists(
|
path1 = self.assertPathExists(
|
||||||
@ -558,6 +564,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 3
|
# Delete cable 3
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
|
|
||||||
@ -673,6 +682,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 3
|
# Delete cable 3
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
|
|
||||||
@ -804,6 +816,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 3
|
# Delete cable 3
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
|
|
||||||
@ -931,6 +946,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 5
|
# Delete cable 5
|
||||||
cable5.delete()
|
cable5.delete()
|
||||||
|
|
||||||
@ -1034,6 +1052,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 3
|
# Delete cable 3
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
|
|
||||||
@ -1093,6 +1114,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 3)
|
self.assertEqual(CablePath.objects.count(), 3)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 1
|
# Delete cable 1
|
||||||
cable1.delete()
|
cable1.delete()
|
||||||
|
|
||||||
@ -1135,6 +1159,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 1)
|
self.assertEqual(CablePath.objects.count(), 1)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
def test_210_interface_to_circuittermination(self):
|
def test_210_interface_to_circuittermination(self):
|
||||||
"""
|
"""
|
||||||
[IF1] --C1-- [CT1]
|
[IF1] --C1-- [CT1]
|
||||||
@ -1156,6 +1183,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 1)
|
self.assertEqual(CablePath.objects.count(), 1)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 1
|
# Delete cable 1
|
||||||
cable1.delete()
|
cable1.delete()
|
||||||
self.assertEqual(CablePath.objects.count(), 0)
|
self.assertEqual(CablePath.objects.count(), 0)
|
||||||
@ -1212,6 +1242,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
path1 = self.assertPathExists(
|
path1 = self.assertPathExists(
|
||||||
@ -1277,6 +1310,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
path1 = self.assertPathExists(
|
path1 = self.assertPathExists(
|
||||||
@ -1314,6 +1350,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 1)
|
self.assertEqual(CablePath.objects.count(), 1)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 1
|
# Delete cable 1
|
||||||
cable1.delete()
|
cable1.delete()
|
||||||
self.assertEqual(CablePath.objects.count(), 0)
|
self.assertEqual(CablePath.objects.count(), 0)
|
||||||
@ -1342,6 +1381,9 @@ class CablePathTestCase(TestCase):
|
|||||||
self.assertEqual(CablePath.objects.count(), 1)
|
self.assertEqual(CablePath.objects.count(), 1)
|
||||||
self.assertTrue(CablePath.objects.first().is_complete)
|
self.assertTrue(CablePath.objects.first().is_complete)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 1
|
# Delete cable 1
|
||||||
cable1.delete()
|
cable1.delete()
|
||||||
self.assertEqual(CablePath.objects.count(), 0)
|
self.assertEqual(CablePath.objects.count(), 0)
|
||||||
@ -1439,6 +1481,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cables 3-4
|
# Delete cables 3-4
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
cable4.delete()
|
cable4.delete()
|
||||||
@ -1495,6 +1540,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
path1 = self.assertPathExists(
|
path1 = self.assertPathExists(
|
||||||
@ -1578,6 +1626,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 2
|
# Delete cable 2
|
||||||
cable2.delete()
|
cable2.delete()
|
||||||
|
|
||||||
@ -1697,6 +1748,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 4)
|
self.assertEqual(CablePath.objects.count(), 4)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
# Delete cable 3
|
# Delete cable 3
|
||||||
cable3.delete()
|
cable3.delete()
|
||||||
|
|
||||||
@ -1784,6 +1838,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 2)
|
self.assertEqual(CablePath.objects.count(), 2)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
def test_220_interface_to_interface_duplex_via_multiple_front_and_rear_ports(self):
|
def test_220_interface_to_interface_duplex_via_multiple_front_and_rear_ports(self):
|
||||||
"""
|
"""
|
||||||
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2]
|
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2]
|
||||||
@ -1877,6 +1934,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 3)
|
self.assertEqual(CablePath.objects.count(), 3)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
def test_221_non_symmetric_paths(self):
|
def test_221_non_symmetric_paths(self):
|
||||||
"""
|
"""
|
||||||
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- -------------------------------------- [IF2]
|
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- -------------------------------------- [IF2]
|
||||||
@ -1997,6 +2057,9 @@ class CablePathTestCase(TestCase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(CablePath.objects.count(), 3)
|
self.assertEqual(CablePath.objects.count(), 3)
|
||||||
|
|
||||||
|
# Test SVG generation
|
||||||
|
CableTraceSVG(interface1).render()
|
||||||
|
|
||||||
def test_301_create_path_via_existing_cable(self):
|
def test_301_create_path_via_existing_cable(self):
|
||||||
"""
|
"""
|
||||||
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2]
|
[IF1] --C1-- [FP1] [RP1] --C2-- [RP2] [FP2] --C3-- [IF2]
|
||||||
|
Reference in New Issue
Block a user