from rest_framework import generics from rest_framework import permissions from collection import models from utils.pagination import ProjectPageNumberPagination from django.shortcuts import get_object_or_404 from establishment.serializers import EstablishmentBaseSerializer from collection.serializers import common as serializers # Mixins class CollectionViewMixin(generics.GenericAPIView): """Mixin for Collection view""" model = models.Collection permission_classes = (permissions.AllowAny,) def get_queryset(self): """Override get_queryset method.""" return models.Collection.objects.published() \ .by_country_code(code=self.request.country_code) \ .filter_all_related_gt(3) \ .order_by('-on_top', '-modified') class GuideViewMixin(generics.GenericAPIView): """Mixin for Guide view""" model = models.Guide queryset = models.Guide.objects.all() # Views # Collections class CollectionHomePageView(CollectionViewMixin, generics.ListAPIView): """List Collection view""" serializer_class = serializers.CollectionSerializer class CollectionDetailView(CollectionViewMixin, generics.RetrieveAPIView): """Retrieve detail of Collection instance.""" lookup_field = 'slug' serializer_class = serializers.CollectionBaseSerializer class CollectionEstablishmentListView(CollectionHomePageView): """Retrieve list of establishment for collection.""" lookup_field = 'slug' pagination_class = ProjectPageNumberPagination serializer_class = EstablishmentBaseSerializer def get_queryset(self): """ Override get_queryset method. """ queryset = super(CollectionEstablishmentListView, self).get_queryset() # Perform the lookup filtering. collection = get_object_or_404(queryset, slug=self.kwargs['slug']) # May raise a permission denied self.check_object_permissions(self.request, collection) return collection.establishments.all() # Guide class GuideListView(GuideViewMixin, generics.ListAPIView): """List Guide view""" permission_classes = (permissions.AllowAny,) serializer_class = serializers.GuideSerializer class GuideRetrieveView(GuideViewMixin, generics.RetrieveAPIView): """Retrieve Guide view""" permission_classes = (permissions.AllowAny,) serializer_class = serializers.GuideSerializer