from django.contrib.gis.geos import Point from rest_framework import serializers from location import models 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 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)