diff --git a/apps/permissions/managers.py b/apps/permissions/managers.py index b009bc7a2f..7c82a562a2 100644 --- a/apps/permissions/managers.py +++ b/apps/permissions/managers.py @@ -16,9 +16,17 @@ logger = logging.getLogger(__name__) class RoleMemberManager(models.Manager): def get_roles_for_member(self, member_obj): - member_obj = AnonymousUserSingleton.objects.passthru_check(member_obj) - member_type = ContentType.objects.get_for_model(member_obj) - return (role_member.role for role_member in self.model.objects.filter(member_type=member_type, member_id=member_obj.pk)) + """ + Return the roles to which a member_obj belongs to. + """ + try: + return self.model._member_roles_cache[member_obj] + except KeyError: + member_obj = AnonymousUserSingleton.objects.passthru_check(member_obj) + member_type = ContentType.objects.get_for_model(member_obj) + roles = [role_member.role for role_member in self.model.objects.filter(member_type=member_type, member_id=member_obj.pk)] + self.model._member_roles_cache[member_obj] = roles + return roles class StoredPermissionManager(models.Manager): diff --git a/apps/permissions/models.py b/apps/permissions/models.py index b989d83e42..1a5361df07 100644 --- a/apps/permissions/models.py +++ b/apps/permissions/models.py @@ -108,8 +108,6 @@ class Permission(object): 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 @@ -241,12 +239,15 @@ class Role(models.Model): member_id=member.pk) if not created: raise Exception('Unable to add member to role') + else: + RoleMember._member_roles_cache = None def remove_member(self, member): member = AnonymousUserSingleton.objects.passthru_check(member) member_type=ContentType.objects.get_for_model(member) role_member = RoleMember.objects.get(role=self, member_type=member_type, member_id=member.pk) role_member.delete() + RoleMember._member_roles_cache = None def members(self, filter_dict=None): filter_dict = filter_dict or {} @@ -254,6 +255,8 @@ class Role(models.Model): class RoleMember(models.Model): + _member_roles_cache = {} + role = models.ForeignKey(Role, verbose_name=_(u'role')) member_type = models.ForeignKey(ContentType, related_name='role_member',