Skip to content
This repository has been archived by the owner on Apr 11, 2024. It is now read-only.

has_permission fails when using DjangoRequestGroupFormatter #2

Open
sbuss opened this issue Feb 5, 2016 · 1 comment
Open

has_permission fails when using DjangoRequestGroupFormatter #2

sbuss opened this issue Feb 5, 2016 · 1 comment

Comments

@sbuss
Copy link

sbuss commented Feb 5, 2016

(copied from internal github, original issue opened by alejandro)

baya.utils.has_permission fails with the following error messages when view function (param fn) is wrapped like so: requires(DynamicRolesNode(DjangoRequestGroupFormatter('%s', 'name'))

Traceback (most recent call last):
  File "/Users/alejandro/Projects/baya/baya/tests/test_group_formatter.py", line 16, in test_has_permission_url_param
    perm = has_permission(view_func, AnonymousUser(), 'any')
  File "/Users/alejandro/Projects/baya/baya/utils.py", line 60, in has_permission
    if check_perm(user):
  File "/Users/alejandro/Projects/baya/baya/permissions.py", line 106, in user_has_any_permission
    return (self.user_has_get_permission(user) or
  File "/Users/alejandro/Projects/baya/baya/permissions.py", line 93, in user_has_get_permission
    return self._has_permission(user, self.get_requires)
  File "/Users/alejandro/Projects/baya/baya/permissions.py", line 87, in _has_permission
    return user_in_group(user, membership_node, request=request)
  File "/Users/alejandro/Projects/baya/baya/utils.py", line 26, in user_in_group
    return PermissionChecker(user_groups).visit(group, **kwargs)
  File "/Users/alejandro/Projects/baya/baya/visitors.py", line 27, in visit
    return self._visit_roles_node(node, **kwargs)
  File "/Users/alejandro/Projects/baya/baya/visitors.py", line 182, in _visit_roles_node
    return roles_node.get_roles_set(**kwargs) <= self._roles_set
  File "/Users/alejandro/Projects/baya/baya/membership.py", line 142, in get_roles_set
    result = _callable(**kwargs)
  File "/Users/alejandro/Projects/baya/baya/dynamic_roles.py", line 63, in __call__
    url_kwargs = request.resolver_match.kwargs
AttributeError: 'NoneType' object has no attribute 'resolver_match'

To recreate this, checkout branch has_permission_breaks_drgf and run make test.

I discovered this when I was more thoroughly testing the new templatetag can_user_perform_action.

Why is this happening?

DynamicRolesNode stores callables that return sets of groups that are called runtime when permission checking occurs. When that callable is a DjangoRequestGroupFormatter, problems occur because there is no request object to grab kwargs from for formatting the groups to return.

How to fix?

Probably make the DjangoRequestGroupFormatter not dependent on the request object to do the url parsing for it. There's got to be another way to pull out the kwargs and params of a url without doing it through a request.

I'll be trying to figure out how to solve this the has_permission_breaks_drgf branch if the above solution sounds right.

Scratch that. I'm not sure how to fix this...

@sbuss
Copy link
Author

sbuss commented Feb 5, 2016

My first guess is that the formatter needs the request object, but it isn't being passed in. (But I haven't yet had time to investigate)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant