107 lines
4.1 KiB
Python
107 lines
4.1 KiB
Python
"""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
|
|
|
|
|
|
class EstablishmentMixin:
|
|
"""Establishment mixin."""
|
|
|
|
permission_classes = (permissions.AllowAny,)
|
|
|
|
def get_queryset(self):
|
|
"""Overrided method 'get_queryset'."""
|
|
return models.Establishment.objects.all().prefetch_actual_employees()
|
|
|
|
|
|
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):
|
|
"""Overrided 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 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
|