From 194d798c0c9242114a94563bd1a9e021b0325677 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 24 Jan 2025 19:00:46 -0600 Subject: [PATCH] fix: add `make_users_grid()` method for RoleView per newer convention --- src/wuttaweb/views/roles.py | 39 +++++++++++++++++++++++++++++++++---- tests/views/test_roles.py | 22 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/wuttaweb/views/roles.py b/src/wuttaweb/views/roles.py index a93bf9e..4bada03 100644 --- a/src/wuttaweb/views/roles.py +++ b/src/wuttaweb/views/roles.py @@ -28,7 +28,7 @@ from wuttjamaican.db.model import Role, Permission from wuttaweb.views import MasterView from wuttaweb.db import Session from wuttaweb.forms import widgets -from wuttaweb.forms.schema import UserRefs, Permissions, RoleRef +from wuttaweb.forms.schema import Permissions, RoleRef class RoleView(MasterView): @@ -123,9 +123,7 @@ class RoleView(MasterView): # users if not (self.creating or self.editing): f.append('users') - f.set_readonly('users') - f.set_node('users', UserRefs(self.request)) - f.set_default('users', [u.uuid for u in role.users]) + f.set_grid('users', self.make_users_grid(role)) # permissions f.append('permissions') @@ -134,6 +132,39 @@ class RoleView(MasterView): if not self.creating: f.set_default('permissions', list(role.permissions)) + def make_users_grid(self, role): + """ + Make and return the grid for the Users field. + + This grid is shown for the Users field when viewing a Role. + + :returns: Fully configured :class:`~wuttaweb.grids.base.Grid` + instance. + """ + model = self.app.model + route_prefix = self.get_route_prefix() + + grid = self.make_grid(key=f'{route_prefix}.view.users', + model_class=model.User, + data=role.users, + columns=[ + 'username', + 'person', + 'active', + ]) + + if self.request.has_perm('users.view'): + url = lambda user, i: self.request.route_url('users.view', uuid=user.uuid) + grid.add_action('view', icon='eye', url=url) + grid.set_link('person') + grid.set_link('username') + + if self.request.has_perm('users.edit'): + url = lambda user, i: self.request.route_url('users.edit', uuid=user.uuid) + grid.add_action('edit', url=url) + + return grid + def unique_name(self, node, value): """ """ model = self.app.model diff --git a/tests/views/test_roles.py b/tests/views/test_roles.py index 909739e..24b68dd 100644 --- a/tests/views/test_roles.py +++ b/tests/views/test_roles.py @@ -7,6 +7,7 @@ from sqlalchemy import orm import colander from wuttaweb.views import roles as mod +from wuttaweb.grids import Grid from wuttaweb.forms.schema import RoleRef from wuttaweb.testing import WebTestCase @@ -93,6 +94,27 @@ class TestRoleView(WebTestCase): view.configure_form(form) self.assertIsNotNone(form.validators['name']) + def test_make_users_grid(self): + model = self.app.model + view = self.make_view() + role = model.Role(name="Manager") + + # basic + grid = view.make_users_grid(role) + self.assertIsInstance(grid, Grid) + self.assertFalse(grid.linked_columns) + self.assertFalse(grid.actions) + + # view + edit actions + with patch.object(self.request, 'is_root', new=True): + grid = view.make_users_grid(role) + self.assertIsInstance(grid, Grid) + self.assertIn('person', grid.linked_columns) + self.assertIn('username', grid.linked_columns) + self.assertEqual(len(grid.actions), 2) + self.assertEqual(grid.actions[0].key, 'view') + self.assertEqual(grid.actions[1].key, 'edit') + def test_unique_name(self): model = self.app.model view = self.make_view()