feat: add basic "delete results" grid tool
this is done synchronously with no progress indicator yet
This commit is contained in:
parent
6650ee698e
commit
6fa8b0aeaa
8 changed files with 426 additions and 13 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue