Refactor grid filters to use colander/deform
This commit is contained in:
parent
f636b98cb3
commit
d9ff59afda
4 changed files with 57 additions and 54 deletions
|
@ -898,11 +898,13 @@ class Grid(object):
|
|||
data['{}.verb'.format(filtr.key)] = filtr.verb
|
||||
data[filtr.key] = filtr.value
|
||||
|
||||
form = gridfilters.GridFiltersForm(self.request, self.filters, defaults=data)
|
||||
form = gridfilters.GridFiltersForm(self.filters,
|
||||
request=self.request,
|
||||
defaults=data)
|
||||
|
||||
kwargs['request'] = self.request
|
||||
kwargs['grid'] = self
|
||||
kwargs['form'] = gridfilters.GridFiltersFormRenderer(form)
|
||||
kwargs['form'] = form
|
||||
return render(template, kwargs)
|
||||
|
||||
def render_actions(self, row, i):
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2017 Lance Edgar
|
||||
# Copyright © 2010-2018 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -38,10 +38,11 @@ from rattail.core import UNSPECIFIED
|
|||
from rattail.time import localtime, make_utc
|
||||
from rattail.util import prettify
|
||||
|
||||
from pyramid_simpleform import Form
|
||||
from pyramid_simpleform.renderers import FormRenderer
|
||||
import colander
|
||||
from webhelpers2.html import HTML, tags
|
||||
|
||||
from tailbone import forms
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
@ -736,58 +737,33 @@ class GridFilterSet(OrderedDict):
|
|||
"""
|
||||
|
||||
|
||||
class GridFiltersForm(Form):
|
||||
class GridFiltersForm(forms.Form):
|
||||
"""
|
||||
Form for grid filters.
|
||||
"""
|
||||
|
||||
def __init__(self, request, filters, *args, **kwargs):
|
||||
super(GridFiltersForm, self).__init__(request, *args, **kwargs)
|
||||
def __init__(self, filters, **kwargs):
|
||||
self.filters = filters
|
||||
if 'schema' not in kwargs:
|
||||
schema = colander.Schema()
|
||||
for key, filtr in self.filters.items():
|
||||
node = colander.SchemaNode(colander.String(), name=key)
|
||||
schema.add(node)
|
||||
kwargs['schema'] = schema
|
||||
super(GridFiltersForm, self).__init__(**kwargs)
|
||||
|
||||
def iter_filters(self):
|
||||
return self.filters.itervalues()
|
||||
|
||||
|
||||
class GridFiltersFormRenderer(FormRenderer):
|
||||
"""
|
||||
Renderer for :class:`GridFiltersForm` instances.
|
||||
"""
|
||||
|
||||
@property
|
||||
def filters(self):
|
||||
return self.form.filters
|
||||
|
||||
def iter_filters(self):
|
||||
return self.form.iter_filters()
|
||||
|
||||
def tag(self, *args, **kwargs):
|
||||
"""
|
||||
Convenience method which passes all args to the
|
||||
:meth:`webhelpers2:webhelpers2.html.builder.HTMLBuilder.tag()` method.
|
||||
"""
|
||||
return HTML.tag(*args, **kwargs)
|
||||
|
||||
# TODO: This seems hacky..?
|
||||
def checkbox(self, name, checked=None, **kwargs):
|
||||
"""
|
||||
Custom checkbox implementation.
|
||||
"""
|
||||
if name.endswith('-active'):
|
||||
return tags.checkbox(name, checked=checked, **kwargs)
|
||||
if checked is None:
|
||||
checked = False
|
||||
return super(GridFiltersFormRenderer, self).checkbox(name, checked=checked, **kwargs)
|
||||
return self.filters.values()
|
||||
|
||||
def filter_verb(self, filtr):
|
||||
"""
|
||||
Render the verb selection dropdown for the given filter.
|
||||
"""
|
||||
options = [(v, filtr.verb_labels.get(v, "unknown verb '{0}'".format(v)))
|
||||
options = [tags.Option(filtr.verb_labels.get(v, "unknown verb '{}'".format(v)), v)
|
||||
for v in filtr.verbs]
|
||||
hide_values = [v for v in filtr.valueless_verbs
|
||||
if v in filtr.verbs]
|
||||
return self.select('{0}.verb'.format(filtr.key), options, **{
|
||||
return tags.select('{}.verb'.format(filtr.key), filtr.verb, options, **{
|
||||
'class_': 'verb',
|
||||
'data-hide-value-for': ' '.join(hide_values)})
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue