""" web_admin views file """ # django imports from rest_framework.viewsets import GenericViewSet, mixins from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework import status, viewsets from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated, AllowAny from django.contrib.auth import get_user_model # local imports from account.utils import custom_response, custom_error_response from base.constants import USER_TYPE from base.messages import SUCCESS_CODE, ERROR_CODE from web_admin.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage from web_admin.permission import AdminPermission from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleCardSerializer, DefaultArticleCardImageSerializer, ArticleListSerializer ) USER = get_user_model() class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin): """ article api """ serializer_class = ArticleSerializer permission_classes = [IsAuthenticated, AdminPermission] queryset = Article filter_backends = (SearchFilter,) search_fields = ['title'] http_method_names = ['get', 'post', 'put', 'delete'] def get_queryset(self): article = self.queryset.objects.filter(is_deleted=False).prefetch_related( 'article_cards', 'article_survey', 'article_survey__options' ).order_by('-created_at') queryset = self.filter_queryset(article) return queryset def create(self, request, *args, **kwargs): """ article create api method :param request: :param args: :param kwargs: :return: success message """ serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return custom_response(SUCCESS_CODE["3027"]) def update(self, request, *args, **kwargs): """ article update api method :param request: :param args: :param kwargs: :return: success message """ article = self.get_object() serializer = self.serializer_class(article, data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return custom_response(SUCCESS_CODE["3028"]) def list(self, request, *args, **kwargs): """ article list api method :param request: :param args: :param kwargs: :return: list of article """ queryset = self.get_queryset() count = queryset.count() paginator = self.pagination_class() paginated_queryset = paginator.paginate_queryset(queryset, request) serializer = self.serializer_class(paginated_queryset, many=True) return custom_response(None, data=serializer.data, count=count) def retrieve(self, request, *args, **kwargs): """ article detail api method :param request: :param args: :param kwargs: :return: article detail data """ queryset = self.get_object() serializer = self.serializer_class(queryset, many=False) return custom_response(None, data=serializer.data) def destroy(self, request, *args, **kwargs): """ article delete (soft delete) api method :param request: :param args: :param kwargs: :return: success message """ article = self.get_object() article.is_deleted = True article.save() if article: return custom_response(SUCCESS_CODE["3029"]) return custom_error_response(ERROR_CODE["2041"], status.HTTP_400_BAD_REQUEST) @action(methods=['get'], url_name='remove-card', url_path='remove-card', detail=True) def remove_article_card(self, request, *args, **kwargs): """ article card remove (delete) api method :param request: :param args: :param kwargs: :return: success message """ try: ArticleCard.objects.filter(id=kwargs['pk']).first().delete() return custom_response(SUCCESS_CODE["3030"]) except AttributeError: return custom_error_response(ERROR_CODE["2042"], response_status=status.HTTP_400_BAD_REQUEST) @action(methods=['get'], url_name='remove-survey', url_path='remove-survey', detail=True) def remove_article_survey(self, request, *args, **kwargs): """ article survey remove (delete) api method :param request: :param args: :param kwargs: :return: success message """ try: ArticleSurvey.objects.filter(id=kwargs['pk']).first().delete() return custom_response(SUCCESS_CODE["3031"]) except AttributeError: return custom_error_response(ERROR_CODE["2043"], response_status=status.HTTP_400_BAD_REQUEST) @action(methods=['post'], url_name='test-add-card', url_path='test-add-card', detail=False, serializer_class=ArticleCardSerializer, permission_classes=[AllowAny]) def add_card(self, request): """ :param request: :return: """ serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return custom_response(SUCCESS_CODE["3000"]) @action(methods=['get'], url_name='test-list-card', url_path='test-list-card', detail=False, serializer_class=ArticleCardSerializer, permission_classes=[AllowAny]) def list_card(self, request): """ :param request: :return: """ queryset = ArticleCard.objects.all() serializer = self.serializer_class(queryset, many=True) return custom_response(None, serializer.data) class DefaultArticleCardImagesViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin): """ api to upload and list default article card images """ serializer_class = DefaultArticleCardImageSerializer permission_classes = [IsAuthenticated, AdminPermission] queryset = DefaultArticleCardImage.objects.all() def create(self, request, *args, **kwargs): """ api method to upload default article card images :param request: :return: success message """ serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return custom_response(SUCCESS_CODE["3000"]) def list(self, request, *args, **kwargs): """ api method to list default article card images :param request: :return: default article card images """ queryset = self.queryset serializer = self.serializer_class(queryset, many=True) return custom_response(None, data=serializer.data) class ArticleListViewSet(GenericViewSet, mixins.ListModelMixin): """ article api """ serializer_class = ArticleListSerializer permission_classes = [IsAuthenticated,] queryset = Article http_method_names = ['get',] def get_queryset(self): article = self.queryset.objects.filter(is_deleted=False).prefetch_related( 'article_cards', 'article_survey', 'article_survey__options' ).order_by('-created_at') queryset = self.filter_queryset(article) return queryset def list(self, request, *args, **kwargs): """ article list api method :param request: :param args: :param kwargs: :return: list of article """ queryset = self.get_queryset() count = queryset.count() paginator = self.pagination_class() paginated_queryset = paginator.paginate_queryset(queryset, request) serializer = self.serializer_class(paginated_queryset, many=True) return custom_response(None, data=serializer.data) class ArticleCardListViewSet(viewsets.ModelViewSet): """Junior Points viewset""" serializer_class = ArticleCardSerializer permission_classes = [IsAuthenticated] http_method_names = ('get',) def get_queryset(self): """get queryset""" return ArticleCard.objects.filter(article=self.request.GET.get('article_id')) def list(self, request, *args, **kwargs): """profile view""" try: queryset = self.get_queryset() # article card list serializer = ArticleCardSerializer(queryset, many=True) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)