Cache StoredPermissions objects and permission holders, change list comprehension to generator

This commit is contained in:
Roberto Rosario
2012-10-12 04:36:05 -04:00
parent 32959762cc
commit 90e48ec6a8

View File

@@ -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):