"""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 rest_framework import generics from rest_framework import permissions from django.db.models.expressions import RawSQL from location import models, serializers from utils.models import get_current_locale # Mixins class CountryViewMixin(generics.GenericAPIView): """View Mixin for model Country""" serializer_class = serializers.CountrySerializer permission_classes = (permissions.AllowAny,) queryset = models.Country.objects.active() 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 def get_queryset(self): qs = super().get_queryset().order_by(RawSQL("name->>%s", (get_current_locale(),))) return qs 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 WineRegionListView(generics.ListAPIView): """List view for model WineRegion""" pagination_class = None model = models.WineRegion permission_classes = (permissions.AllowAny,) queryset = models.WineRegion.objects.with_sub_region_related().having_wines() serializer_class = serializers.WineRegionSerializer 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