Skip to content

Instantly share code, notes, and snippets.

@pleasedontbelong
Created August 12, 2015 08:55
Show Gist options
  • Save pleasedontbelong/fda347cbc8054f07e170 to your computer and use it in GitHub Desktop.
Save pleasedontbelong/fda347cbc8054f07e170 to your computer and use it in GitHub Desktop.
Example of views for rest swagger 2.0
# you must import it even if not used because the introspector of rest
# swagger will try to load the serializer class from the docstring
from user import serializers as user_serializers
class UserListCreateView(generics.ListCreateAPIView):
permission_classes = (IsAuthenticated,)
queryset = User.objects.all()
def get(self, request, *args, **kwargs):
"""
List of users
---
tags:
- User
operationId: listUsers
serializer: user_serializers.PaginatedUsersSerializer
"""
return super(UserListCreateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
"""
Create a new user
---
tags:
- User
operationId: createUser
serializer: user_serializers.CreateUserSerializer
"""
return super(UserListCreateView, self).post(request, *args, **kwargs)
def get_serializer_class(self, *args, **kwargs):
"""
Rest swagger wont pass any arguments to this method so he wont be
able to get the correct serializer. You'll need to use the docstrings
on the `get` and `post` methods
"""
if self.request.method == "POST":
return user_serializers.CreateUserSerializer
else:
return user_serializers.PaginatedUsersSerializer
class UserRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (IsAuthenticated,)
queryset = User.objects.all()
def get(self, request, *args, **kwargs):
"""
Retrieve a single user
---
tags:
- User
operationId: getUser
serializer: user_serializers.UserSerializer
"""
return super(UserListCreateView, self).get(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
"""
Update User
---
tags:
- User
operationId: updateUser
serializer: user_serializers.UpdateUserSerializer
"""
return super(UserListCreateView, self).put(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
"""
Delete one User
---
tags:
- User
operationId: deleteUser
"""
return super(UserListCreateView, self).delete(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs):
"""
Sadly, Rest Framework Swagger will try to get the docstring from the `get`,
`put` and `delete` methods instead of the `retrieve`, `update` and `destroy`
methods. We should, however, place our logic inside this last methods or we'll
loose all the benefits of using a generic view
"""
try:
return super(UserRetrieveUpdateDestroyView, self).retrieve(request, *args, **kwargs)
except Http404:
raise HttpException(error_code=ErrorCodes.USER_NOT_FOUND)
def update(self, request, *args, **kwargs):
try:
return super(UserRetrieveUpdateDestroyView, self).retrieve(request, *args, **kwargs)
except Http404:
raise HttpException(error_code=ErrorCodes.USER_NOT_FOUND)
def destroy(self, request, *args, **kwargs):
try:
return super(UserRetrieveUpdateDestroyView, self).destroy(request, *args, **kwargs)
except Http404:
raise HttpException(error_code=ErrorCodes.USER_NOT_FOUND)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment