"""Back office views for app advertisement""" from rest_framework import generics from rest_framework import permissions from django.shortcuts import get_object_or_404 from advertisement.models import Advertisement from rest_framework.response import Response from rest_framework import status from advertisement.serializers import (AdvertisementBaseSerializer, AdvertisementPageBaseSerializer, AdvertisementPageListCreateSerializer) class AdvertisementBackOfficeViewMixin(generics.GenericAPIView): """Base back office advertisement view.""" permission_classes = (permissions.IsAuthenticated, ) def get_queryset(self): """Overridden get queryset method.""" return Advertisement.objects.with_base_related() class AdvertisementListCreateView(AdvertisementBackOfficeViewMixin, generics.ListCreateAPIView): """List|Create advertisement view.""" serializer_class = AdvertisementBaseSerializer class AdvertisementRUDView(AdvertisementBackOfficeViewMixin, generics.RetrieveUpdateDestroyAPIView): """Retrieve|Update|Destroy advertisement page view.""" serializer_class = AdvertisementBaseSerializer class AdvertisementPageListCreateView(AdvertisementBackOfficeViewMixin, generics.ListCreateAPIView): """Retrieve|Update|Destroy advertisement page view.""" serializer_class = AdvertisementPageListCreateSerializer def get_object(self): """Returns the object the view is displaying.""" ad_qs = Advertisement.objects.all() filtered_ad_qs = self.filter_queryset(ad_qs) ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['pk']) # May raise a permission denied self.check_object_permissions(self.request, ad) return ad def get_queryset(self): """Overridden get_queryset method.""" return self.get_object().pages.all() class AdvertisementPageRUDView(AdvertisementBackOfficeViewMixin, generics.RetrieveUpdateDestroyAPIView): """Create|Retrieve|Update|Destroy advertisement page view.""" serializer_class = AdvertisementPageBaseSerializer def get_object(self): """Returns the object the view is displaying.""" ad_qs = Advertisement.objects.all() filtered_ad_qs = self.filter_queryset(ad_qs) ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['ad_pk']) page = get_object_or_404(ad.pages.all(), pk=self.kwargs['page_pk']) # May raise a permission denied self.check_object_permissions(self.request, page) return page