Cache StoredPermissions objects and permission holders, change list comprehension to generator
This commit is contained in:
@@ -76,6 +76,8 @@ class PermissionManager(object):
|
||||
|
||||
|
||||
class Permission(object):
|
||||
_stored_permissions_cache = {}
|
||||
|
||||
DoesNotExist = PermissionDoesNotExists
|
||||
|
||||
def __init__(self, namespace, name, label):
|
||||
@@ -99,14 +101,18 @@ class Permission(object):
|
||||
return self.get_stored_permission()
|
||||
|
||||
def get_stored_permission(self):
|
||||
stored_permission, created = StoredPermission.objects.get_or_create(
|
||||
namespace=self.namespace.name,
|
||||
name=self.name,
|
||||
)
|
||||
stored_permission.label = self.label
|
||||
stored_permission.save()
|
||||
stored_permission.volatile_permission = self
|
||||
return stored_permission
|
||||
try:
|
||||
return self.__class__._stored_permissions_cache[self]
|
||||
except KeyError:
|
||||
stored_permission, created = StoredPermission.objects.get_or_create(
|
||||
namespace=self.namespace.name,
|
||||
name=self.name,
|
||||
)
|
||||
stored_permission.label = self.label
|
||||
stored_permission.save()
|
||||
stored_permission.volatile_permission = self
|
||||
self.__class__._stored_permissions_cache[self] = stored_permission
|
||||
return stored_permission
|
||||
|
||||
def requester_has_this(self, requester):
|
||||
stored_permission = self.get_stored_permission()
|
||||
@@ -120,6 +126,8 @@ Permission._default_manager = Permission.objects
|
||||
|
||||
|
||||
class StoredPermission(models.Model):
|
||||
_holders_cache = {}
|
||||
|
||||
namespace = models.CharField(max_length=64, verbose_name=_(u'namespace'))
|
||||
name = models.CharField(max_length=64, verbose_name=_(u'name'))
|
||||
|
||||
@@ -139,7 +147,13 @@ class StoredPermission(models.Model):
|
||||
return unicode(getattr(self, 'volatile_permission', self.name))
|
||||
|
||||
def get_holders(self):
|
||||
return [holder.holder_object for holder in self.permissionholder_set.all()]
|
||||
self.__class__._holders_cache.setdefault(self, None)
|
||||
if self.__class__._holders_cache[self] is not None:
|
||||
return self.__class__._holders_cache[self]
|
||||
else:
|
||||
holders = [holder.holder_object for holder in self.permissionholder_set.all()]
|
||||
self.__class__._holders_cache[self] = holders
|
||||
return holders
|
||||
|
||||
def requester_has_this(self, actor):
|
||||
actor = AnonymousUserSingleton.objects.passthru_check(actor)
|
||||
@@ -171,6 +185,8 @@ class StoredPermission(models.Model):
|
||||
def grant_to(self, actor):
|
||||
actor = AnonymousUserSingleton.objects.passthru_check(actor)
|
||||
permission_holder, created = PermissionHolder.objects.get_or_create(permission=self, holder_type=ContentType.objects.get_for_model(actor), holder_id=actor.pk)
|
||||
if created:
|
||||
self.__class__._holders_cache[self] = None
|
||||
return created
|
||||
|
||||
def revoke_from(self, actor):
|
||||
@@ -178,9 +194,11 @@ class StoredPermission(models.Model):
|
||||
try:
|
||||
permission_holder = PermissionHolder.objects.get(permission=self, holder_type=ContentType.objects.get_for_model(actor), holder_id=actor.pk)
|
||||
permission_holder.delete()
|
||||
return True
|
||||
except PermissionHolder.DoesNotExist:
|
||||
return False
|
||||
else:
|
||||
self.__class__._holders_cache[self] = None
|
||||
return True
|
||||
|
||||
|
||||
class PermissionHolder(models.Model):
|
||||
@@ -232,7 +250,7 @@ class Role(models.Model):
|
||||
|
||||
def members(self, filter_dict=None):
|
||||
filter_dict = filter_dict or {}
|
||||
return [member.member_object for member in self.rolemember_set.filter(**filter_dict)]
|
||||
return (member.member_object for member in self.rolemember_set.filter(**filter_dict))
|
||||
|
||||
|
||||
class RoleMember(models.Model):
|
||||
|
||||
Reference in New Issue
Block a user