146 lines
3.8 KiB
Python
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',
|
|
)
|