gault-millau/apps/main/views/common.py
2020-01-23 17:53:13 +03:00

179 lines
5.4 KiB
Python

"""Main app views."""
from django.http import Http404
from rest_framework import generics, permissions
from rest_framework.renderers import StaticHTMLRenderer
from rest_framework.response import Response
from main import methods, models, serializers
from news.models import News, NewsType
from news.serializers import NewsDetailSerializer, NewsListSerializer
from news.views import NewsMixinView
from utils.serializers import EmptySerializer
#
# class FeatureViewMixin:
# """Feature view mixin."""
#
# queryset = models.Feature.objects.all()
# serializer_class = serializers.FeatureSerializer
# permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
#
#
# class FeaturesLCView(FeatureViewMixin, generics.ListCreateAPIView):
# """Site features LC View."""
#
# pagination_class = None
#
#
# class FeaturesRUDView(FeatureViewMixin, generics.RetrieveUpdateDestroyAPIView):
# """Site features RUD View."""
#
#
# class SiteFeaturesViewMixin:
# """Site feature view mixin."""
#
# queryset = models.SiteFeature.objects.all()
# serializer_class = serializers.SiteFeatureSerializer
# permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
#
#
# class SiteFeaturesLCView(SiteFeaturesViewMixin, generics.ListCreateAPIView):
# """Site features LC."""
#
# pagination_class = None
#
#
# class SiteFeaturesRUDView(SiteFeaturesViewMixin,
# generics.RetrieveUpdateDestroyAPIView):
# """Site features RUD."""
class AwardView(generics.ListAPIView):
"""Awards list view."""
serializer_class = serializers.AwardSerializer
queryset = models.Award.objects.all()
permission_classes = (permissions.AllowAny,)
class AwardRetrieveView(generics.RetrieveAPIView):
"""Award retrieve view."""
serializer_class = serializers.AwardSerializer
queryset = models.Award.objects.all()
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class CarouselListView(generics.ListAPIView):
"""Return list of carousel items."""
queryset = models.Carousel.objects.is_parsed().active()
serializer_class = serializers.CarouselListSerializer
permission_classes = (permissions.AllowAny,)
pagination_class = None
def get_queryset(self):
country_code = self.request.country_code
qs = models.Carousel.objects.is_parsed().active()
if country_code:
qs = qs.by_country_code(country_code)
return qs
class DetermineLocation(generics.GenericAPIView):
"""Determine user's location."""
permission_classes = (permissions.AllowAny,)
serializer_class = EmptySerializer
def get(self, request, *args, **kwargs):
longitude, latitude = methods.determine_coordinates(request)
city = methods.determine_user_city(request)
country_name = methods.determine_country_name(request)
country_code = methods.determine_country_code(request)
if longitude and latitude and city and country_name:
return Response(data={
'latitude': latitude,
'longitude': longitude,
'city': city,
'country_name': country_name,
'country_code': country_code,
})
raise Http404
class ContentPageBaseView(generics.GenericAPIView):
@property
def static_page_category(self):
name = 'static'
static_page_category = NewsType.objects.filter(name=name).first()
if static_page_category is None:
static_page_category = NewsType.objects.create(name=name)
return static_page_category
def get_queryset(self):
return super().get_queryset().filter(news_type=self.static_page_category)
class ContentPageView(ContentPageBaseView, generics.ListAPIView):
"""Method to get content pages"""
permission_classes = (permissions.AllowAny,)
serializer_class = NewsListSerializer
queryset = News.objects.all()
class ContentPageAdminView(generics.ListCreateAPIView):
"""Method to get content pages"""
permission_classes = (permissions.IsAdminUser,)
serializer_class = NewsListSerializer
queryset = News.objects.all()
class ContentPageRetrieveView(NewsMixinView, generics.RetrieveAPIView):
"""Retrieve method to get content pages"""
lookup_field = None
permission_classes = (permissions.AllowAny,)
serializer_class = NewsDetailSerializer
queryset = News.objects.all()
renderer_classes = [StaticHTMLRenderer]
def get(self, request, *args, **kwargs):
instance = self.get_object()
if instance is None:
raise Http404
return Response(instance.description.get(request.locale))
class ContentPageIdRetrieveView(generics.RetrieveAPIView):
"""Retrieve method to get content pages"""
permission_classes = (permissions.AllowAny,)
serializer_class = NewsDetailSerializer
queryset = News.objects.all()
renderer_classes = [StaticHTMLRenderer]
def get(self, request, *args, **kwargs):
instance = self.get_object()
if instance is None:
raise Http404
return Response(instance.description.get(request.locale))
class ContentPageRetrieveAdminView(NewsMixinView, generics.RetrieveUpdateDestroyAPIView):
"""Retrieve method to get content pages"""
lookup_field = None
permission_classes = (permissions.IsAdminUser,)
serializer_class = NewsDetailSerializer
queryset = News.objects.all()