From 9d61f50fe46ebd27c64bd7f24b3c595bef878bb4 Mon Sep 17 00:00:00 2001 From: Biyeun Buczyk Date: Fri, 14 Feb 2014 12:01:04 -0600 Subject: [PATCH] new decorator which raises Http404 when PermissionDenied is raised by the requires_privilege decorator --- django_prbac/decorators.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/django_prbac/decorators.py b/django_prbac/decorators.py index ba9fbcc..0c5414c 100644 --- a/django_prbac/decorators.py +++ b/django_prbac/decorators.py @@ -3,6 +3,7 @@ # Local Imports from django.http import Http404 +from django_prbac.exceptions import PermissionDenied from django_prbac.models import Role, UserRole @@ -18,29 +19,44 @@ def decorate(fn): def wrapped(request, *args, **kwargs): if not hasattr(request, 'role'): - raise Http404() + raise PermissionDenied() roles = Role.objects.filter(slug=slug) if not roles: - raise Http404() + raise PermissionDenied() privilege = roles[0].instantiate(assignment) if request.role.has_privilege(privilege): return fn(request, *args, **kwargs) if not hasattr(request, 'user'): - raise Http404() + raise PermissionDenied() try: request.user.prbac_role except UserRole.DoesNotExist: - raise Http404() + raise PermissionDenied() if not request.user.prbac_role.has_privilege(privilege): - raise Http404() + raise PermissionDenied() return fn(request, *args, **kwargs) return wrapped return decorate + + +def requires_privilege_raise404(slug, **assignment): + """ + A version of the requires_privilege decorator which raises an Http404 + if PermissionDenied is raised. + """ + def decorate(fn): + def wrapped(request, *args, **kwargs): + try: + return requires_privilege(slug, **assignment)(fn)(request, *args, **kwargs) + except PermissionDenied: + raise Http404() + return wrapped + return decorate