""" web_admin views file """ # django imports from rest_framework.viewsets import GenericViewSet, mixins from rest_framework.response import Response from rest_framework import status from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated # local imports from account.utils import custom_response, custom_error_response from base.messages import SUCCESS_CODE, ERROR_CODE from web_admin.models import Article, ArticleCard, ArticleSurvey from web_admin.permission import AdminPermission from web_admin.serializers import ArticleSerializer class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin): """ article api """ serializer_class = ArticleSerializer permission_classes = [IsAuthenticated, AdminPermission] queryset = Article.objects.prefetch_related('article_cards', 'article_survey', 'article_survey__survey_options').order_by('-created_at') http_method_names = ['get', 'post', 'put', 'delete'] 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.queryset.filter(id=kwargs['pk']).first() 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.queryset.filter(is_deleted=False) 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) def retrieve(self, request, *args, **kwargs): """ article detail api method :param request: :param args: :param kwargs: :return: article detail data """ queryset = self.queryset.filter(id=kwargs['pk'], is_deleted=False) serializer = self.serializer_class(queryset, many=True) 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.queryset.filter(id=kwargs['pk']).update(is_deleted=True) 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='', url_path='', detail=False) def search_article(self, request): """ article search api method :param request: :return: searched article """ search = request.GET.get('search') queryset = self.queryset.filter(title__icontains=search) 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) @action(methods=['get'], url_name='remove_card', url_path='remove_card', detail=True, serializer_class=None) 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, serializer_class=None) 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)