"""News app views.""" from django.shortcuts import get_object_or_404 from rest_framework import generics, permissions from news import filters, models, serializers from rating.tasks import add_rating from utils.permissions import IsCountryAdmin, IsContentPageManager 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.published().with_base_related()\ .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.NewsDetailWebSerializer def get_queryset(self): """Override get_queryset method.""" return super().get_queryset().with_extended_related() 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_base_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 permission_classes = [IsCountryAdmin|IsContentPageManager] def get_serializer_class(self): """Override serializer class.""" if self.request.method == 'POST': return self.create_serializers_class return super().get_serializer_class() def get_queryset(self): """Override get_queryset method.""" return super().get_queryset().with_extended_related() class NewsBackOfficeRUDView(NewsBackOfficeMixinView, generics.RetrieveUpdateDestroyAPIView): """Resource for detailed information about news for back-office users.""" serializer_class = serializers.NewsBackOfficeDetailSerializer permission_classes = [IsCountryAdmin|IsContentPageManager] def get(self, request, pk, *args, **kwargs): add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news', app_label='news') return self.retrieve(request, *args, **kwargs)