"""Establishment app views.""" from django.shortcuts import get_object_or_404 from rest_framework import generics, permissions from comment import models as comment_models from establishment import filters from establishment import models, serializers from utils.views import JWTGenericViewMixin from establishment.views import EstablishmentMixin class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.ListAPIView): """Resource for getting a list of establishments.""" serializer_class = serializers.EstablishmentListSerializer filter_class = filters.EstablishmentFilter def get_queryset(self): """Overridden method 'get_queryset'.""" qs = super(EstablishmentListView, self).get_queryset() return qs.by_country_code(code=self.request.country_code)\ .annotate_in_favorites(user=self.request.user) class EstablishmentRetrieveView(EstablishmentMixin, JWTGenericViewMixin, generics.RetrieveAPIView): """Resource for getting a establishment.""" serializer_class = serializers.EstablishmentDetailSerializer class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView): """Resource for getting a list of establishment types.""" permission_classes = (permissions.AllowAny,) serializer_class = serializers.EstablishmentTypeSerializer queryset = models.EstablishmentType.objects.all() class EstablishmentCommentCreateView(generics.CreateAPIView): """View for create new comment.""" serializer_class = serializers.EstablishmentCommentCreateSerializer queryset = comment_models.Comment.objects.all() class EstablishmentCommentListView(generics.ListAPIView): """View for return list of establishment comments.""" permission_classes = (permissions.AllowAny,) serializer_class = serializers.EstablishmentCommentCreateSerializer def get_queryset(self): """Override get_queryset method""" return comment_models.Comment.objects.by_content_type(app_label='establishment', model='establishment')\ .by_object_id(object_id=self.kwargs.get('pk'))\ .order_by('-created') class EstablishmentCommentRUDView(generics.RetrieveUpdateDestroyAPIView): """View for retrieve/update/destroy establishment comment.""" serializer_class = serializers.EstablishmentCommentRUDSerializer queryset = models.Establishment.objects.all() def get_object(self): """ Returns the object the view is displaying. """ queryset = self.filter_queryset(self.get_queryset()) lookup_url_kwargs = ('pk', 'comment_id') assert lookup_url_kwargs not in self.kwargs.keys(), ( 'Expected view %s to be called with a URL keyword argument ' 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 'attribute on the view correctly.' % (self.__class__.__name__, lookup_url_kwargs) ) establishment_obj = get_object_or_404(queryset, pk=self.kwargs['pk']) comment_obj = get_object_or_404(establishment_obj.comments.by_user(self.request.user), pk=self.kwargs['comment_id']) # May raise a permission denied self.check_object_permissions(self.request, comment_obj) return comment_obj class EstablishmentFavoritesCreateDestroyView(generics.CreateAPIView, generics.DestroyAPIView): """View for create/destroy establishment from favorites.""" serializer_class = serializers.EstablishmentFavoritesCreateSerializer def get_object(self): """ Returns the object the view is displaying. """ lookup_url_kwargs = ('pk',) assert lookup_url_kwargs not in self.kwargs.keys(), ( 'Expected view %s to be called with a URL keyword argument ' 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 'attribute on the view correctly.' % (self.__class__.__name__, lookup_url_kwargs) ) obj = get_object_or_404( self.request.user.favorites.by_user(user=self.request.user) .by_content_type(app_label='establishment', model='establishment') .by_object_id(object_id=self.kwargs['pk'])) # May raise a permission denied self.check_object_permissions(self.request, obj) return obj