parent
8dd14376f7
commit
94fb931723
2 changed files with 43 additions and 0 deletions
@ -0,0 +1,43 @@ |
||||
from rest_framework import viewsets |
||||
from rest_framework.response import Response |
||||
|
||||
# https://gist.github.com/ivlevdenis/a0c8f5b472b6b8550bbb016c6a30e0be |
||||
|
||||
|
||||
class ExtendViewSet(object): |
||||
""" |
||||
This viewset mixin class with extended options list. |
||||
""" |
||||
permission_map = {} |
||||
throttle_scope_map = {} |
||||
serializer_class_map = {} |
||||
|
||||
def get_serializer_class(self): |
||||
ser = self.serializer_class_map.get(self.action, None) |
||||
self.serializer_class = ser or self.serializer_class |
||||
return super().get_serializer_class() |
||||
|
||||
def initialize_request(self, request, *args, **kwargs): |
||||
request = super().initialize_request(request, *args, **kwargs) |
||||
throttle_scope = self.throttle_scope_map.get(self.action, None) |
||||
cls_throttle_scope = getattr(self, 'throttle_scope', None) |
||||
self.throttle_scope = throttle_scope or cls_throttle_scope or '' |
||||
return request |
||||
|
||||
def get_permissions(self): |
||||
perms = self.permission_map.get(self.action, None) |
||||
if perms and not isinstance(perms, (tuple, list)): |
||||
perms = [perms, ] |
||||
self.permission_classes = perms or self.permission_classes |
||||
return super().get_permissions() |
||||
|
||||
def options(self, request, *args, **kwargs): |
||||
if self.metadata_class is None: |
||||
return self.http_method_not_allowed(request, *args, **kwargs) |
||||
data = self.metadata_class().determine_metadata(request, self) |
||||
data['actions']['GET'] = self.query_metadata |
||||
return Response(data, status=status.HTTP_200_OK) |
||||
|
||||
|
||||
class ExtendedModelViewSet(ExtendViewSet, viewsets.ModelViewSet): |
||||
pass |
||||
Loading…
Reference in new issue