Add city gallery list view

This commit is contained in:
littlewolf 2019-11-07 14:07:19 +03:00
parent 22ac3d3046
commit 03fc4a6c56
3 changed files with 102 additions and 0 deletions

View File

@ -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."""

View File

@ -12,6 +12,11 @@ urlpatterns = [
path('cities/', views.CityListCreateView.as_view(), name='city-list'),
path('cities/<int:pk>/', views.CityRUDView.as_view(), name='city-detail'),
path('cities/<int:pk>/gallery/', views.CityGalleryListView.as_view(),
name='gallery-list'),
path('cities/<int:pk>/gallery/<int:image_id>/', views.NewsBackOfficeGalleryCreateDestroyView.as_view(),
name='gallery-create-destroy'),
path('countries/', views.CountryListView.as_view(), name='country-list'),
path('countries/<int:pk>/', views.CountryRetrieveView.as_view(), name='country-retrieve'),

View File

@ -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"""