Add city info migration

This commit is contained in:
littlewolf 2019-11-08 10:25:21 +03:00
parent 99e2f30499
commit 4cbb8ed291
3 changed files with 80 additions and 5 deletions

View File

@ -1,5 +1,5 @@
from transfer.serializers.location import CountrySerializer, RegionSerializer, \
CitySerializer, AddressSerializer, \
CitySerializer, AddressSerializer, CityMapSerializer, \
Country
from transfer.models import Cities, Locations
from pprint import pprint
@ -145,6 +145,23 @@ def update_flags():
query.save()
def migrate_city_map_situation():
queryset = Cities.objects.raw("""SELECT cities.id, cities.name, cities.country_code_2, cities.zip_code,
cities.is_island, cities.region_code, cities.subregion_code
FROM cities WHERE
region_code IS NOT NULL AND
region_code != "" AND
country_code_2 IS NOT NULL AND
country_code_2 != ""
""")
serialized_data = CityMapSerializer(data=queryset, many=True)
if serialized_data.is_valid():
serialized_data.save()
else:
pprint(f"City info serializer errors: {serialized_data.errors}")
data_types = {
"dictionaries": [
transfer_countries,
@ -154,5 +171,9 @@ data_types = {
],
"update_country_flag": [
update_flags
],
"update_city_info": [
migrate_city_map_situation()
]
}

View File

@ -28,7 +28,8 @@ class Command(BaseCommand):
LONG_DATA_TYPES = [
'update_country_flag',
'comment'
'comment',
'update_city_info'
]
def handle(self, *args, **options):

View File

@ -1,8 +1,7 @@
from rest_framework import serializers
from location.models import Country, Region, City, Address
from django.contrib.gis.geos import Point
from django.contrib.gis.geos import GEOSGeometry
import json
from django.core.exceptions import MultipleObjectsReturned
class CountrySerializer(serializers.ModelSerializer):
@ -68,7 +67,6 @@ class RegionSerializer(serializers.ModelSerializer):
return region
def set_code(self, data):
print(data)
if "subregion_code" in data and data["subregion_code"] is not None and data["subregion_code"].strip() != "":
try:
parent_region = Region.objects.filter(code=str(data['region_code'])).first()
@ -266,3 +264,58 @@ class AddressSerializer(serializers.ModelSerializer):
del(data['longitude'])
return data
class CityMapSerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
map1 = serializers.CharField(allow_blank=True, allow_null=True)
map2 = serializers.CharField(allow_blank=True, allow_null=True)
map_ref = serializers.CharField(allow_blank=True, allow_null=True)
situation = serializers.CharField(allow_blank=True, allow_null=True)
class Meta:
model = City
fields = (
"id",
"map1",
"map2",
"map_ref",
"situation",
)
def validate(self, data):
data = self.set_old_id(data)
data = self.set_city(data)
data = self.set_null_fields(data)
return data
def create(self, validated_data):
city = validated_data.pop('city')
city.update(
map1=validated_data['map1'],
map2=validated_data['map2'],
map_ref=validated_data['map_ref'],
situation=validated_data['situation']
)
def set_old_id(self, data):
data['old_id'] = data.pop("id")
return data
def set_city(self, data):
try:
city = City.objects.get(old_id=data['old_id'])
except City.DoesNotExist as e:
raise ValueError(f"Cannot find city with id = {data['old_id']}: {e}")
except MultipleObjectsReturned as e:
raise ValueError(f"Find multiple cities with id = {data['old_id']}: {e}")
data['city'] = city
return data
def set_null_fields(self, data):
for field in ["map1", "map2", "map_ref", "situation"]:
if field not in data or data[field] is None:
data[field] = ""
return data