3
0
Fork 0

fix: use smarter default for grid.sort_multiple based on model class

This commit is contained in:
Lance Edgar 2025-12-20 21:45:50 -06:00
parent 45909e653b
commit 343567128f
3 changed files with 22 additions and 6 deletions

View file

@ -186,8 +186,8 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
.. attribute:: sort_multiple
Boolean indicating whether "multi-column" sorting is allowed.
Default is ``True``; if this is ``False`` then only one column
may be sorted at a time.
This is true by default, where possible. If false then only
one column may be sorted at a time.
Only relevant if :attr:`sortable` is true, but applies to both
frontend and backend sorting.
@ -399,7 +399,7 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
linked_columns=None,
hidden_columns=None,
sortable=False,
sort_multiple=True,
sort_multiple=None,
sort_on_backend=True,
sorters=None,
sort_defaults=None,
@ -441,7 +441,12 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
# sorting
self.sortable = sortable
self.sort_multiple = sort_multiple
if sort_multiple is not None:
self.sort_multiple = sort_multiple
elif self.request.use_oruga:
self.sort_multiple = False
else:
self.sort_multiple = bool(self.model_class)
if self.sort_multiple and self.request.use_oruga:
log.warning(
"grid.sort_multiple is not implemented for Oruga-based templates"

View file

@ -2488,7 +2488,6 @@ class MasterView(View): # pylint: disable=too-many-public-methods
kwargs.setdefault("filterable", self.filterable)
kwargs.setdefault("filter_defaults", self.filter_defaults)
kwargs.setdefault("sortable", self.sortable)
kwargs.setdefault("sort_multiple", not self.request.use_oruga)
kwargs.setdefault("sort_on_backend", self.sort_on_backend)
kwargs.setdefault("sort_defaults", self.sort_defaults)
kwargs.setdefault("paginated", self.paginated)
@ -3041,7 +3040,6 @@ class MasterView(View): # pylint: disable=too-many-public-methods
kwargs.setdefault("filterable", self.rows_filterable)
kwargs.setdefault("filter_defaults", self.rows_filter_defaults)
kwargs.setdefault("sortable", self.rows_sortable)
kwargs.setdefault("sort_multiple", not self.request.use_oruga)
kwargs.setdefault("sort_on_backend", self.rows_sort_on_backend)
kwargs.setdefault("sort_defaults", self.rows_sort_defaults)
kwargs.setdefault("paginated", self.rows_paginated)

View file

@ -32,6 +32,7 @@ class TestGrid(WebTestCase):
return mod.Grid(request or self.request, **kwargs)
def test_constructor(self):
model = self.app.model
# empty
grid = self.make_grid()
@ -44,6 +45,18 @@ class TestGrid(WebTestCase):
self.assertIsInstance(grid.columns, FieldList)
self.assertEqual(grid.columns, ["foo", "bar"])
# sort_multiple is off by default with no model class
self.assertFalse(grid.sort_multiple)
# sort_multiple is *on* by default *with* model class
grid = self.make_grid(model_class=model.User)
self.assertTrue(grid.sort_multiple)
# ..but not if using oruga
with patch.object(self.request, "use_oruga", new=True):
grid = self.make_grid(model_class=model.User)
self.assertFalse(grid.sort_multiple)
def test_constructor_sorting(self):
model = self.app.model