Add readonly support for email profile settings.

More to come...  Also this required some form tweaking/overhaul(s).
This commit is contained in:
Lance Edgar 2015-12-04 00:31:22 -06:00
parent ba6bf87ded
commit ef40af814a
13 changed files with 453 additions and 48 deletions

View file

@ -34,6 +34,8 @@ from sqlalchemy import orm
import formalchemy
from webhelpers import paginate
from edbob.util import prettify
from tailbone.db import Session
from tailbone.newgrids import Grid, GridColumn, filters
@ -61,8 +63,10 @@ class AlchemyGrid(Grid):
def __init__(self, *args, **kwargs):
super(AlchemyGrid, self).__init__(*args, **kwargs)
self._fa_grid = formalchemy.Grid(self.model_class, instances=self.data,
session=Session(), request=self.request)
fa_grid = formalchemy.Grid(self.model_class, instances=self.data,
session=Session(), request=self.request)
fa_grid.prettify = prettify
self._fa_grid = fa_grid
def __delattr__(self, attr):
delattr(self._fa_grid, attr)
@ -150,10 +154,8 @@ class AlchemyGrid(Grid):
Returns an iterator for all currently-visible columns.
"""
for field in self._fa_grid.render_fields.itervalues():
column = GridColumn()
column = GridColumn(field.key, field.label())
column.field = field
column.key = field.key
column.label = field.label()
yield column
def iter_rows(self):

View file

@ -26,6 +26,8 @@ Core Grid Classes
from __future__ import unicode_literals
from edbob.util import prettify
from rattail.db.api import get_setting, save_setting
from pyramid.renderers import render
@ -136,6 +138,17 @@ class Grid(object):
sorters.update(updates)
return sorters
def make_sorter(self, key, foldcase=False):
"""
Returns a function suitable for a sort map callable, with typical logic
built in for sorting a data set comprised of dicts, on the given key.
"""
if foldcase:
keyfunc = lambda v: v[key].lower()
else:
keyfunc = lambda v: v[key]
return lambda q, d: sorted(q, key=keyfunc, reverse=d == 'desc')
def load_settings(self, store=True):
"""
Load current/effective settings for the grid, from the request query
@ -150,13 +163,15 @@ class Grid(object):
settings = {
'sortkey': self.default_sortkey,
'sortdir': self.default_sortdir,
'pagesize': self.default_pagesize,
'page': self.default_page,
}
for filtr in self.iter_filters():
settings['filter.{0}.active'.format(filtr.key)] = filtr.default_active
settings['filter.{0}.verb'.format(filtr.key)] = filtr.default_verb
settings['filter.{0}.value'.format(filtr.key)] = filtr.default_value
if self.pageable:
settings['pagesize'] = self.default_pagesize
settings['page'] = self.default_page
if self.filterable:
for filtr in self.iter_filters():
settings['filter.{0}.active'.format(filtr.key)] = filtr.default_active
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():
@ -169,7 +184,7 @@ class Grid(object):
# If request has filter settings, grab those, then grab sort/pager
# settings from request or session.
elif self.request_has_settings('filter'):
elif self.filterable and self.request_has_settings('filter'):
self.update_filter_settings(settings, 'request')
if self.request_has_settings('sort'):
self.update_sort_settings(settings, 'request')
@ -591,7 +606,7 @@ class Grid(object):
return tags.link_to(action.label, url)
def iter_rows(self):
return []
return self.make_visible_data()
def get_row_attrs(self, row, i):
"""
@ -642,7 +657,7 @@ class Grid(object):
return self.cell_attrs
def render_cell(self, row, column):
return ''
return unicode(row[column.key])
def get_pagesize_options(self):
# TODO: Make configurable or something...
@ -661,8 +676,10 @@ class GridColumn(object):
Human-facing label for the column, i.e. displayed in the header.
"""
key = None
label = None
def __init__(self, key, label=None):
self.key = key
self.label = label or prettify(key)
class GridAction(object):
@ -673,7 +690,7 @@ class GridAction(object):
def __init__(self, key, label=None, url='#', icon=None):
self.key = key
self.label = label or key.capitalize()
self.label = label or prettify(key)
self.icon = icon
self.url = url