diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index f0f45a1..8a89f9d 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -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" diff --git a/src/wuttaweb/views/master.py b/src/wuttaweb/views/master.py index 57baaff..71a05f9 100644 --- a/src/wuttaweb/views/master.py +++ b/src/wuttaweb/views/master.py @@ -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) diff --git a/tests/grids/test_base.py b/tests/grids/test_base.py index 0087e93..8c372ba 100644 --- a/tests/grids/test_base.py +++ b/tests/grids/test_base.py @@ -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