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'))
|
||||
coordinates = models.PointField(
|
||||
_('Coordinates'), blank=True, null=True, default=None)
|
||||
old_id = models.IntegerField(null=True, blank=True, default=None)
|
||||
|
||||
class Meta:
|
||||
"""Meta class."""
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from django.db.models import Q, QuerySet
|
||||
|
||||
from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer
|
||||
from transfer.models import Cities
|
||||
from transfer.serializers.location import CountrySerializer, RegionSerializer, CitySerializer, AddressSerializer
|
||||
from transfer.models import Cities, Locations
|
||||
from pprint import pprint
|
||||
|
||||
|
||||
|
|
@ -89,6 +89,30 @@ def transfer_cities():
|
|||
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 = {
|
||||
"dictionaries": [
|
||||
transfer_countries,
|
||||
|
|
@ -96,5 +120,6 @@ data_types = {
|
|||
transfer_cities
|
||||
],
|
||||
"tmp": [
|
||||
transfer_addresses
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ class CityPhotos(MigrateMixin):
|
|||
db_table = 'city_photos'
|
||||
|
||||
|
||||
class Locations(models.Model):
|
||||
class Locations(MigrateMixin):
|
||||
using = 'legacy'
|
||||
|
||||
country_code = models.CharField(max_length=3)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
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):
|
||||
|
|
@ -171,3 +174,95 @@ class CitySerializer(serializers.ModelSerializer):
|
|||
def set_old_id(self, data):
|
||||
data['old_id'] = data.pop('id')
|
||||
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