from rest_framework import serializers from location import models from django.contrib.gis.geos import Point class CountrySerializer(serializers.ModelSerializer): """Country serializer.""" class Meta: model = models.Country fields = [ 'id', 'name' ] class RegionSerializer(serializers.ModelSerializer): """Region serializer""" country = CountrySerializer() class Meta: model = models.Region fields = [ 'id', 'name', 'code', 'parent_region', 'country' ] class CitySerializer(serializers.ModelSerializer): """City serializer.""" country = CountrySerializer() region = RegionSerializer() class Meta: model = models.City fields = [ 'id', 'name', 'code', 'region', 'country', 'postal_code', 'is_island', ] class AddressSerializer(serializers.ModelSerializer): """Address serializer.""" city = CitySerializer() geo_lon = serializers.FloatField(allow_null=True) geo_lat = serializers.FloatField(allow_null=True) class Meta: model = models.Address fields = [ '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['location'] = 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)