Add anonymous user support to the permission app

This commit is contained in:
Roberto Rosario
2012-01-08 04:57:54 -04:00
parent 7fd83ddf0b
commit c3175c7ea4
2 changed files with 13 additions and 3 deletions

View File

@@ -17,7 +17,6 @@ logger = logging.getLogger(__name__)
class RoleMemberManager(models.Manager): class RoleMemberManager(models.Manager):
def get_roles_for_member(self, member_obj): def get_roles_for_member(self, member_obj):
member_obj = AnonymousUserSingleton.objects.passthru_check(member_obj) member_obj = AnonymousUserSingleton.objects.passthru_check(member_obj)
member_type = ContentType.objects.get_for_model(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 [role_member.role for role_member in self.model.objects.filter(member_type=member_type, member_id=member_obj.pk)]

View File

@@ -10,6 +10,8 @@ from django.contrib.contenttypes import generic
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from common.models import AnonymousUserSingleton
from .managers import (RoleMemberManager, StoredPermissionManager) from .managers import (RoleMemberManager, StoredPermissionManager)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -44,6 +46,8 @@ class PermissionManager(object):
if permission.requester_has_this(requester): if permission.requester_has_this(requester):
return True return True
logger.debug('no permission')
raise PermissionDenied(ugettext(u'Insufficient permissions.')) raise PermissionDenied(ugettext(u'Insufficient permissions.'))
@classmethod @classmethod
@@ -105,8 +109,7 @@ class Permission(object):
return stored_permission return stored_permission
def requester_has_this(self, requester): def requester_has_this(self, requester):
stored_permission = self.get_stored_permission( stored_permission = self.get_stored_permission()
)
return stored_permission.requester_has_this(requester) return stored_permission.requester_has_this(requester)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@@ -139,6 +142,8 @@ class StoredPermission(models.Model):
return [holder.holder_object for holder in self.permissionholder_set.all()] return [holder.holder_object for holder in self.permissionholder_set.all()]
def requester_has_this(self, requester): def requester_has_this(self, requester):
requester = AnonymousUserSingleton.objects.passthru_check(requester)
logger.debug('requester: %s' % requester)
if isinstance(requester, User): if isinstance(requester, User):
if requester.is_superuser or requester.is_staff: if requester.is_superuser or requester.is_staff:
return True return True
@@ -160,11 +165,16 @@ class StoredPermission(models.Model):
if self.requester_has_this(membership): if self.requester_has_this(membership):
return True return True
logger.debug('Fallthru')
return False
def grant_to(self, requester): def grant_to(self, requester):
requester = AnonymousUserSingleton.objects.passthru_check(requester)
permission_holder, created = PermissionHolder.objects.get_or_create(permission=self, holder_type=ContentType.objects.get_for_model(requester), holder_id=requester.pk) permission_holder, created = PermissionHolder.objects.get_or_create(permission=self, holder_type=ContentType.objects.get_for_model(requester), holder_id=requester.pk)
return created return created
def revoke_from(self, holder): def revoke_from(self, holder):
requester = AnonymousUserSingleton.objects.passthru_check(requester)
try: try:
permission_holder = PermissionHolder.objects.get(permission=self, holder_type=ContentType.objects.get_for_model(holder), holder_id=holder.pk) permission_holder = PermissionHolder.objects.get(permission=self, holder_type=ContentType.objects.get_for_model(holder), holder_id=holder.pk)
permission_holder.delete() permission_holder.delete()
@@ -199,6 +209,7 @@ class Role(models.Model):
verbose_name_plural = _(u'roles') verbose_name_plural = _(u'roles')
def add_member(self, member): def add_member(self, member):
member = AnonymousUserSingleton.objects.passthru_check(member)
role_member, created = RoleMember.objects.get_or_create( role_member, created = RoleMember.objects.get_or_create(
role=self, role=self,
member_type=ContentType.objects.get_for_model(member), member_type=ContentType.objects.get_for_model(member),