diff --git a/.pylintrc b/.pylintrc index f30402b..66b3c38 100644 --- a/.pylintrc +++ b/.pylintrc @@ -36,5 +36,3 @@ disable=fixme, ungrouped-imports, unidiomatic-typecheck, unnecessary-comprehension, - unnecessary-lambda, - unnecessary-lambda-assignment, diff --git a/src/wuttaweb/forms/widgets.py b/src/wuttaweb/forms/widgets.py index a09edd0..108572f 100644 --- a/src/wuttaweb/forms/widgets.py +++ b/src/wuttaweb/forms/widgets.py @@ -438,7 +438,9 @@ class RoleRefsWidget(WuttaCheckboxChoiceWidget): kw["roles"] = roles # url - url = lambda role: self.request.route_url("roles.view", uuid=role.uuid) + def url(role): + return self.request.route_url("roles.view", uuid=role.uuid) + kw["url"] = url # default logic from here diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index be97756..fb764c9 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -1058,13 +1058,27 @@ class Grid: # pylint: disable=too-many-instance-attributes # TODO: may need this for String etc. as well? if isinstance(model_property.type, sa.Text): if foldcase: - kfunc = lambda obj: (obj[key] or "").lower() + + def kfunc_folded(obj): + return (obj[key] or "").lower() + + kfunc = kfunc_folded + else: - kfunc = lambda obj: obj[key] or "" + + def kfunc_standard(obj): + return obj[key] or "" + + kfunc = kfunc_standard + if not kfunc: # nb. sorting with this can raise error if data # contains varying types, e.g. str and None - kfunc = lambda obj: obj[key] + + def kfunc_fallback(obj): + return obj[key] + + kfunc = kfunc_fallback # then sort the data and return return sorted(data, key=kfunc, reverse=direction == "desc") @@ -1738,7 +1752,7 @@ class Grid: # pylint: disable=too-many-instance-attributes raise ValueError(f"invalid dest identifier: {dest}") # func to save a setting value to user session - def persist(key, value=lambda k: settings.get(k)): + def persist(key, value=settings.get): assert dest == "session" skey = f"grid.{self.key}.{key}" self.request.session[skey] = value(key) diff --git a/src/wuttaweb/views/essential.py b/src/wuttaweb/views/essential.py index a35b07d..b46a658 100644 --- a/src/wuttaweb/views/essential.py +++ b/src/wuttaweb/views/essential.py @@ -42,7 +42,9 @@ That will in turn include the following modules: def defaults(config, **kwargs): - mod = lambda spec: kwargs.get(spec, spec) + + def mod(spec): + return kwargs.get(spec, spec) config.include(mod("wuttaweb.views.common")) config.include(mod("wuttaweb.views.auth")) diff --git a/src/wuttaweb/views/people.py b/src/wuttaweb/views/people.py index f9de00e..d8cc189 100644 --- a/src/wuttaweb/views/people.py +++ b/src/wuttaweb/views/people.py @@ -119,13 +119,19 @@ class PersonView(MasterView): ) 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) + + def view_url(user, i): # pylint: disable=unused-argument + return self.request.route_url("users.view", uuid=user.uuid) + + grid.add_action("view", icon="eye", url=view_url) 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) + + def edit_url(user, i): # pylint: disable=unused-argument + return self.request.route_url("users.edit", uuid=user.uuid) + + grid.add_action("edit", url=edit_url) return grid diff --git a/src/wuttaweb/views/roles.py b/src/wuttaweb/views/roles.py index 2d19ef1..62d2dd0 100644 --- a/src/wuttaweb/views/roles.py +++ b/src/wuttaweb/views/roles.py @@ -160,14 +160,20 @@ class RoleView(MasterView): ) 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) + + def view_url(user, i): # pylint: disable=unused-argument + return self.request.route_url("users.view", uuid=user.uuid) + + grid.add_action("view", icon="eye", url=view_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) + + def edit_url(user, i): # pylint: disable=unused-argument + return self.request.route_url("users.edit", uuid=user.uuid) + + grid.add_action("edit", url=edit_url) return grid diff --git a/tests/views/test_people.py b/tests/views/test_people.py index eed285a..5167534 100644 --- a/tests/views/test_people.py +++ b/tests/views/test_people.py @@ -54,9 +54,15 @@ class TestPersonView(WebTestCase): self.assertIsInstance(form.widgets["users"], GridWidget) def test_make_users_grid(self): + self.pyramid_config.add_route("users.view", "/users/{uuid}/view") + self.pyramid_config.add_route("users.edit", "/users/{uuid}/edit") model = self.app.model view = self.make_view() person = model.Person(full_name="John Doe") + self.session.add(person) + user = model.User(username="john", person=person) + self.session.add(user) + self.session.commit() # basic grid = view.make_users_grid(person) @@ -73,6 +79,9 @@ class TestPersonView(WebTestCase): self.assertEqual(grid.actions[0].key, "view") self.assertEqual(grid.actions[1].key, "edit") + # render grid to ensure coverage for link urls + grid.render_vue_template() + def test_objectify(self): model = self.app.model view = self.make_view() diff --git a/tests/views/test_roles.py b/tests/views/test_roles.py index d023043..0eef4d2 100644 --- a/tests/views/test_roles.py +++ b/tests/views/test_roles.py @@ -95,9 +95,16 @@ class TestRoleView(WebTestCase): self.assertIsNotNone(form.validators["name"]) def test_make_users_grid(self): + self.pyramid_config.add_route("users.view", "/users/{uuid}/view") + self.pyramid_config.add_route("users.edit", "/users/{uuid}/edit") model = self.app.model view = self.make_view() role = model.Role(name="Manager") + self.session.add(role) + user = model.User(username="freddie") + user.roles.append(role) + self.session.add(user) + self.session.commit() # basic grid = view.make_users_grid(role) @@ -115,6 +122,9 @@ class TestRoleView(WebTestCase): self.assertEqual(grid.actions[0].key, "view") self.assertEqual(grid.actions[1].key, "edit") + # render grid to ensure coverage for link urls + grid.render_vue_template() + def test_unique_name(self): model = self.app.model view = self.make_view()