293 lines
8.5 KiB
Python
293 lines
8.5 KiB
Python
"""Location app common serializers."""
|
|
from django.contrib.gis.geos import Point
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from rest_framework import serializers
|
|
from location import models
|
|
from utils.serializers import TranslatedField
|
|
from gallery.models import Image
|
|
|
|
|
|
class CountrySerializer(serializers.ModelSerializer):
|
|
"""Country serializer."""
|
|
|
|
name_trans = serializers.CharField(source='name_translated', read_only=True,
|
|
allow_null=True)
|
|
|
|
class Meta:
|
|
model = models.Country
|
|
fields = [
|
|
'id',
|
|
'code',
|
|
'svg_image',
|
|
'name_trans',
|
|
]
|
|
|
|
|
|
class CountrySimpleSerializer(serializers.ModelSerializer):
|
|
"""Simple country serializer."""
|
|
|
|
name_translated = TranslatedField()
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
|
|
model = models.Country
|
|
fields = ('id', 'code', 'name_translated')
|
|
|
|
|
|
class RegionSerializer(serializers.ModelSerializer):
|
|
"""Region serializer"""
|
|
|
|
country = CountrySerializer(read_only=True)
|
|
country_id = serializers.PrimaryKeyRelatedField(
|
|
source='country',
|
|
queryset=models.Country.objects.all(),
|
|
write_only=True
|
|
)
|
|
|
|
class Meta:
|
|
model = models.Region
|
|
fields = [
|
|
'id',
|
|
'name',
|
|
'code',
|
|
'parent_region',
|
|
'country',
|
|
'country_id'
|
|
]
|
|
|
|
|
|
class CitySerializer(serializers.ModelSerializer):
|
|
"""City serializer."""
|
|
region = RegionSerializer(read_only=True)
|
|
region_id = serializers.PrimaryKeyRelatedField(
|
|
source='region',
|
|
queryset=models.Region.objects.all(),
|
|
write_only=True
|
|
)
|
|
country_id = serializers.PrimaryKeyRelatedField(
|
|
source='country',
|
|
queryset=models.Country.objects.all(),
|
|
write_only=True
|
|
)
|
|
country = CountrySerializer()
|
|
|
|
class Meta:
|
|
model = models.City
|
|
fields = [
|
|
'id',
|
|
'name',
|
|
'code',
|
|
'region',
|
|
'region_id',
|
|
'country_id',
|
|
'country',
|
|
'postal_code',
|
|
'is_island',
|
|
'city_gallery'
|
|
]
|
|
|
|
|
|
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 CityGallerySerializer(serializers.ModelSerializer):
|
|
"""Serializer class for model NewsGallery."""
|
|
|
|
class Meta:
|
|
"""Meta class"""
|
|
|
|
model = models.CityGallery
|
|
fields = [
|
|
'id',
|
|
'is_main',
|
|
]
|
|
|
|
def get_request_kwargs(self):
|
|
"""Get url kwargs from request."""
|
|
return self.context.get('request').parser_context.get('kwargs')
|
|
|
|
def validate(self, attrs):
|
|
"""Override validate method."""
|
|
news_pk = self.get_request_kwargs().get('pk')
|
|
image_id = self.get_request_kwargs().get('image_id')
|
|
|
|
news_qs = models.City.objects.filter(pk=news_pk)
|
|
image_qs = Image.objects.filter(id=image_id)
|
|
|
|
if not news_qs.exists():
|
|
raise serializers.ValidationError({'detail': _('News not found')})
|
|
if not image_qs.exists():
|
|
raise serializers.ValidationError({'detail': _('Image not found')})
|
|
|
|
news = news_qs.first()
|
|
image = image_qs.first()
|
|
|
|
attrs['news'] = news
|
|
attrs['image'] = image
|
|
|
|
return attrs
|
|
|
|
|
|
class AddressBaseSerializer(serializers.ModelSerializer):
|
|
"""Serializer for address obj in related objects."""
|
|
|
|
latitude = serializers.FloatField(allow_null=True)
|
|
longitude = serializers.FloatField(allow_null=True)
|
|
|
|
# todo: remove this fields (backward compatibility)
|
|
geo_lon = serializers.FloatField(source='longitude', allow_null=True,
|
|
read_only=True)
|
|
geo_lat = serializers.FloatField(source='latitude', allow_null=True,
|
|
read_only=True)
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
|
|
model = models.Address
|
|
fields = (
|
|
'id',
|
|
'street_name_1',
|
|
'street_name_2',
|
|
'number',
|
|
'postal_code',
|
|
'latitude',
|
|
'longitude',
|
|
|
|
# todo: remove this fields (backward compatibility)
|
|
'geo_lon',
|
|
'geo_lat',
|
|
)
|
|
|
|
def validate_latitude(self, value):
|
|
if -90 <= value <= 90:
|
|
return value
|
|
raise serializers.ValidationError(_('Invalid value'))
|
|
|
|
def validate_longitude(self, value):
|
|
if -180 <= value <= 180:
|
|
return value
|
|
raise serializers.ValidationError(_('Invalid value'))
|
|
|
|
def validate(self, attrs):
|
|
# validate coordinates
|
|
latitude = attrs.pop('latitude', None)
|
|
longitude = attrs.pop('longitude', None)
|
|
if latitude is not None and longitude is not None:
|
|
attrs['coordinates'] = Point(longitude, latitude)
|
|
return attrs
|
|
|
|
|
|
class AddressDetailSerializer(AddressBaseSerializer):
|
|
"""Address serializer."""
|
|
|
|
city_id = serializers.PrimaryKeyRelatedField(
|
|
source='city', write_only=True,
|
|
queryset=models.City.objects.all())
|
|
city = CitySerializer(read_only=True)
|
|
|
|
class Meta(AddressBaseSerializer.Meta):
|
|
"""Meta class."""
|
|
|
|
fields = AddressBaseSerializer.Meta.fields + (
|
|
'city_id',
|
|
'city',
|
|
)
|
|
|
|
|
|
class WineAppellationBaseSerializer(serializers.ModelSerializer):
|
|
"""Wine appellations."""
|
|
name_translated = TranslatedField()
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
model = models.WineAppellation
|
|
fields = [
|
|
'id',
|
|
'name_translated',
|
|
]
|
|
|
|
|
|
class WineRegionBaseSerializer(serializers.ModelSerializer):
|
|
"""Wine region serializer."""
|
|
name_translated = TranslatedField()
|
|
country = CountrySerializer()
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
model = models.WineRegion
|
|
fields = [
|
|
'id',
|
|
'name_translated',
|
|
'country',
|
|
]
|