Просмотр исходного кода

fix(tables): Disable ordering on non-orderable accessor columns

Mark provider, member, and action_object columns as non-orderable since
they use complex accessors that cannot be sorted. Add regression tests
to verify all orderable columns render without exceptions.

Fixes table rendering errors when attempting to sort columns with
multi-level field accessors that don't support database ordering.
Martin Hauser 6 дней назад
Родитель
Сommit
0923a3dec8

+ 4 - 2
netbox/circuits/tables/circuits.py

@@ -190,14 +190,16 @@ class CircuitGroupAssignmentTable(NetBoxTable):
     provider = tables.Column(
         accessor='member__provider',
         verbose_name=_('Provider'),
-        linkify=True
+        orderable=False,
+        linkify=True,
     )
     member_type = columns.ContentTypeColumn(
         verbose_name=_('Type')
     )
     member = tables.Column(
         verbose_name=_('Circuit'),
-        linkify=True
+        orderable=False,
+        linkify=True,
     )
     priority = tables.Column(
         verbose_name=_('Priority'),

+ 32 - 7
netbox/circuits/tests/test_tables.py

@@ -1,23 +1,48 @@
 from django.test import RequestFactory, TestCase, tag
 
-from circuits.models import CircuitTermination
-from circuits.tables import CircuitTerminationTable
+from circuits.models import CircuitGroupAssignment, CircuitTermination
+from circuits.tables import CircuitGroupAssignmentTable, CircuitTerminationTable
 
 
 @tag('regression')
 class CircuitTerminationTableTest(TestCase):
     def test_every_orderable_field_does_not_throw_exception(self):
         terminations = CircuitTermination.objects.all()
-        disallowed = {'actions', }
+        disallowed = {
+            'actions',
+        }
 
         orderable_columns = [
-            column.name for column in CircuitTerminationTable(terminations).columns
+            column.name
+            for column in CircuitTerminationTable(terminations).columns
             if column.orderable and column.name not in disallowed
         ]
-        fake_request = RequestFactory().get("/")
+        fake_request = RequestFactory().get('/')
 
         for col in orderable_columns:
-            for dir in ('-', ''):
+            for direction in ('-', ''):
                 table = CircuitTerminationTable(terminations)
-                table.order_by = f'{dir}{col}'
+                table.order_by = f'{direction}{col}'
+                table.as_html(fake_request)
+
+
+@tag('regression')
+class CircuitGroupAssignmentTableTest(TestCase):
+    def test_every_orderable_field_does_not_throw_exception(self):
+        assignment = CircuitGroupAssignment.objects.all()
+        disallowed = {
+            'actions',
+        }
+
+        orderable_columns = [
+            column.name
+            for column in CircuitGroupAssignmentTable(assignment).columns
+            if column.orderable and column.name not in disallowed
+        ]
+        fake_request = RequestFactory().get('/')
+
+        for col in orderable_columns:
+            for direction in ('-', ''):
+                table = CircuitGroupAssignmentTable(assignment)
+                table.order_by = f'{direction}{col}'
                 table.as_html(fake_request)

+ 2 - 1
netbox/extras/tables/tables.py

@@ -510,8 +510,9 @@ class EventRuleTable(NetBoxTable):
         verbose_name=_('Type'),
     )
     action_object = tables.Column(
-        linkify=True,
         verbose_name=_('Object'),
+        orderable=False,
+        linkify=True,
     )
     object_types = columns.ContentTypesColumn(
         verbose_name=_('Object Types'),

+ 24 - 0
netbox/extras/tests/test_tables.py

@@ -0,0 +1,24 @@
+from django.test import RequestFactory, TestCase, tag
+
+from extras.models import EventRule
+from extras.tables import EventRuleTable
+
+
+@tag('regression')
+class EventRuleTableTest(TestCase):
+    def test_every_orderable_field_does_not_throw_exception(self):
+        rule = EventRule.objects.all()
+        disallowed = {
+            'actions',
+        }
+
+        orderable_columns = [
+            column.name for column in EventRuleTable(rule).columns if column.orderable and column.name not in disallowed
+        ]
+        fake_request = RequestFactory().get('/')
+
+        for col in orderable_columns:
+            for direction in ('-', ''):
+                table = EventRuleTable(rule)
+                table.order_by = f'{direction}{col}'
+                table.as_html(fake_request)