From 03fc4a6c5610964479de5ec0fa41acd55c00be46 Mon Sep 17 00:00:00 2001 From: littlewolf Date: Thu, 7 Nov 2019 14:07:19 +0300 Subject: [PATCH] Add city gallery list view --- apps/location/serializers/common.py | 73 +++++++++++++++++++++++++++++ apps/location/urls/common.py | 5 ++ apps/location/views/common.py | 24 ++++++++++ 3 files changed, 102 insertions(+) diff --git a/apps/location/serializers/common.py b/apps/location/serializers/common.py index 554a306b..9d48c769 100644 --- a/apps/location/serializers/common.py +++ b/apps/location/serializers/common.py @@ -4,6 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from location import models from utils.serializers import TranslatedField +from apps.gallery.models import Image class CountrySerializer(serializers.ModelSerializer): @@ -87,6 +88,78 @@ class CitySerializer(serializers.ModelSerializer): ] +class CropImageSerializer(serializers.Serializer): + """Serializer for crop images for City object.""" + + preview_url = serializers.SerializerMethodField() + promo_horizontal_web_url = serializers.SerializerMethodField() + promo_horizontal_mobile_url = serializers.SerializerMethodField() + tile_horizontal_web_url = serializers.SerializerMethodField() + tile_horizontal_mobile_url = serializers.SerializerMethodField() + tile_vertical_web_url = serializers.SerializerMethodField() + highlight_vertical_web_url = serializers.SerializerMethodField() + editor_web_url = serializers.SerializerMethodField() + editor_mobile_url = serializers.SerializerMethodField() + + def get_preview_url(self, obj): + """Get crop preview.""" + return obj.instance.get_image_url('news_preview') + + def get_promo_horizontal_web_url(self, obj): + """Get crop promo_horizontal_web.""" + return obj.instance.get_image_url('news_promo_horizontal_web') + + def get_promo_horizontal_mobile_url(self, obj): + """Get crop promo_horizontal_mobile.""" + return obj.instance.get_image_url('news_promo_horizontal_mobile') + + def get_tile_horizontal_web_url(self, obj): + """Get crop tile_horizontal_web.""" + return obj.instance.get_image_url('news_tile_horizontal_web') + + def get_tile_horizontal_mobile_url(self, obj): + """Get crop tile_horizontal_mobile.""" + return obj.instance.get_image_url('news_tile_horizontal_mobile') + + def get_tile_vertical_web_url(self, obj): + """Get crop tile_vertical_web.""" + return obj.instance.get_image_url('news_tile_vertical_web') + + def get_highlight_vertical_web_url(self, obj): + """Get crop highlight_vertical_web.""" + return obj.instance.get_image_url('news_highlight_vertical_web') + + def get_editor_web_url(self, obj): + """Get crop editor_web.""" + return obj.instance.get_image_url('news_editor_web') + + def get_editor_mobile_url(self, obj): + """Get crop editor_mobile.""" + return obj.instance.get_image_url('news_editor_mobile') + + +class CityImageSerializer(serializers.ModelSerializer): + """Serializer for returning crop images of news image.""" + + orientation_display = serializers.CharField(source='get_orientation_display', + read_only=True) + original_url = serializers.URLField(source='image.url') + auto_crop_images = CropImageSerializer(source='image', allow_null=True) + + class Meta: + model = Image + fields = [ + 'id', + 'title', + 'orientation_display', + 'original_url', + 'auto_crop_images', + ] + extra_kwargs = { + 'orientation': {'write_only': True} + } + + class AddressBaseSerializer(serializers.ModelSerializer): """Serializer for address obj in related objects.""" diff --git a/apps/location/urls/common.py b/apps/location/urls/common.py index edff6122..704ff600 100644 --- a/apps/location/urls/common.py +++ b/apps/location/urls/common.py @@ -12,6 +12,11 @@ urlpatterns = [ path('cities/', views.CityListCreateView.as_view(), name='city-list'), path('cities//', views.CityRUDView.as_view(), name='city-detail'), + path('cities//gallery/', views.CityGalleryListView.as_view(), + name='gallery-list'), + path('cities//gallery//', views.NewsBackOfficeGalleryCreateDestroyView.as_view(), + name='gallery-create-destroy'), + path('countries/', views.CountryListView.as_view(), name='country-list'), path('countries//', views.CountryRetrieveView.as_view(), name='country-retrieve'), diff --git a/apps/location/views/common.py b/apps/location/views/common.py index f3e3be7e..2d8d6b53 100644 --- a/apps/location/views/common.py +++ b/apps/location/views/common.py @@ -1,6 +1,7 @@ """Location app views.""" from rest_framework import generics from rest_framework import permissions +from django.shortcuts import get_object_or_404 from location import models, serializers @@ -103,6 +104,29 @@ class CityUpdateView(CityViewMixin, generics.UpdateAPIView): 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.with_base_related() \ + .order_by('-is_highlighted', '-created') + + 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() + + # Address class AddressCreateView(AddressViewMixin, generics.CreateAPIView): """Create view for model Address"""