Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: added message for PermissionRequiredMixin #731

Open
wants to merge 1 commit into
base: devel
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,4 @@ Authors ordered by first contribution
- Davis Raymond Muro <davisraymondmuro@gmail.com>
- Richard de Wit <henk.exe@gmail.com>
- Pedro Rojas Gavidia <pedrorojas.gavidia@gmail.com> @pedrorojasg
- Rainshaw Gao <rxg@live.com>
14 changes: 13 additions & 1 deletion guardian/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ class SecureView(PermissionRequiredMixin, View):
`permission_required` - the permission to check of form "<app_label>.<permission codename>"
i.e. 'polls.can_vote' for a permission on a model in the polls application.

``PermissionRequiredMixin.permission_denied_message``
*Default*: ``''``. A string to pass to the ``PermisssionDenied`` exception.
Will be available in the 403 template context as ``exception``.

``PermissionRequiredMixin.accept_global_perms``

*Default*: ``False``, If accept_global_perms would be set to True, then
Expand All @@ -138,9 +142,16 @@ class SecureView(PermissionRequiredMixin, View):
return_403 = False
return_404 = False
raise_exception = False
object_permission_denied_message = ''
accept_global_perms = False
any_perm = False

def get_object_permission_denied_message(self):
"""
Override this method to override the object_permission_denied_message attribute.
"""
return self.object_permission_denied_message

def get_required_permissions(self, request=None):
"""
Returns list of permissions in format *<app_label>.<codename>* that
Expand Down Expand Up @@ -183,13 +194,14 @@ def check_permissions(self, request):
redirect_field_name=self.redirect_field_name,
return_403=self.return_403,
return_404=self.return_404,
permission_denied_message=self.get_object_permission_denied_message(),
accept_global_perms=self.accept_global_perms,
any_perm=self.any_perm,
)
if forbidden:
self.on_permission_check_fail(request, forbidden, obj=obj)
if forbidden and self.raise_exception:
raise PermissionDenied()
raise PermissionDenied(self.get_object_permission_denied_message())
return forbidden

def on_permission_check_fail(self, request, response, obj=None):
Expand Down
9 changes: 5 additions & 4 deletions guardian/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ def get_identity(identity):

def get_40x_or_None(request, perms, obj=None, login_url=None,
redirect_field_name=None, return_403=False,
return_404=False, accept_global_perms=False,
any_perm=False):
return_404=False, permission_denied_message='',
accept_global_perms=False, any_perm=False):
login_url = login_url or settings.LOGIN_URL
redirect_field_name = redirect_field_name or REDIRECT_FIELD_NAME

Expand All @@ -117,11 +117,12 @@ def get_40x_or_None(request, perms, obj=None, login_url=None,
if not has_permissions:
if return_403:
if guardian_settings.RENDER_403:
response = render(request, guardian_settings.TEMPLATE_403)
response = render(request, guardian_settings.TEMPLATE_403,
context={'exception': permission_denied_message})
response.status_code = 403
return response
elif guardian_settings.RAISE_403:
raise PermissionDenied
raise PermissionDenied(permission_denied_message)
return HttpResponseForbidden()
if return_404:
if guardian_settings.RENDER_404:
Expand Down