3
0
Fork 0

fix: allow passing filter factory to Grid.set_filter()

This commit is contained in:
Lance Edgar 2026-02-20 14:35:43 -06:00
parent 97e5a96cd6
commit ec18ce7116
2 changed files with 26 additions and 15 deletions

View file

@ -1404,10 +1404,11 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
Code usually does not need to call this directly. See also
:meth:`set_filter()`, which calls this method automatically.
:param columninfo: Can be either a model property (see below),
or a column name.
:param columninfo: Can be either a model property
(e.g. ``model.User.username``), or a column name
(e.g. ``"username"``).
:returns: A :class:`~wuttaweb.grids.filters.GridFilter`
:returns: :class:`~wuttaweb.grids.filters.GridFilter`
instance.
"""
key = kwargs.pop("key", None)
@ -1445,12 +1446,18 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
:param key: Name of column.
:param filterinfo: Can be either a
:class:`~wuttweb.grids.filters.GridFilter` instance, or
else a model property (see below).
:param filterinfo: Can be either a filter factory, or else a
model property (e.g. ``model.User.username``) or column
name (e.g. ``"username"``). If not specified then the
``key`` will be used instead.
If ``filterinfo`` is a ``GridFilter`` instance, it will be
used as-is for the backend filter.
:param \\**kwargs: Additional kwargs to pass along to the
filter factory.
If ``filterinfo`` is a factory, it will be called with the
current request, key and kwargs like so::
filtr = factory(self.request, key, **kwargs)
Otherwise :meth:`make_filter()` will be called to obtain the
backend filter. The ``filterinfo`` will be passed along to
@ -1462,11 +1469,12 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
filtr = None
if filterinfo and callable(filterinfo):
# filtr = filterinfo
raise NotImplementedError
kwargs.setdefault("label", self.get_filter_label(key))
filtr = filterinfo(self.request, key, **kwargs)
else:
kwargs["key"] = key
kwargs.setdefault("label", self.get_label(key))
kwargs.setdefault("label", self.get_filter_label(key))
filtr = self.make_filter(filterinfo or key, **kwargs)
self.filters[key] = filtr

View file

@ -1310,10 +1310,13 @@ class TestGrid(WebTestCase):
grid.set_filter("name")
self.assertIn("name", grid.filters)
# explicit is not yet implemented
# auto from filter factory
grid = self.make_grid(model_class=model.Setting)
self.assertEqual(grid.filters, {})
self.assertRaises(NotImplementedError, grid.set_filter, "name", lambda q: q)
grid.set_filter(
"name", StringAlchemyFilter, model_property=model.Setting.name
)
self.assertIn("name", grid.filters)
def test_remove_filter(self):
model = self.app.model