feat: move multi-column grid sorting logic to wuttaweb
tailbone grid template still duplicates much for Vue, and will until we can port the filters and anything else remaining..
This commit is contained in:
parent
ec36df4a34
commit
290f8fd51e
5 changed files with 252 additions and 292 deletions
|
@ -388,14 +388,63 @@ class TestGrid(WebTestCase):
|
|||
grid.load_settings()
|
||||
self.assertEqual(grid.active_sorters, [{'key': 'name', 'dir': 'desc'}])
|
||||
|
||||
def test_persist_settings(self):
|
||||
model = self.app.model
|
||||
|
||||
# nb. start out with paginated-only grid
|
||||
grid = self.make_grid(key='foo', paginated=True, paginate_on_backend=True)
|
||||
|
||||
# invalid dest
|
||||
self.assertRaises(ValueError, grid.persist_settings, {}, dest='doesnotexist')
|
||||
|
||||
# nb. no error if empty settings, but it saves null values
|
||||
grid.persist_settings({}, dest='session')
|
||||
self.assertIsNone(self.request.session['grid.foo.page'])
|
||||
|
||||
# provided values are saved
|
||||
grid.persist_settings({'pagesize': 15, 'page': 3}, dest='session')
|
||||
self.assertEqual(self.request.session['grid.foo.page'], 3)
|
||||
|
||||
# nb. now switch to sortable-only grid
|
||||
grid = self.make_grid(key='settings', model_class=model.Setting,
|
||||
sortable=True, sort_on_backend=True)
|
||||
|
||||
# no error if empty settings; does not save values
|
||||
grid.persist_settings({}, dest='session')
|
||||
self.assertNotIn('grid.settings.sorters.length', self.request.session)
|
||||
|
||||
# provided values are saved
|
||||
grid.persist_settings({'sorters.length': 2,
|
||||
'sorters.1.key': 'name',
|
||||
'sorters.1.dir': 'desc',
|
||||
'sorters.2.key': 'value',
|
||||
'sorters.2.dir': 'asc'},
|
||||
dest='session')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.length'], 2)
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.1.key'], 'name')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.1.dir'], 'desc')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.2.key'], 'value')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.2.dir'], 'asc')
|
||||
|
||||
# old values removed when new are saved
|
||||
grid.persist_settings({'sorters.length': 1,
|
||||
'sorters.1.key': 'name',
|
||||
'sorters.1.dir': 'desc'},
|
||||
dest='session')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.length'], 1)
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.1.key'], 'name')
|
||||
self.assertEqual(self.request.session['grid.settings.sorters.1.dir'], 'desc')
|
||||
self.assertNotIn('grid.settings.sorters.2.key', self.request.session)
|
||||
self.assertNotIn('grid.settings.sorters.2.dir', self.request.session)
|
||||
|
||||
def test_sort_data(self):
|
||||
model = self.app.model
|
||||
sample_data = [
|
||||
{'name': 'foo1', 'value': 'ONE'},
|
||||
{'name': 'foo2', 'value': 'two'},
|
||||
{'name': 'foo3', 'value': 'three'},
|
||||
{'name': 'foo4', 'value': 'four'},
|
||||
{'name': 'foo5', 'value': 'five'},
|
||||
{'name': 'foo3', 'value': 'ggg'},
|
||||
{'name': 'foo4', 'value': 'ggg'},
|
||||
{'name': 'foo5', 'value': 'ggg'},
|
||||
{'name': 'foo6', 'value': 'six'},
|
||||
{'name': 'foo7', 'value': 'seven'},
|
||||
{'name': 'foo8', 'value': 'eight'},
|
||||
|
@ -432,32 +481,30 @@ class TestGrid(WebTestCase):
|
|||
self.assertEqual(sorted_data[0]['name'], 'foo1')
|
||||
self.assertEqual(sorted_data[-1]['name'], 'foo9')
|
||||
|
||||
# error if mult-column sort attempted
|
||||
self.assertRaises(NotImplementedError, grid.sort_data, sample_data, sorters=[
|
||||
{'key': 'name', 'dir': 'desc'},
|
||||
{'key': 'value', 'dir': 'asc'},
|
||||
])
|
||||
# multi-column sorting for list data
|
||||
sorted_data = grid.sort_data(sample_data, sorters=[{'key': 'value', 'dir': 'asc'},
|
||||
{'key': 'name', 'dir': 'asc'}])
|
||||
self.assertEqual(dict(sorted_data[0]), {'name': 'foo8', 'value': 'eight'})
|
||||
self.assertEqual(dict(sorted_data[1]), {'name': 'foo3', 'value': 'ggg'})
|
||||
self.assertEqual(dict(sorted_data[3]), {'name': 'foo5', 'value': 'ggg'})
|
||||
self.assertEqual(dict(sorted_data[-1]), {'name': 'foo2', 'value': 'two'})
|
||||
|
||||
# multi-column sorting for query
|
||||
sorted_query = grid.sort_data(sample_query, sorters=[{'key': 'value', 'dir': 'asc'},
|
||||
{'key': 'name', 'dir': 'asc'}])
|
||||
self.assertEqual(dict(sorted_data[0]), {'name': 'foo8', 'value': 'eight'})
|
||||
self.assertEqual(dict(sorted_data[1]), {'name': 'foo3', 'value': 'ggg'})
|
||||
self.assertEqual(dict(sorted_data[3]), {'name': 'foo5', 'value': 'ggg'})
|
||||
self.assertEqual(dict(sorted_data[-1]), {'name': 'foo2', 'value': 'two'})
|
||||
|
||||
# cannot sort data if sortfunc is missing for column
|
||||
grid.remove_sorter('name')
|
||||
sorted_data = grid.sort_data(sample_data)
|
||||
sorted_data = grid.sort_data(sample_data, sorters=[{'key': 'value', 'dir': 'asc'},
|
||||
{'key': 'name', 'dir': 'asc'}])
|
||||
# nb. sorted data is in same order as original sample (not sorted)
|
||||
self.assertEqual(sorted_data[0]['name'], 'foo1')
|
||||
self.assertEqual(sorted_data[-1]['name'], 'foo9')
|
||||
|
||||
# cannot sort data if sortfunc is missing for column
|
||||
grid.remove_sorter('name')
|
||||
# nb. attempting multi-column sort, but only one sorter exists
|
||||
self.assertEqual(list(grid.sorters), ['value'])
|
||||
grid.active_sorters = [{'key': 'name', 'dir': 'asc'},
|
||||
{'key': 'value', 'dir': 'asc'}]
|
||||
with patch.object(sample_query, 'order_by') as order_by:
|
||||
order_by.return_value = 42
|
||||
sorted_query = grid.sort_data(sample_query)
|
||||
order_by.assert_called_once()
|
||||
self.assertEqual(len(order_by.call_args.args), 1)
|
||||
self.assertEqual(sorted_query, 42)
|
||||
|
||||
def test_render_vue_tag(self):
|
||||
model = self.app.model
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue