3
0
Fork 0

fix: add "is false or null" grid filter, for nullable bool columns

This commit is contained in:
Lance Edgar 2024-12-08 18:43:40 -06:00
parent a9caf3f970
commit f68fe26ada
2 changed files with 82 additions and 7 deletions

View file

@ -328,9 +328,15 @@ class TestBooleanAlchemyFilter(WebTestCase):
model = self.app.model
self.sample_data = [
{'username': 'alice', 'active': True},
{'username': 'bob', 'active': True},
{'username': 'charlie', 'active': False},
{'username': 'alice',
'prevent_edit': False,
'active': True},
{'username': 'bob',
'prevent_edit': True,
'active': True},
{'username': 'charlie',
'active': False,
'prevent_edit': None},
]
for user in self.sample_data:
user = model.User(**user)
@ -343,6 +349,34 @@ class TestBooleanAlchemyFilter(WebTestCase):
kwargs['model_property'] = model_property
return factory(self.request, model_property.key, **kwargs)
def test_get_verbs(self):
model = self.app.model
# bool field, not nullable
filtr = self.make_filter(model.User.active,
factory=mod.BooleanAlchemyFilter,
nullable=False)
self.assertFalse(hasattr(filtr, 'verbs'))
self.assertEqual(filtr.default_verbs, ['is_true', 'is_false'])
# by default, returns default verbs (plus 'is_any')
self.assertEqual(filtr.get_verbs(), ['is_true', 'is_false', 'is_any'])
# default verbs can be a callable
filtr.default_verbs = lambda: ['foo', 'bar']
self.assertEqual(filtr.get_verbs(), ['foo', 'bar', 'is_any'])
# bool field, *nullable*
filtr = self.make_filter(model.User.active,
factory=mod.BooleanAlchemyFilter,
nullable=True)
self.assertFalse(hasattr(filtr, 'verbs'))
self.assertEqual(filtr.default_verbs, ['is_true', 'is_false'])
# effective verbs also include is_false_null
self.assertEqual(filtr.get_verbs(), ['is_true', 'is_false', 'is_false_null',
'is_null', 'is_not_null', 'is_any'])
def test_coerce_value(self):
model = self.app.model
filtr = self.make_filter(model.User.active)
@ -377,6 +411,16 @@ class TestBooleanAlchemyFilter(WebTestCase):
self.assertIsNot(filtered_query, self.sample_query)
self.assertEqual(filtered_query.count(), 1)
def test_filter_is_false_null(self):
model = self.app.model
filtr = self.make_filter(model.User.prevent_edit)
self.assertEqual(self.sample_query.count(), 3)
# nb. only one account is marked with "prevent edit"
filtered_query = filtr.filter_is_false_null(self.sample_query, None)
self.assertIsNot(filtered_query, self.sample_query)
self.assertEqual(filtered_query.count(), 2)
class TestVerbNotSupported(TestCase):