"""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 establishment.views import EstablishmentMixin from main.models import MetaDataContent from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer class EstablishmentListView(EstablishmentMixin, 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 EstablishmentSimilarListView(EstablishmentListView): """Resource for getting a list of establishments.""" serializer_class = serializers.EstablishmentListSerializer def get_queryset(self): """Override get_queryset method""" return super().get_queryset().similar(establishment_pk=self.kwargs.get('pk'))\ .order_by('-total_mark')[:13] class EstablishmentRetrieveView(EstablishmentMixin, generics.RetrieveAPIView): """Resource for getting a establishment.""" serializer_class = serializers.EstablishmentDetailSerializer class EstablishmentTypeListView(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()) 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. """ obj = get_object_or_404( self.request.user.favorites.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 class EstablishmentNearestRetrieveView(EstablishmentMixin, generics.ListAPIView): """Resource for getting list of nearest establishments.""" serializer_class = serializers.EstablishmentListSerializer filter_class = filters.EstablishmentFilter def get_queryset(self): """Overrided method 'get_queryset'.""" from django.contrib.gis.geos import Point center = Point(float(self.request.query_params["lat"]), float(self.request.query_params["lon"])) radius = float(self.request.query_params["radius"]) unit = self.request.query_params.get("unit", None) by_distance_from_point_kwargs = {"center": center, "radius": radius, "unit": unit} return super(EstablishmentNearestRetrieveView, self).get_queryset() \ .by_distance_from_point(**{k: v for k, v in by_distance_from_point_kwargs.items() if v is not None}) \ .by_country_code(code=self.request.country_code) \ .annotate_in_favorites(user=self.request.user) class EstablishmentTagListView(generics.ListAPIView): """List view for establishment tags.""" serializer_class = serializers.EstablishmentTagListSerializer permission_classes = (permissions.AllowAny,) pagination_class = None def get_queryset(self): """Override get_queryset method""" return MetaDataContent.objects.by_content_type(app_label='establishment', model='establishment')\ .distinct('metadata__label') class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView): """Establishment schedule RUD view""" serializer_class = ScheduleRUDSerializer def get_object(self): """ Returns the object the view is displaying. """ establishment_pk = self.kwargs['pk'] schedule_id = self.kwargs['schedule_id'] establishment = get_object_or_404(klass=models.Establishment.objects.all(), pk=establishment_pk) schedule = get_object_or_404(klass=establishment.schedule, id=schedule_id) # May raise a permission denied self.check_object_permissions(self.request, establishment) self.check_object_permissions(self.request, schedule) return schedule class EstablishmentScheduleCreateView(generics.CreateAPIView): """Establishment schedule Create view""" serializer_class = ScheduleCreateSerializer