189 lines
5.9 KiB
Python
189 lines
5.9 KiB
Python
"""Location app views."""
|
|
from django.conf import settings
|
|
from django.db.transaction import on_commit
|
|
from django.shortcuts import get_object_or_404
|
|
from rest_framework import generics, permissions, status
|
|
from rest_framework.response import Response
|
|
from gallery.tasks import delete_image
|
|
|
|
from location import models, serializers
|
|
|
|
|
|
# Mixins
|
|
class CountryViewMixin(generics.GenericAPIView):
|
|
"""View Mixin for model Country"""
|
|
|
|
serializer_class = serializers.CountrySerializer
|
|
permission_classes = (permissions.AllowAny,)
|
|
queryset = models.Country.objects.all()
|
|
|
|
|
|
class RegionViewMixin(generics.GenericAPIView):
|
|
"""View Mixin for model Region"""
|
|
model = models.Region
|
|
queryset = models.Region.objects.all()
|
|
|
|
|
|
class CityViewMixin(generics.GenericAPIView):
|
|
"""View Mixin for model City"""
|
|
model = models.City
|
|
queryset = models.City.objects.all()
|
|
|
|
|
|
class AddressViewMixin(generics.GenericAPIView):
|
|
"""View Mixin for model Address"""
|
|
model = models.Address
|
|
queryset = models.Address.objects.all()
|
|
|
|
|
|
# Country
|
|
class CountryListView(CountryViewMixin, generics.ListAPIView):
|
|
"""List view for model Country."""
|
|
|
|
pagination_class = None
|
|
|
|
|
|
class CountryRetrieveView(CountryViewMixin, generics.RetrieveAPIView):
|
|
"""Retrieve view for model Country."""
|
|
|
|
|
|
# Region
|
|
class RegionCreateView(RegionViewMixin, generics.CreateAPIView):
|
|
"""Create view for model Region"""
|
|
serializer_class = serializers.RegionSerializer
|
|
|
|
|
|
class RegionRetrieveView(RegionViewMixin, generics.RetrieveAPIView):
|
|
"""Retrieve view for model Region"""
|
|
serializer_class = serializers.RegionSerializer
|
|
|
|
|
|
class RegionListView(RegionViewMixin, generics.ListAPIView):
|
|
"""List view for model Country"""
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = serializers.CountrySerializer
|
|
|
|
|
|
class RegionDestroyView(RegionViewMixin, generics.DestroyAPIView):
|
|
"""Destroy view for model Country"""
|
|
serializer_class = serializers.CountrySerializer
|
|
|
|
|
|
class RegionUpdateView(RegionViewMixin, generics.UpdateAPIView):
|
|
"""Update view for model Country"""
|
|
serializer_class = serializers.CountrySerializer
|
|
|
|
|
|
# City
|
|
class CityRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|
serializer_class = serializers.CitySerializer
|
|
permission_classes = (permissions.AllowAny,) # TODO: remove after tests
|
|
|
|
|
|
class CityRetrieveView(CityViewMixin, generics.RetrieveAPIView):
|
|
"""Retrieve view for model City"""
|
|
serializer_class = serializers.CitySerializer
|
|
|
|
|
|
class CityListView(CityViewMixin, generics.ListAPIView):
|
|
"""List view for model City"""
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = serializers.CitySerializer
|
|
|
|
def get_queryset(self):
|
|
qs = super().get_queryset()
|
|
if self.request.country_code:
|
|
qs = qs.by_country_code(self.request.country_code)
|
|
return qs
|
|
|
|
|
|
class CityDestroyView(CityViewMixin, generics.DestroyAPIView):
|
|
"""Destroy view for model City"""
|
|
serializer_class = serializers.CitySerializer
|
|
|
|
|
|
class CityUpdateView(CityViewMixin, generics.UpdateAPIView):
|
|
"""Update view for model City"""
|
|
serializer_class = serializers.CitySerializer
|
|
|
|
|
|
class CityGalleryListView(generics.ListAPIView):
|
|
"""Resource for returning gallery for news for back-office users."""
|
|
serializer_class = serializers.CityImageSerializer
|
|
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
queryset = models.City.objects
|
|
|
|
def get_object(self):
|
|
"""Override get_object method."""
|
|
qs = super(CityGalleryListView, self).get_queryset()
|
|
city = get_object_or_404(qs, pk=self.kwargs['pk'])
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, city)
|
|
|
|
return city
|
|
|
|
def get_queryset(self):
|
|
"""Override get_queryset method."""
|
|
return self.get_object().gallery.all()
|
|
|
|
|
|
class CityGalleryCreateDestroyView(generics.CreateAPIView,
|
|
generics.DestroyAPIView):
|
|
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
queryset = models.City.objects
|
|
|
|
"""Resource for a create gallery for news for back-office users."""
|
|
serializer_class = serializers.CityGallerySerializer
|
|
|
|
def get_object(self):
|
|
"""
|
|
Returns the object the view is displaying.
|
|
"""
|
|
city_qs = self.filter_queryset(self.get_queryset())
|
|
|
|
city = get_object_or_404(city_qs, pk=self.kwargs['pk'])
|
|
gallery = get_object_or_404(city.news_gallery, image_id=self.kwargs['image_id'])
|
|
|
|
# May raise a permission denied
|
|
self.check_object_permissions(self.request, gallery)
|
|
|
|
return gallery
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
"""Overridden create method"""
|
|
super().create(request, *args, **kwargs)
|
|
return Response(status=status.HTTP_201_CREATED)
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
"""Override destroy method."""
|
|
gallery_obj = self.get_object()
|
|
if settings.USE_CELERY:
|
|
on_commit(lambda: delete_image.delay(image_id=gallery_obj.image.id,
|
|
completely=False))
|
|
else:
|
|
on_commit(lambda: delete_image(image_id=gallery_obj.image.id,
|
|
completely=False))
|
|
# Delete an instances of NewsGallery model
|
|
gallery_obj.delete()
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
|
|
|
|
|
# Address
|
|
class AddressCreateView(AddressViewMixin, generics.CreateAPIView):
|
|
"""Create view for model Address"""
|
|
serializer_class = serializers.AddressDetailSerializer
|
|
|
|
|
|
class AddressRetrieveView(AddressViewMixin, generics.RetrieveAPIView):
|
|
"""Retrieve view for model Address"""
|
|
serializer_class = serializers.AddressDetailSerializer
|
|
|
|
|
|
class AddressListView(AddressViewMixin, generics.ListAPIView):
|
|
"""List view for model Address"""
|
|
permission_classes = (permissions.AllowAny,)
|
|
serializer_class = serializers.AddressDetailSerializer
|