Add address serializer
This commit is contained in:
parent
25d58a8bc5
commit
7d556df8d5
|
|
@ -102,6 +102,7 @@ class Address(models.Model):
|
||||||
default='', help_text=_('Ex.: 350018'))
|
default='', help_text=_('Ex.: 350018'))
|
||||||
coordinates = models.PointField(
|
coordinates = models.PointField(
|
||||||
_('Coordinates'), blank=True, null=True, default=None)
|
_('Coordinates'), blank=True, null=True, default=None)
|
||||||
|
old_id = models.IntegerField(null=True, blank=True, default=None)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from django.db.models import Q, QuerySet
|
from django.db.models import Q, QuerySet
|
||||||
|
|
||||||
from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer
|
from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer, AddressSerializer
|
||||||
from transfer.models import Cities
|
from transfer.models import Cities, Locations
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -89,6 +89,30 @@ def transfer_cities():
|
||||||
pprint(f"City serializer errors: {serialized_data.errors}")
|
pprint(f"City serializer errors: {serialized_data.errors}")
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_addresses():
|
||||||
|
queryset = Locations.objects.raw("""SELECT locations.id, locations.zip_code, locations.longitude,
|
||||||
|
locations.latitude, locations.address, locations.city_id
|
||||||
|
FROM locations WHERE
|
||||||
|
locations.address != "" AND
|
||||||
|
locations.address IS NOT NULL AND
|
||||||
|
locations.city_id IS NOT NULL AND
|
||||||
|
locations.city_id IN (SELECT cities.id
|
||||||
|
FROM cities WHERE
|
||||||
|
region_code IS NOT NULL AND
|
||||||
|
region_code != "" AND
|
||||||
|
country_code_2 IS NOT NULL AND
|
||||||
|
country_code_2 != "")""")
|
||||||
|
|
||||||
|
queryset = [vars(query) for query in queryset]
|
||||||
|
|
||||||
|
serialized_data = AddressSerializer(data=queryset, many=True)
|
||||||
|
if serialized_data.is_valid():
|
||||||
|
serialized_data.save()
|
||||||
|
else:
|
||||||
|
pprint(f"Address serializer errors: {serialized_data.errors}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data_types = {
|
data_types = {
|
||||||
"dictionaries": [
|
"dictionaries": [
|
||||||
transfer_countries,
|
transfer_countries,
|
||||||
|
|
@ -96,5 +120,6 @@ data_types = {
|
||||||
transfer_cities
|
transfer_cities
|
||||||
],
|
],
|
||||||
"tmp": [
|
"tmp": [
|
||||||
|
transfer_addresses
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -232,7 +232,7 @@ class CityPhotos(MigrateMixin):
|
||||||
db_table = 'city_photos'
|
db_table = 'city_photos'
|
||||||
|
|
||||||
|
|
||||||
class Locations(models.Model):
|
class Locations(MigrateMixin):
|
||||||
using = 'legacy'
|
using = 'legacy'
|
||||||
|
|
||||||
country_code = models.CharField(max_length=3)
|
country_code = models.CharField(max_length=3)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from location.models import Country, Region, City
|
from location.models import Country, Region, City, Address
|
||||||
|
from django.contrib.gis.geos import Point
|
||||||
|
from django.contrib.gis.geos import GEOSGeometry
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
class CountrySerializer(serializers.ModelSerializer):
|
class CountrySerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -171,3 +174,95 @@ class CitySerializer(serializers.ModelSerializer):
|
||||||
def set_old_id(self, data):
|
def set_old_id(self, data):
|
||||||
data['old_id'] = data.pop('id')
|
data['old_id'] = data.pop('id')
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
class AddressSerializer(serializers.ModelSerializer):
|
||||||
|
id = serializers.IntegerField()
|
||||||
|
city_id = serializers.IntegerField()
|
||||||
|
zip_code = serializers.CharField(allow_null=True, allow_blank=True)
|
||||||
|
latitude = serializers.DecimalField(max_digits=10, decimal_places=6, allow_null=True)
|
||||||
|
longitude = serializers.DecimalField(max_digits=10, decimal_places=6, allow_null=True)
|
||||||
|
address = serializers.CharField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Address
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"city_id",
|
||||||
|
"zip_code",
|
||||||
|
"latitude",
|
||||||
|
"longitude",
|
||||||
|
"address"
|
||||||
|
)
|
||||||
|
|
||||||
|
def validate(self, data):
|
||||||
|
data = self.set_old_id(data)
|
||||||
|
data = self.set_address(data)
|
||||||
|
data = self.set_postal_code(data)
|
||||||
|
data = self.set_city(data)
|
||||||
|
data = self.set_point(data)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
return Address.objects.create(**validated_data)
|
||||||
|
|
||||||
|
def set_old_id(self, data):
|
||||||
|
data['old_id'] = data.pop("id")
|
||||||
|
return data
|
||||||
|
|
||||||
|
def set_postal_code(self, data):
|
||||||
|
data['postal_code'] = data.pop('zip_code', None)
|
||||||
|
if data['postal_code'] is None:
|
||||||
|
data['postal_code'] = ""
|
||||||
|
return data
|
||||||
|
|
||||||
|
def set_city(self, data):
|
||||||
|
try:
|
||||||
|
city = City.objects.filter(old_id=data['city_id']).first()
|
||||||
|
except City.DoesNotExist as e:
|
||||||
|
raise ValueError(f"City not found with {data}: {e}")
|
||||||
|
|
||||||
|
data['city'] = city
|
||||||
|
del(data['city_id'])
|
||||||
|
return data
|
||||||
|
|
||||||
|
def set_address(self, data):
|
||||||
|
address_list = data.pop('address').split(' ')
|
||||||
|
is_first_street = False
|
||||||
|
data['street_name_1'] = []
|
||||||
|
data['street_name_2'] = []
|
||||||
|
while len(address_list) > 0:
|
||||||
|
address_part = address_list.pop()
|
||||||
|
try:
|
||||||
|
address_part = int(address_part)
|
||||||
|
data['number'] = address_part
|
||||||
|
is_first_street = True
|
||||||
|
except:
|
||||||
|
if is_first_street:
|
||||||
|
data['street_name_1'].append(address_part)
|
||||||
|
else:
|
||||||
|
data['street_name_2'].append(address_part)
|
||||||
|
|
||||||
|
data['street_name_1'] = " ".join(data['street_name_1'])
|
||||||
|
data['street_name_2'] = " ".join(data['street_name_2'])
|
||||||
|
if "number" not in data:
|
||||||
|
data['number'] = 0
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def set_point(self, data):
|
||||||
|
if data['latitude'] is not None and data['longitude'] is not None:
|
||||||
|
data['coordinates'] = Point(float(data['longitude']), float(data['latitude']))
|
||||||
|
# data['coordinates'] = GEOSGeometry(
|
||||||
|
# json.dumps({
|
||||||
|
# "type": "Point",
|
||||||
|
# "coordinates": [data['longitude'], data['latitude']]
|
||||||
|
# }, ensure_ascii=False, default=str)
|
||||||
|
# )
|
||||||
|
else:
|
||||||
|
data['coordinates'] = None
|
||||||
|
|
||||||
|
del(data['latitude'])
|
||||||
|
del(data['longitude'])
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user