From 90e48ec6a8604065fd309cba480b348c0d756feb Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 12 Oct 2012 04:36:05 -0400 Subject: [PATCH] Cache StoredPermissions objects and permission holders, change list comprehension to generator --- apps/permissions/models.py | 40 +++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/permissions/models.py b/apps/permissions/models.py index ff7dfd957f..b989d83e42 100644 --- a/apps/permissions/models.py +++ b/apps/permissions/models.py @@ -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):