Browse Source

fix: correct behavior of PermissionValue for new enums

pull/144/head
Andrei 6 years ago
parent
commit
f3e36be931
No known key found for this signature in database GPG Key ID: 4D2A02C7D500E9D9
  1. 21
      disco/types/permissions.py
  2. 28
      tests/types/permissions.py

21
disco/types/permissions.py

@ -32,16 +32,14 @@ class Permissions(object):
@classmethod
def keys(cls):
for k, v in six.iteritems(cls.__dict__):
yield k
if k.isupper():
yield k
class PermissionValue(object):
__slots__ = ['value']
def __init__(self, value=0):
if isinstance(value, PermissionValue):
value = value.value
self.value = value
def can(self, *perms):
@ -79,19 +77,22 @@ class PermissionValue(object):
return self.sub(other)
def __getattribute__(self, name):
if name in list(Permissions.keys()):
return (self.value & Permissions[name].value) == Permissions[name].value
else:
try:
perm_value = getattr(Permissions, name.upper())
return (self.value & perm_value) == perm_value
except AttributeError:
return object.__getattribute__(self, name)
def __setattr__(self, name, value):
if name not in list(Permissions.keys()):
try:
perm_value = getattr(Permissions, name.upper())
except AttributeError:
return super(PermissionValue, self).__setattr__(name, value)
if value:
self.value |= Permissions[name].value
self.value |= perm_value
else:
self.value &= ~Permissions[name].value
self.value &= ~perm_value
def __int__(self):
return self.value

28
tests/types/permissions.py

@ -0,0 +1,28 @@
from disco.types.permissions import Permissions, PermissionValue
def test_permission_value_can():
admin_perms = PermissionValue(
Permissions.ADMINISTRATOR
)
assert admin_perms.administrator
# Admin can do everything
for key in Permissions.keys():
assert admin_perms.can(getattr(Permissions, key))
manage_channels_perms = PermissionValue(
Permissions.MANAGE_CHANNELS,
)
assert not manage_channels_perms.administrator
assert manage_channels_perms.manage_channels
def test_permission_value_mutation():
no_perms = PermissionValue()
assert not no_perms.can(Permissions.SEND_MESSAGES)
no_perms.send_messages = True
assert no_perms.can(Permissions.SEND_MESSAGES)
Loading…
Cancel
Save