From d59608dd633cd9d2df04b78a1f44af4d5c86105a Mon Sep 17 00:00:00 2001 From: Rainshaw Date: Mon, 1 Mar 2021 16:07:26 +0800 Subject: [PATCH] feat: added message for PermissionRequiredMixin --- AUTHORS | 1 + guardian/mixins.py | 14 +++++++++++++- guardian/utils.py | 9 +++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 1e9cbe18..ae87f577 100644 --- a/AUTHORS +++ b/AUTHORS @@ -62,3 +62,4 @@ Authors ordered by first contribution - Davis Raymond Muro - Richard de Wit - Pedro Rojas Gavidia @pedrorojasg +- Rainshaw Gao diff --git a/guardian/mixins.py b/guardian/mixins.py index 57b61aed..5405a1bc 100644 --- a/guardian/mixins.py +++ b/guardian/mixins.py @@ -115,6 +115,10 @@ class SecureView(PermissionRequiredMixin, View): `permission_required` - the permission to check of form "." 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 @@ -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 *.* that @@ -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): diff --git a/guardian/utils.py b/guardian/utils.py index 85df4cd6..0da387c2 100644 --- a/guardian/utils.py +++ b/guardian/utils.py @@ -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 @@ -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: