Skip to content

Instantly share code, notes, and snippets.

@gtindo
Created December 16, 2020 19:08
Show Gist options
  • Save gtindo/0f7b45cc7e9ded61d743fec2d5095eac to your computer and use it in GitHub Desktop.
Save gtindo/0f7b45cc7e9ded61d743fec2d5095eac to your computer and use it in GitHub Desktop.
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser
from blog.models import Post
from blog.serializers import PostSerializer
class CustomModelViewset(viewsets.ModelViewSet):
"""
A class that inherits from ModelViewset and allow to add custom permissions on your views
without redefine methods
"""
default_permission = IsAuthenticated
list_permissions = [default_permission]
create_permissions = [default_permission]
retrieve_permissions = [default_permission]
update_permissions = [default_permission]
destroy_permissions = [default_permission]
def get_permissions(self):
permissions = {
"list": [permission() for permission in self.list_permissions],
"create": [permission() for permission in self.create_permissions],
"retrieve": [permission() for permission in self.retrieve_permissions],
"update": [permission() for permission in self.update_permissions],
"partial_update": [permission() for permission in self.update_permissions],
"destroy": [permission() for permission in self.destroy_permissions]
}
try:
return permissions[self.action]
except KeyError:
return [permission() for permission in self.permission_classes]
# Usage
class PostViewset(CustomModelViewset):
# define serializer and queryset
serializer_class = PostSerializer
queryset = Post.objects.all()
# define permissions for each method of viewset
list_perimissions = [AllowAny]
retrieve_permissions= [AllowAny]
create_permissions = [IsAdminUser]
delete_permissions = [IsAdminUser]
update_permissions = [IsAdminUser]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment