98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
"""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 tag.serializers import TagCategoryDetailSerializer
|
|
|
|
|
|
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 NewsTypeTagsView(generics.ListAPIView):
|
|
"""Resource to get a list of tags for a news type."""
|
|
|
|
pagination_class = None
|
|
permission_classes = (permissions.AllowAny, )
|
|
serializer_class = TagCategoryDetailSerializer
|
|
|
|
def get_queryset(self):
|
|
news_type = get_object_or_404(models.NewsType, pk=self.kwargs.get('pk'))
|
|
return news_type.tag_categories.with_related()
|
|
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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)
|