3
0
Fork 0

feat: add basic support for rows grid for master, batch views

This commit is contained in:
Lance Edgar 2024-12-14 10:38:49 -06:00
parent 5006c97b4b
commit e3beb9953d
5 changed files with 573 additions and 11 deletions

View file

@ -334,6 +334,16 @@ class TestMasterView(WebTestCase):
model_class=MyModel):
self.assertEqual(mod.MasterView.get_config_title(), "Dinosaurs")
def test_get_row_model_class(self):
model = self.app.model
# no default
self.assertIsNone(mod.MasterView.get_row_model_class())
# class may specify
with patch.object(mod.MasterView, 'row_model_class', create=True, new=model.User):
self.assertIs(mod.MasterView.get_row_model_class(), model.User)
##############################
# support methods
##############################
@ -1017,6 +1027,53 @@ class TestMasterView(WebTestCase):
with patch.object(view, 'get_instance', return_value=setting):
response = view.view()
def test_view_with_rows(self):
self.pyramid_config.include('wuttaweb.views.common')
self.pyramid_config.include('wuttaweb.views.auth')
self.pyramid_config.add_route('people', '/people/')
model = self.app.model
person = model.Person(full_name="Whitney Houston")
self.session.add(person)
user = model.User(username='whitney', person=person)
self.session.add(user)
self.session.commit()
get_row_grid_data = MagicMock()
with patch.multiple(mod.MasterView, create=True,
Session=MagicMock(return_value=self.session),
model_class=model.Person,
route_prefix='people',
has_rows=True,
row_model_class=model.User,
get_row_grid_data=get_row_grid_data):
with patch.object(self.request, 'matchdict', new={'uuid': person.uuid}):
view = self.make_view()
# just for coverage
get_row_grid_data.return_value = []
response = view.view()
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content_type, 'text/html')
# now with data...
get_row_grid_data.return_value = [user]
response = view.view()
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content_type, 'text/html')
# then once more as 'partial' - aka. data only
with patch.dict(self.request.GET, {'partial': 1}):
response = view.view()
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content_type, 'application/json')
# redirects when view is reset
with patch.dict(self.request.GET, {'reset-view': '1', 'hash': 'foo'}):
# nb. mock current route
with patch.object(self.request, 'current_route_url'):
response = view.view()
self.assertEqual(response.status_code, 302)
def test_edit(self):
self.pyramid_config.include('wuttaweb.views.common')
self.pyramid_config.include('wuttaweb.views.auth')
@ -1501,3 +1558,103 @@ class TestMasterView(WebTestCase):
# should now have 0 settings
count = self.session.query(model.Setting).count()
self.assertEqual(count, 0)
##############################
# row methods
##############################
def test_collect_row_labels(self):
# default labels
view = self.make_view()
labels = view.collect_row_labels()
self.assertEqual(labels, {})
# labels come from all classes; subclass wins
with patch.object(View, 'row_labels', create=True, new={'foo': "Foo", 'bar': "Bar"}):
with patch.object(mod.MasterView, 'row_labels', create=True, new={'foo': "FOO FIGHTERS"}):
view = self.make_view()
labels = view.collect_row_labels()
self.assertEqual(labels, {'foo': "FOO FIGHTERS", 'bar': "Bar"})
def test_set_row_labels(self):
model = self.app.model
person = model.Person(full_name="Fred Flintstone")
self.session.add(person)
with patch.multiple(mod.MasterView, create=True,
model_class=model.Person,
has_rows=True,
row_model_class=model.User):
# no labels by default
view = self.make_view()
grid = view.make_row_model_grid(person, key='person.users', data=[])
view.set_row_labels(grid)
self.assertEqual(grid.labels, {})
# labels come from all classes; subclass wins
with patch.object(View, 'row_labels', create=True, new={'username': "USERNAME"}):
with patch.object(mod.MasterView, 'row_labels', create=True, new={'username': "UserName"}):
view = self.make_view()
grid = view.make_row_model_grid(person, key='person.users', data=[])
view.set_row_labels(grid)
self.assertEqual(grid.labels, {'username': "UserName"})
def test_get_row_grid_data(self):
model = self.app.model
person = model.Person(full_name="Fred Flintstone")
self.session.add(person)
view = self.make_view()
self.assertRaises(NotImplementedError, view.get_row_grid_data, person)
def test_get_row_grid_columns(self):
# no default
view = self.make_view()
self.assertIsNone(view.get_row_grid_columns())
# class may specify
with patch.object(view, 'row_grid_columns', create=True, new=['foo', 'bar']):
self.assertEqual(view.get_row_grid_columns(), ['foo', 'bar'])
def test_get_row_grid_key(self):
view = self.make_view()
with patch.multiple(mod.MasterView, create=True,
model_key='id',
grid_key='widgets'):
self.request.matchdict = {'id': 42}
self.assertEqual(view.get_row_grid_key(), 'widgets.42')
def test_make_row_model_grid(self):
model = self.app.model
person = model.Person(full_name="Barney Rubble")
self.session.add(person)
self.session.commit()
self.request.matchdict = {'uuid': person.uuid}
with patch.multiple(mod.MasterView, create=True,
model_class=model.Person):
view = self.make_view()
# specify data
grid = view.make_row_model_grid(person, data=[])
self.assertIsNone(grid.model_class)
self.assertEqual(grid.data, [])
# fetch data
with patch.object(view, 'get_row_grid_data', return_value=[]):
grid = view.make_row_model_grid(person)
self.assertIsNone(grid.model_class)
self.assertEqual(grid.data, [])
def test_get_rows_title(self):
view = self.make_view()
# no default
self.assertIsNone(view.get_rows_title())
# class may specify
with patch.object(view, 'rows_title', create=True, new="Mock Rows"):
self.assertEqual(view.get_rows_title(), "Mock Rows")