gault-millau/apps/location/serializers/common.py

146 lines
3.8 KiB
Python

"""Location app common serializers."""
from django.contrib.gis.geos import Point
from rest_framework import serializers
from location import models
from utils.serializers import TranslatedField
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
)
class Meta:
model = models.City
fields = [
'id',
'name',
'code',
'region',
'region_id',
'country_id',
'postal_code',
'is_island',
]
class AddressSerializer(serializers.ModelSerializer):
"""Address serializer."""
city_id = serializers.PrimaryKeyRelatedField(
source='city',
queryset=models.City.objects.all())
city = CitySerializer(read_only=True)
geo_lon = serializers.FloatField(allow_null=True)
geo_lat = serializers.FloatField(allow_null=True)
class Meta:
model = models.Address
fields = [
'id',
'city_id',
'city',
'street_name_1',
'street_name_2',
'number',
'postal_code',
'geo_lon',
'geo_lat',
]
def validate(self, attrs):
# if geo_lat and geo_lon was sent
geo_lat = attrs.pop('geo_lat') if 'geo_lat' in attrs else None
geo_lon = attrs.pop('geo_lon') if 'geo_lon' in attrs else None
if geo_lat and geo_lon:
# Point(longitude, latitude)
attrs['coordinates'] = Point(geo_lat, geo_lon)
return attrs
def to_representation(self, instance):
"""Override to_representation method"""
if instance.coordinates and isinstance(instance.coordinates, Point):
# Point(longitude, latitude)
setattr(instance, 'geo_lat', instance.coordinates.x)
setattr(instance, 'geo_lon', instance.coordinates.y)
else:
setattr(instance, 'geo_lat', float(0))
setattr(instance, 'geo_lon', float(0))
return super().to_representation(instance)
class AddressSimpleSerializer(serializers.ModelSerializer):
"""Serializer for address obj in related objects."""
class Meta:
"""Meta class."""
model = models.Address
fields = (
'id',
'street_name_1',
'street_name_2',
'number',
'postal_code',
)