feat: move "basic" grid pagination logic to wuttaweb

so far only "simple" pagination is supported by wuttaweb, so basically
the main feature flag, page size, current page.  in this
scenario *all* data is written to client-side JSON and Buefy handles
the actual pagination.

backend pagination coming soon for wuttaweb but for now tailbone still
handles all that.
This commit is contained in:
Lance Edgar 2024-08-16 18:45:04 -05:00
parent 2a0b6da2f9
commit 9da2a148c6
5 changed files with 195 additions and 47 deletions

View file

@ -31,6 +31,7 @@ import logging
import sqlalchemy as sa
from sqlalchemy import orm
from wuttjamaican.util import UNSPECIFIED
from rattail.db.types import GPCType
from rattail.util import prettify, pretty_boolean
@ -209,9 +210,6 @@ class Grid(WuttaGrid):
sorters={},
default_sortkey=None,
default_sortdir='asc',
pageable=False,
default_pagesize=None,
default_page=1,
checkboxes=False,
checked=None,
check_handler=None,
@ -233,7 +231,26 @@ class Grid(WuttaGrid):
DeprecationWarning, stacklevel=2)
kwargs.setdefault('vue_tagname', kwargs.pop('component'))
# TODO: pretty sure this should go away?
if kwargs.get('pageable'):
warnings.warn("component param is deprecated for Grid(); "
"please use vue_tagname param instead",
DeprecationWarning, stacklevel=2)
kwargs.setdefault('paginated', kwargs.pop('pageable'))
if kwargs.get('default_pagesize'):
warnings.warn("default_pagesize param is deprecated for Grid(); "
"please use pagesize param instead",
DeprecationWarning, stacklevel=2)
kwargs.setdefault('pagesize', kwargs.pop('default_pagesize'))
if kwargs.get('default_page'):
warnings.warn("default_page param is deprecated for Grid(); "
"please use page param instead",
DeprecationWarning, stacklevel=2)
kwargs.setdefault('page', kwargs.pop('default_page'))
# TODO: this should not be needed once all templates correctly
# reference grid.vue_component etc.
kwargs.setdefault('vue_tagname', 'tailbone-grid')
kwargs['key'] = key
@ -272,10 +289,6 @@ class Grid(WuttaGrid):
self.default_sortkey = default_sortkey
self.default_sortdir = default_sortdir
self.pageable = pageable
self.default_pagesize = default_pagesize
self.default_page = default_page
self.checkboxes = checkboxes
self.checked = checked
if self.checked is None:
@ -333,6 +346,16 @@ class Grid(WuttaGrid):
DeprecationWarning, stacklevel=2)
return self.vue_component
def get_pageable(self):
""" """
return self.paginated
def set_pageable(self, value):
""" """
self.paginated = value
pageable = property(get_pageable, set_pageable)
def hide_column(self, key):
"""
This *removes* a column from the grid, altogether.
@ -756,18 +779,61 @@ class Grid(WuttaGrid):
keyfunc = lambda v: v[key]
return lambda q, d: sorted(q, key=keyfunc, reverse=d == 'desc')
def get_default_pagesize(self):
def get_pagesize_options(self, default=None):
""" """
# let upstream check config
options = super().get_pagesize_options(default=UNSPECIFIED)
if options is not UNSPECIFIED:
return options
# fallback to legacy config
options = self.config.get_list('tailbone.grid.pagesize_options')
if options:
warnings.warn("tailbone.grid.pagesize_options setting is deprecated; "
"please set wuttaweb.grids.default_pagesize_options instead",
DeprecationWarning)
options = [int(size) for size in options
if size.isdigit()]
if options:
return options
if default:
return default
# use upstream default
return super().get_pagesize_options()
def get_pagesize(self, default=None):
""" """
# let upstream check config
pagesize = super().get_pagesize(default=UNSPECIFIED)
if pagesize is not UNSPECIFIED:
return pagesize
# fallback to legacy config
pagesize = self.config.get_int('tailbone.grid.default_pagesize')
if pagesize:
warnings.warn("tailbone.grid.default_pagesize setting is deprecated; "
"please use wuttaweb.grids.default_pagesize instead",
DeprecationWarning)
return pagesize
if default:
return default
# use upstream default
return super().get_pagesize()
def get_default_pagesize(self): # pragma: no cover
""" """
warnings.warn("Grid.get_default_pagesize() method is deprecated; "
"please use Grid.get_pagesize() of Grid.page instead",
DeprecationWarning, stacklevel=2)
if self.default_pagesize:
return self.default_pagesize
pagesize = self.request.rattail_config.getint('tailbone',
'grid.default_pagesize',
default=0)
if pagesize:
return pagesize
options = self.get_pagesize_options()
return options[0]
return self.get_pagesize()
def load_settings(self, store=True):
"""
@ -789,9 +855,9 @@ class Grid(WuttaGrid):
settings['sorters.1.dir'] = self.default_sortdir
else:
settings['sorters.length'] = 0
if self.pageable:
settings['pagesize'] = self.get_default_pagesize()
settings['page'] = self.default_page
if self.paginated:
settings['pagesize'] = self.pagesize
settings['page'] = self.page
if self.filterable:
for filtr in self.iter_filters():
settings['filter.{}.active'.format(filtr.key)] = filtr.default_active
@ -867,7 +933,7 @@ class Grid(WuttaGrid):
'field': settings[f'sorters.{i}.key'],
'order': settings[f'sorters.{i}.dir'],
})
if self.pageable:
if self.paginated:
self.pagesize = settings['pagesize']
self.page = settings['page']
@ -971,7 +1037,7 @@ class Grid(WuttaGrid):
merge(f'sorters.{i}.key')
merge(f'sorters.{i}.dir')
if self.pageable:
if self.paginated:
merge('pagesize', int)
merge('page', int)
@ -1154,7 +1220,7 @@ class Grid(WuttaGrid):
:param settings: Dictionary of initial settings, which is to be updated.
"""
if not self.pageable:
if not self.paginated:
return
pagesize = self.request.GET.get('pagesize')
@ -1231,7 +1297,7 @@ class Grid(WuttaGrid):
persist(f'sorters.{i}.key')
persist(f'sorters.{i}.dir')
if self.pageable:
if self.paginated:
persist('pagesize')
persist('page')
@ -1355,7 +1421,7 @@ class Grid(WuttaGrid):
data = self.filter_data(data)
if self.sortable:
data = self.sort_data(data)
if self.pageable:
if self.paginated:
self.pager = self.paginate_data(data)
data = self.pager
return data
@ -1580,18 +1646,6 @@ class Grid(WuttaGrid):
return tags.checkbox('checkbox-{}-{}'.format(self.key, self.get_row_key(item)),
checked=self.checked(item))
def get_pagesize_options(self):
# use values from config, if defined
options = self.request.rattail_config.getlist('tailbone', 'grid.pagesize_options')
if options:
options = [int(size) for size in options
if size.isdigit()]
if options:
return options
return [5, 10, 20, 50, 100, 200]
def has_static_data(self):
"""
Should return ``True`` if the grid data can be considered "static"
@ -1734,7 +1788,7 @@ class Grid(WuttaGrid):
results['checked_rows_code'] = '[{}]'.format(
', '.join(['{}[{}]'.format(var, i) for i in checked]))
if self.pageable and self.pager is not None:
if self.paginated and self.pager is not None:
results['total_items'] = self.pager.item_count
results['per_page'] = self.pager.items_per_page
results['page'] = self.pager.page