Add "Save Defaults" button so user can save personal defaults for any new grid.

This commit is contained in:
Lance Edgar 2015-08-14 19:59:26 -05:00
parent d57f5169b0
commit 2b1bdec2f8
3 changed files with 88 additions and 24 deletions

View file

@ -26,10 +26,13 @@ Core Grid Classes
from __future__ import unicode_literals
from rattail.db.api import get_setting, save_setting
from pyramid.renderers import render
from webhelpers.html import HTML, tags
from webhelpers.html.builder import format_attrs
from tailbone.db import Session
from tailbone.newgrids import filters
@ -155,6 +158,10 @@ class Grid(object):
settings['filter.{0}.verb'.format(filtr.key)] = filtr.default_verb
settings['filter.{0}.value'.format(filtr.key)] = filtr.default_value
# If user has default settings on file, apply those first.
if self.user_has_defaults():
self.apply_user_defaults(settings)
# If request contains instruction to reset to default filters, then we
# can skip the rest of the request/session checks.
if self.request.GET.get('reset-to-default-filters') == 'true':
@ -200,7 +207,12 @@ class Grid(object):
# Maybe store settings for next time.
if store:
self.store_settings(settings)
self.persist_settings(settings, 'session')
# If request contained instruction to save current settings as defaults
# for the current user, then do that.
if self.request.GET.get('save-current-filters-as-defaults') == 'true':
self.persist_settings(settings, 'defaults')
# Update ourself and our filters, to reflect settings.
if self.filterable:
@ -215,6 +227,37 @@ class Grid(object):
self.pagesize = settings['pagesize']
self.page = settings['page']
def user_has_defaults(self):
"""
Check to see if the current user has default settings on file for this grid.
"""
# User defaults should have all or nothing, so just check one key.
key = 'tailbone.{0}.grid.{1}.sortkey'.format(self.request.user.uuid, self.key)
return get_setting(Session(), key) is not None
def apply_user_defaults(self, settings):
"""
Update the given settings dict with user defaults, if any exist.
"""
def merge(key, coerce=lambda v: v):
skey = 'tailbone.{0}.grid.{1}.{2}'.format(self.request.user.uuid, self.key, key)
value = get_setting(Session(), skey)
settings[key] = coerce(value)
if self.filterable:
for filtr in self.iter_filters():
merge('filter.{0}.active'.format(filtr.key), lambda v: v == 'true')
merge('filter.{0}.verb'.format(filtr.key))
merge('filter.{0}.value'.format(filtr.key))
if self.sortable:
merge('sortkey')
merge('sortdir')
if self.pageable:
merge('pagesize', int)
merge('page', int)
def request_has_settings(self, type_):
"""
Determine if the current request (GET query string) contains any
@ -266,7 +309,7 @@ class Grid(object):
else:
value = self.request.session.get('grid.{0}.{1}'.format(self.key, key))
if value is not None:
return value
return coerce(value)
# If source had nothing, try default/existing settings.
value = settings.get(key)
@ -307,7 +350,8 @@ class Grid(object):
else: # source = session
settings['{0}.active'.format(prefix)] = self.get_setting(
source, settings, '{0}.active'.format(prefix), default=False)
source, settings, '{0}.active'.format(prefix),
coerce=lambda v: unicode(v).lower() == 'true', default=False)
settings['{0}.verb'.format(prefix)] = self.get_setting(
source, settings, '{0}.verb'.format(prefix), default='')
settings['{0}.value'.format(prefix)] = self.get_setting(
@ -361,26 +405,31 @@ class Grid(object):
if page is not None:
settings['page'] = page
def store_settings(self, settings):
def persist_settings(self, settings, to='session'):
"""
Store settings in current session, for next time.
Persist the given settings in some way, as defined by ``func``.
"""
def store(key):
self.request.session['grid.{0}.{1}'.format(self.key, key)] = settings[key]
def persist(key, value=lambda k: settings[k]):
if to == 'defaults':
skey = 'tailbone.{0}.grid.{1}.{2}'.format(self.request.user.uuid, self.key, key)
save_setting(Session(), skey, value(key))
else: # to == session
skey = 'grid.{0}.{1}'.format(self.key, key)
self.request.session[skey] = value(key)
if self.filterable:
for filtr in self.iter_filters():
store('filter.{0}.active'.format(filtr.key))
store('filter.{0}.verb'.format(filtr.key))
store('filter.{0}.value'.format(filtr.key))
persist('filter.{0}.active'.format(filtr.key), value=lambda k: unicode(settings[k]).lower())
persist('filter.{0}.verb'.format(filtr.key))
persist('filter.{0}.value'.format(filtr.key))
if self.sortable:
store('sortkey')
store('sortdir')
persist('sortkey')
persist('sortdir')
if self.pageable:
store('pagesize')
store('page')
persist('pagesize')
persist('page')
def filter_data(self, data):
"""