"""News app views.""" from django.shortcuts import get_object_or_404 from rest_framework import generics, permissions, status from rest_framework.response import Response from news import filters, models, serializers class NewsMixinView: """News mixin.""" permission_classes = (permissions.AllowAny, ) serializer_class = serializers.NewsBaseSerializer def get_queryset(self, *args, **kwargs): """Override get_queryset method.""" qs = models.News.objects.with_related().published()\ .order_by('-is_highlighted', '-created') if self.request.country_code: qs = qs.by_country_code(self.request.country_code) return qs class NewsListView(NewsMixinView, generics.ListAPIView): """News list view.""" filter_class = filters.NewsListFilterSet class NewsDetailView(NewsMixinView, generics.RetrieveAPIView): """News detail view.""" lookup_field = 'slug' serializer_class = serializers.NewsDetailSerializer class NewsTypeListView(generics.ListAPIView): """NewsType list view.""" pagination_class = None permission_classes = (permissions.AllowAny, ) queryset = models.NewsType.objects.all() serializer_class = serializers.NewsTypeSerializer class NewsBackOfficeMixinView: """News back office mixin view.""" permission_classes = (permissions.IsAuthenticated,) queryset = models.News.objects.with_related() \ .order_by('-is_highlighted', '-created') class NewsBackOfficeLCView(NewsBackOfficeMixinView, generics.ListCreateAPIView): """Resource for a list of news for back-office users.""" serializer_class = serializers.NewsBackOfficeBaseSerializer create_serializers_class = serializers.NewsBackOfficeDetailSerializer def get_serializer_class(self): if self.request.method == 'POST': return self.create_serializers_class return super().get_serializer_class() class NewsBackOfficeGalleryCreateDestroyView(NewsBackOfficeMixinView, generics.CreateAPIView, generics.DestroyAPIView): """Resource for a create gallery for news for back-office users.""" serializer_class = serializers.NewsBackOfficeGallerySerializer def get_object(self): """ Returns the object the view is displaying. """ news_qs = self.filter_queryset(self.get_queryset()) news = get_object_or_404(news_qs, pk=self.kwargs['pk']) gallery = get_object_or_404(news.news_gallery, image_id=self.kwargs['image_id']) # May raise a permission denied self.check_object_permissions(self.request, gallery) return gallery def create(self, request, *args, **kwargs): """Override create method""" super().create(request, *args, **kwargs) return Response(status=status.HTTP_201_CREATED) class NewsBackOfficeGalleryListView(NewsBackOfficeMixinView, generics.ListAPIView): """Resource for returning gallery for news for back-office users.""" serializer_class = serializers.NewsImageSerializer def get_object(self): """Override get_object method.""" qs = super(NewsBackOfficeGalleryListView, self).get_queryset() news = get_object_or_404(qs, pk=self.kwargs['pk']) # May raise a permission denied self.check_object_permissions(self.request, news) return news def get_queryset(self): """Override get_queryset method.""" return self.get_object().gallery.all() class NewsBackOfficeRUDView(NewsBackOfficeMixinView, generics.RetrieveUpdateDestroyAPIView): """Resource for detailed information about news for back-office users.""" serializer_class = serializers.NewsBackOfficeDetailSerializer