feat: add backend pagination support for grids
This commit is contained in:
parent
dd3d640b1c
commit
d151758c48
7 changed files with 501 additions and 29 deletions
|
@ -3,6 +3,7 @@
|
|||
from unittest import TestCase
|
||||
from unittest.mock import patch
|
||||
|
||||
from paginate import Page
|
||||
from pyramid import testing
|
||||
|
||||
from wuttjamaican.conf import WuttaConfig
|
||||
|
@ -168,6 +169,105 @@ class TestGrid(WebTestCase):
|
|||
size = grid.get_pagesize()
|
||||
self.assertEqual(size, 15)
|
||||
|
||||
##############################
|
||||
# configuration methods
|
||||
##############################
|
||||
|
||||
def test_load_settings(self):
|
||||
grid = self.make_grid(key='foo', paginated=True, paginate_on_backend=True,
|
||||
pagesize=20, page=1)
|
||||
|
||||
# settings are loaded, applied, saved
|
||||
self.assertEqual(grid.page, 1)
|
||||
self.assertNotIn('grid.foo.page', self.request.session)
|
||||
self.request.GET = {'pagesize': '10', 'page': '2'}
|
||||
grid.load_settings()
|
||||
self.assertEqual(grid.page, 2)
|
||||
self.assertEqual(self.request.session['grid.foo.page'], 2)
|
||||
|
||||
# can skip the saving step
|
||||
self.request.GET = {'pagesize': '10', 'page': '3'}
|
||||
grid.load_settings(store=False)
|
||||
self.assertEqual(grid.page, 3)
|
||||
self.assertEqual(self.request.session['grid.foo.page'], 2)
|
||||
|
||||
# no error for non-paginated grid
|
||||
grid = self.make_grid(key='foo', paginated=False)
|
||||
grid.load_settings()
|
||||
self.assertFalse(grid.paginated)
|
||||
|
||||
def test_request_has_settings(self):
|
||||
grid = self.make_grid(key='foo')
|
||||
|
||||
self.assertFalse(grid.request_has_settings())
|
||||
|
||||
with patch.object(self.request, 'GET', new={'pagesize': '20'}):
|
||||
self.assertTrue(grid.request_has_settings())
|
||||
|
||||
with patch.object(self.request, 'GET', new={'page': '1'}):
|
||||
self.assertTrue(grid.request_has_settings())
|
||||
|
||||
def test_update_page_settings(self):
|
||||
grid = self.make_grid(key='foo')
|
||||
|
||||
# settings are updated from session
|
||||
settings = {'pagesize': 20, 'page': 1}
|
||||
self.request.session['grid.foo.pagesize'] = 10
|
||||
self.request.session['grid.foo.page'] = 2
|
||||
grid.update_page_settings(settings)
|
||||
self.assertEqual(settings['pagesize'], 10)
|
||||
self.assertEqual(settings['page'], 2)
|
||||
|
||||
# settings are updated from request
|
||||
self.request.GET = {'pagesize': '15', 'page': '4'}
|
||||
grid.update_page_settings(settings)
|
||||
self.assertEqual(settings['pagesize'], 15)
|
||||
self.assertEqual(settings['page'], 4)
|
||||
|
||||
def test_persist_settings(self):
|
||||
grid = self.make_grid(key='foo', paginated=True, paginate_on_backend=True)
|
||||
|
||||
# nb. no error if empty settings, but it saves null values
|
||||
grid.persist_settings({})
|
||||
self.assertIsNone(self.request.session['grid.foo.page'])
|
||||
|
||||
# provided values are saved
|
||||
grid.persist_settings({'pagesize': 15, 'page': 3})
|
||||
self.assertEqual(self.request.session['grid.foo.page'], 3)
|
||||
|
||||
##############################
|
||||
# data methods
|
||||
##############################
|
||||
|
||||
def test_get_visible_data(self):
|
||||
data = [
|
||||
{'foo': 1, 'bar': 1},
|
||||
{'foo': 2, 'bar': 2},
|
||||
{'foo': 3, 'bar': 3},
|
||||
{'foo': 4, 'bar': 4},
|
||||
{'foo': 5, 'bar': 5},
|
||||
{'foo': 6, 'bar': 6},
|
||||
{'foo': 7, 'bar': 7},
|
||||
{'foo': 8, 'bar': 8},
|
||||
{'foo': 9, 'bar': 9},
|
||||
]
|
||||
grid = self.make_grid(data=data,
|
||||
columns=['foo', 'bar'],
|
||||
paginated=True, paginate_on_backend=True,
|
||||
pagesize=4, page=2)
|
||||
visible = grid.get_visible_data()
|
||||
self.assertEqual(len(visible), 4)
|
||||
self.assertEqual(visible[0], {'foo': 5, 'bar': 5})
|
||||
|
||||
def test_paginate_data(self):
|
||||
grid = self.make_grid()
|
||||
pager = grid.paginate_data([])
|
||||
self.assertIsInstance(pager, Page)
|
||||
|
||||
##############################
|
||||
# rendering methods
|
||||
##############################
|
||||
|
||||
def test_render_vue_tag(self):
|
||||
grid = self.make_grid(columns=['foo', 'bar'])
|
||||
html = grid.render_vue_tag()
|
||||
|
@ -221,6 +321,28 @@ class TestGrid(WebTestCase):
|
|||
data = grid.get_vue_data()
|
||||
self.assertEqual(data, [{'foo': 'blah blah', '_action_url_view': '/blarg'}])
|
||||
|
||||
def test_get_vue_pager_stats(self):
|
||||
data = [
|
||||
{'foo': 1, 'bar': 1},
|
||||
{'foo': 2, 'bar': 2},
|
||||
{'foo': 3, 'bar': 3},
|
||||
{'foo': 4, 'bar': 4},
|
||||
{'foo': 5, 'bar': 5},
|
||||
{'foo': 6, 'bar': 6},
|
||||
{'foo': 7, 'bar': 7},
|
||||
{'foo': 8, 'bar': 8},
|
||||
{'foo': 9, 'bar': 9},
|
||||
]
|
||||
|
||||
grid = self.make_grid(columns=['foo', 'bar'], pagesize=4, page=2)
|
||||
grid.pager = grid.paginate_data(data)
|
||||
stats = grid.get_vue_pager_stats()
|
||||
self.assertEqual(stats['item_count'], 9)
|
||||
self.assertEqual(stats['items_per_page'], 4)
|
||||
self.assertEqual(stats['page'], 2)
|
||||
self.assertEqual(stats['first_item'], 5)
|
||||
self.assertEqual(stats['last_item'], 8)
|
||||
|
||||
|
||||
class TestGridAction(TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue