from django_filters.rest_framework import DjangoFilterBackend from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.response import Response as Http_Response from rest_framework.viewsets import ModelViewSet from api.mixins import OwnerFieldMixin, DestroyToInvisibleMixin from api.permissions import IsSuperOrReadOnly, IsAuthOrReadOnly, IsStaffOrReadOnly #from blog.models import Post, Comment, Reply, Category, Tag, PostTag from blog.models import Post, Category, Tag, PostTag #from blog.serializers import PostSerializer, CommentSerializer, ReplySerializer, CategorySerializer, TagSerializer, PostTagSerializer from blog.serializers import PostSerializer, CategorySerializer, TagSerializer, PostTagSerializer ############################################################ #REST API for Post ############################################################ class PostViewSet(DestroyToInvisibleMixin, OwnerFieldMixin, ModelViewSet): #Everyone can read, just staff user can modificate permission_classes = (IsStaffOrReadOnly,) queryset = Post.objects.filter(visible=True) serializer_class = PostSerializer #Enable filter by code filter_backends = (DjangoFilterBackend,) filterset_fields = ('slug','category','tags__tag') @action(detail=True, methods=['post'], permission_classes=[AllowAny]) def increase_rating(self, request, pk=None): post = self.get_object() data = {'rating': post.rating + 1} serializer = self.get_serializer(post, data=data, partial=True) serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Http_Response(serializer.data) """ ############################################################ #REST API for Comment ############################################################ class CommentViewSet(NestedViewSetMixin, ModelViewSet): permission_classes = (IsAuthOrReadOnly, ) queryset = Comment.objects.all() serializer_class = CommentSerializer #Enable filter by comment and username filter_backends = (DjangoFilterBackend,) filterset_fields = ('post', 'username') def create(self, request, *args, **kwargs): #Set the username and email by default if the user is authenticated user = request.user if user.is_authenticated: request.data['username'] = user.username request.data['email'] = user.email return super(CommentViewSet, self).create(request, *args, **kwargs) ############################################################ #REST API for Reply ############################################################ class ReplyViewSet(NestedViewSetMixin, ModelViewSet): permission_classes = (IsAuthOrReadOnly, ) queryset = Reply.objects.all() serializer_class = ReplySerializer #Enable filter by comment and username filter_backends = (DjangoFilterBackend,) filterset_fields = ('comment', 'username') def create(self, request, *args, **kwargs): #Set the username and email by default if the user is authenticated user = request.user if user.is_authenticated: request.data['username'] = user.username request.data['email'] = user.email return super(ReplyViewSet, self).create(request, *args, **kwargs) """ ############################################################ #REST API for Category ############################################################ class CategoryViewSet(DestroyToInvisibleMixin, ModelViewSet): permission_classes = (IsStaffOrReadOnly, ) queryset = Category.objects.filter(visible=True) serializer_class = CategorySerializer #Enable filter by name filter_backends = (DjangoFilterBackend,) filterset_fields = ('name', ) ############################################################ #REST API for Tag ############################################################ class TagViewSet(ModelViewSet): permission_classes = (IsStaffOrReadOnly, ) queryset = Tag.objects.all() serializer_class = TagSerializer #Enable filter by name filter_backends = (DjangoFilterBackend,) filterset_fields = ('name', ) ############################################################ #REST API for PostTag ############################################################ class PostTagViewSet(ModelViewSet): permission_classes = (IsStaffOrReadOnly, ) queryset = PostTag.objects.all() serializer_class = PostTagSerializer #Enable filter by name filter_backends = (DjangoFilterBackend,) filterset_fields = ('post', 'post')