Skip to content

Commit

Permalink
Handle ValueError raised in get_privileges
Browse files Browse the repository at this point in the history
Django 4 raises a ValueError when attempting to read a fk relationship
on an unsaved model, rather than return an empty list.
  • Loading branch information
gherceg committed Nov 18, 2023
1 parent 3f7105b commit 9c0f277
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
8 changes: 6 additions & 2 deletions django_prbac/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,12 @@ def get_privileges(self, assignment):
return self._granted_privileges
except AttributeError:
pass
return [membership.instantiated_to_role(assignment)
for membership in self.memberships_granted.all()]
try:
return [membership.instantiated_to_role(assignment)
for membership in self.memberships_granted.all()]
except ValueError:
# Django 4 raises ValueError if fk relationship is accessed prior to save
return []

def instantiate(self, assignment):
"""
Expand Down
10 changes: 2 additions & 8 deletions django_prbac/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,10 @@ def test_has_permission_immediate_params(self):
self.assertFalse(subrole.instantiate({}).has_privilege(superrole1.instantiate(dict(one='baz'))))

def test_unsaved_role_does_not_have_permission(self):
import django
role1 = Role()
role2 = arbitrary.role()
if django.VERSION >= (4, 0):
with self.assertRaises(ValueError):
self.assertFalse(role1.has_privilege(role2))
self.assertFalse(role2.has_privilege(role1))
else:
self.assertFalse(role1.has_privilege(role2))
self.assertFalse(role2.has_privilege(role1))
self.assertFalse(role1.has_privilege(role2))
self.assertFalse(role2.has_privilege(role1))


class TestGrant(TestCase):
Expand Down

0 comments on commit 9c0f277

Please sign in to comment.