Skip to content

Instantly share code, notes, and snippets.

@UtkucanBykl
Last active August 21, 2019 09:07
Show Gist options
  • Save UtkucanBykl/02ebff98936a2c136060c0a3111f920b to your computer and use it in GitHub Desktop.
Save UtkucanBykl/02ebff98936a2c136060c0a3111f920b to your computer and use it in GitHub Desktop.
Permission control for query parameters
from django.contrib.auth.mixins import AccessMixin
from django.core.exceptions import ImproperlyConfigured
__all__ = ['QueryParamsPermissionRequiredMixin']
class QueryParamsPermissionRequiredMixin(AccessMixin):
permission_required = None
def get_permission_required(self):
"""
Override this method to override the permission_required attribute.
Must return an iterable.
"""
if self.permission_required is None:
raise ImproperlyConfigured(
'{0} is missing the permission_required attribute. Define {0}.permission_required, or override '
'{0}.get_permission_required().'.format(self.__class__.__name__)
)
if isinstance(self.permission_required, str):
perms = (self.permission_required,)
else:
perms = self.permission_required
return perms
def has_permmission(self):
for permission in self.get_permission_required():
if isinstance(permission, tuple) or isinstance(permission, list):
if str(permission[0]) in self.request.GET.keys():
yield self.request.user.has_perm(permission[1])
else:
yield self.request.user.has_perm(permission)
return True
def dispatch(self, request, *args, **kwargs):
if not all(self.has_permmission()):
return self.handle_no_permission()
return super().dispatch(request, *args, **kwargs)
## Usage
from .mixins import QueryParamsPermissionRequiredMixin
class YourAwesomeView(QueryParamsPermissionRequiredMixin, TemplateView):
permission_required = (
('query_parameter', 'need_permission'),
'if_you_want_use_permission_for_all_view',
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment