3
0
Fork 0

feat: add basic "delete results" grid tool

this is done synchronously with no progress indicator yet
This commit is contained in:
Lance Edgar 2024-08-24 14:26:13 -05:00
parent 6650ee698e
commit 6fa8b0aeaa
8 changed files with 426 additions and 13 deletions

View file

@ -254,6 +254,42 @@ class TestGrid(WebTestCase):
self.assertEqual(len(grid.actions), 1)
self.assertIsInstance(grid.actions[0], mod.GridAction)
def test_set_tools(self):
grid = self.make_grid()
self.assertEqual(grid.tools, {})
# null
grid.set_tools(None)
self.assertEqual(grid.tools, {})
# empty
grid.set_tools({})
self.assertEqual(grid.tools, {})
# full dict is replaced
grid.tools = {'foo': 'bar'}
self.assertEqual(grid.tools, {'foo': 'bar'})
grid.set_tools({'bar': 'baz'})
self.assertEqual(grid.tools, {'bar': 'baz'})
# can specify as list of html elements
grid.set_tools(['foo', 'bar'])
self.assertEqual(len(grid.tools), 2)
self.assertEqual(list(grid.tools.values()), ['foo', 'bar'])
def test_add_tool(self):
grid = self.make_grid()
self.assertEqual(grid.tools, {})
# with key
grid.add_tool('foo', key='foo')
self.assertEqual(grid.tools, {'foo': 'foo'})
# without key
grid.add_tool('bar')
self.assertEqual(len(grid.tools), 2)
self.assertEqual(list(grid.tools.values()), ['foo', 'bar'])
def test_get_pagesize_options(self):
grid = self.make_grid()

View file

@ -27,6 +27,7 @@ class TestMasterView(WebTestCase):
with patch.multiple(mod.MasterView, create=True,
model_name='Widget',
model_key='uuid',
deletable_bulk=True,
has_autocomplete=True,
configurable=True):
mod.MasterView.defaults(self.pyramid_config)
@ -400,6 +401,33 @@ class TestMasterView(WebTestCase):
self.assertTrue(view.has_any_perm('list', 'view'))
self.assertTrue(self.request.has_any_perm('settings.list', 'settings.view'))
def test_make_button(self):
view = self.make_view()
# normal
html = view.make_button('click me')
self.assertIn('<b-button ', html)
self.assertIn('click me', html)
self.assertNotIn('is-primary', html)
# primary as primary
html = view.make_button('click me', primary=True)
self.assertIn('<b-button ', html)
self.assertIn('click me', html)
self.assertIn('is-primary', html)
# primary as variant
html = view.make_button('click me', variant='is-primary')
self.assertIn('<b-button ', html)
self.assertIn('click me', html)
self.assertIn('is-primary', html)
# primary as type
html = view.make_button('click me', type='is-primary')
self.assertIn('<b-button ', html)
self.assertIn('click me', html)
self.assertIn('is-primary', html)
def test_render_to_response(self):
self.pyramid_config.include('wuttaweb.views.common')
self.pyramid_config.include('wuttaweb.views.auth')
@ -473,6 +501,7 @@ class TestMasterView(WebTestCase):
self.assertEqual(grid.labels, {'name': "SETTING NAME"})
def test_make_model_grid(self):
self.pyramid_config.add_route('settings.delete_bulk', '/settings/delete-bulk')
model = self.app.model
# no model class
@ -525,6 +554,20 @@ class TestMasterView(WebTestCase):
grid = view.make_model_grid(session=self.session)
self.assertEqual(len(grid.actions), 3)
# no tools by default
with patch.multiple(mod.MasterView, create=True,
model_class=model.Setting):
grid = view.make_model_grid(session=self.session)
self.assertEqual(grid.tools, {})
# delete-results tool added if master/perms allow
with patch.multiple(mod.MasterView, create=True,
model_class=model.Setting,
deletable_bulk=True):
with patch.object(self.request, 'is_root', new=True):
grid = view.make_model_grid(session=self.session)
self.assertIn('delete-results', grid.tools)
def test_get_grid_data(self):
model = self.app.model
self.app.save_setting(self.session, 'foo', 'bar')
@ -1053,6 +1096,81 @@ class TestMasterView(WebTestCase):
self.session.commit()
self.assertEqual(self.session.query(model.Setting).count(), 0)
def test_delete_bulk(self):
self.pyramid_config.add_route('settings', '/settings/')
model = self.app.model
sample_data = [
{'name': 'foo1', 'value': 'ONE'},
{'name': 'foo2', 'value': 'two'},
{'name': 'foo3', 'value': 'three'},
{'name': 'foo4', 'value': 'four'},
{'name': 'foo5', 'value': 'five'},
{'name': 'foo6', 'value': 'six'},
{'name': 'foo7', 'value': 'seven'},
{'name': 'foo8', 'value': 'eight'},
{'name': 'foo9', 'value': 'nine'},
]
for setting in sample_data:
self.app.save_setting(self.session, setting['name'], setting['value'])
self.session.commit()
sample_query = self.session.query(model.Setting)
with patch.multiple(mod.MasterView, create=True,
model_class=model.Setting):
view = self.make_view()
# sanity check on sample data
grid = view.make_model_grid(session=self.session)
data = grid.get_visible_data()
self.assertEqual(len(data), 9)
# and then let's filter it a little
self.request.GET = {'value': 's', 'value.verb': 'contains'}
grid = view.make_model_grid(session=self.session)
self.assertEqual(len(grid.filters), 2)
self.assertEqual(len(grid.active_filters), 1)
data = grid.get_visible_data()
self.assertEqual(len(data), 2)
# okay now let's delete those (gets redirected)
with patch.object(view, 'make_model_grid', return_value=grid):
response = view.delete_bulk(session=self.session)
self.assertEqual(response.status_code, 302)
self.assertEqual(self.session.query(model.Setting).count(), 7)
def test_delete_bulk_data(self):
self.pyramid_config.add_route('settings', '/settings/')
model = self.app.model
sample_data = [
{'name': 'foo1', 'value': 'ONE'},
{'name': 'foo2', 'value': 'two'},
{'name': 'foo3', 'value': 'three'},
{'name': 'foo4', 'value': 'four'},
{'name': 'foo5', 'value': 'five'},
{'name': 'foo6', 'value': 'six'},
{'name': 'foo7', 'value': 'seven'},
{'name': 'foo8', 'value': 'eight'},
{'name': 'foo9', 'value': 'nine'},
]
for setting in sample_data:
self.app.save_setting(self.session, setting['name'], setting['value'])
self.session.commit()
sample_query = self.session.query(model.Setting)
with patch.multiple(mod.MasterView, create=True,
model_class=model.Setting):
view = self.make_view()
# basic bulk delete
self.assertEqual(self.session.query(model.Setting).count(), 9)
settings = self.session.query(model.Setting)\
.filter(model.Setting.value.ilike('%s%'))\
.all()
self.assertEqual(len(settings), 2)
view.delete_bulk_data(settings, session=self.session)
self.session.commit()
self.assertEqual(self.session.query(model.Setting).count(), 7)
def test_autocomplete(self):
model = self.app.model