Add child_region updater

This commit is contained in:
littlewolf 2019-11-14 15:21:53 +03:00
parent cf226974c8
commit c872cdd4bc
6 changed files with 151 additions and 34 deletions

View File

@ -0,0 +1 @@
{"240": {"code": "15", "name": "Korinthia", "region": "J", "country": "GR"}, "5180": {"code": "17", "name": "Messinia", "region": "J", "country": "GR"}, "5181": {"code": "16", "name": "Lakonia", "region": "J", "country": "GR"}, "5182": {"code": "11", "name": "Argolida", "region": "J", "country": "GR"}, "5183": {"code": "11", "name": "Argolida", "region": "J", "country": "GR"}, "5184": {"code": "03", "name": "Voiotia", "region": "H", "country": "GR"}, "5185": {"code": "04", "name": "Evvoias", "region": "H", "country": "GR"}}

View File

@ -0,0 +1 @@
[{"old_id": [9568], "data": {"code": "GP", "name": "Guadeloupe"}}, {"old_id": [1], "data": {"code": "AT", "name": "Austria"}}, {"old_id": [7307], "data": {"code": "AU", "name": "Australia"}}, {"old_id": [2298], "data": {"code": "BE", "name": "Belgium"}}, {"old_id": [11277], "data": {"code": "BR", "name": "Brazil"}}, {"old_id": [6226], "data": {"code": "CA", "name": "Canada"}}, {"old_id": [2955], "data": {"code": "CH", "name": "Switzerland"}}, {"old_id": [202], "data": {"code": "DE", "name": "Germany"}}, {"old_id": [3133], "data": {"code": "ES", "name": "Spain"}}, {"old_id": [514], "data": {"code": "FR", "name": "France"}}, {"old_id": [3758], "data": {"code": "GB", "name": "United Kingdom"}}, {"old_id": [8539], "data": {"code": "GE", "name": "Georgia"}}, {"old_id": [10164], "data": {"code": "GR", "name": "Greece"}}, {"old_id": [2283], "data": {"code": "HR", "name": "Croatia"}}, {"old_id": [8406], "data": {"code": "HU", "name": "Hungary"}}, {"old_id": [8527], "data": {"code": "IL", "name": "Israel"}}, {"old_id": [2274], "data": {"code": "IT", "name": "Italy"}}, {"old_id": [7370], "data": {"code": "JP", "name": "Japan"}}, {"old_id": [141], "data": {"code": "LU", "name": "Luxembourg"}}, {"old_id": [7709], "data": {"code": "MA", "name": "Morocco"}}, {"old_id": [9852], "data": {"code": "MV", "name": "Maldives"}}, {"old_id": [9030], "data": {"code": "NL", "name": "Netherlands"}}, {"old_id": [10390], "data": {"code": "PL", "name": "Poland"}}, {"old_id": [8915], "data": {"code": "RO", "name": "Romania"}}, {"old_id": [8238], "data": {"code": "RU", "name": "Russia"}}, {"old_id": [7230], "data": {"code": "SI", "name": "Slovenia"}}, {"old_id": [7846], "data": {"code": "US", "name": "United States"}}]

View File

@ -1,10 +1,12 @@
from transfer.serializers import location as location_serializers from transfer.serializers import location as location_serializers
from transfer import models as transfer_models from transfer import models as transfer_models
from location.models import Country from location.models import Country, Region
from pprint import pprint from pprint import pprint
import json
from django.conf import settings
from django.core.exceptions import MultipleObjectsReturned
from requests import get from requests import get
import json
def transfer_countries(): def transfer_countries():
@ -181,7 +183,7 @@ def update_flags():
def migrate_city_map_situation(): def migrate_city_map_situation():
queryset = Cities.objects.raw("""SELECT cities.id, cities.name, cities.country_code_2, cities.zip_code, queryset = transfer_models.Cities.objects.raw("""SELECT cities.id, cities.name, cities.country_code_2, cities.zip_code,
cities.is_island, cities.region_code, cities.subregion_code cities.is_island, cities.region_code, cities.subregion_code
FROM cities WHERE FROM cities WHERE
region_code IS NOT NULL AND region_code IS NOT NULL AND
@ -190,7 +192,7 @@ def migrate_city_map_situation():
country_code_2 != "" country_code_2 != ""
""") """)
serialized_data = CityMapSerializer(data=queryset, many=True) serialized_data = location_serializers.CityMapSerializer(data=queryset, many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
@ -198,7 +200,7 @@ def migrate_city_map_situation():
def migrate_city_photos(): def migrate_city_photos():
queryset = CityPhotos.objects.raw("""SELECT city_photos.id, city_photos.city_id, city_photos.attachment_file_name queryset = transfer_models.CityPhotos.objects.raw("""SELECT city_photos.id, city_photos.city_id, city_photos.attachment_file_name
FROM city_photos WHERE FROM city_photos WHERE
city_photos.attachment_file_name IS NOT NULL AND city_photos.attachment_file_name IS NOT NULL AND
city_id IN( city_id IN(
@ -213,28 +215,146 @@ def migrate_city_photos():
queryset = [vars(query) for query in queryset] queryset = [vars(query) for query in queryset]
serialized_data = CityGallerySerializer(data=queryset, many=True) serialized_data = location_serializers.CityGallerySerializer(data=queryset, many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
pprint(f"Address serializer errors: {serialized_data.errors}") pprint(f"Address serializer errors: {serialized_data.errors}")
def update_subregions(): """
# regions = CitySerializer Update location models with ruby library
pass Utils functions defined before transfer functions
"""
def get_ruby_socket(type, params):
# TODO: удалить после переноса! url = 'http://172.22.0.1:5678' # docker host
def get_ruby_socket(region_params): params["type"] = type
url = 'http://172.22.0.1:5678' response = get(url, params=params)
response = get(url, params=region_params)
data = json.loads(response.text) data = json.loads(response.text)
print(data)
return data return data
def update_child_regions():
child_regions_list = Region.objects.filter(old_id__isnull=False, parent_region__isnull=False)
ruby_data_to_write = {}
try:
with open(f"{settings.PROJECT_ROOT}/apps/location/ruby_data/child_regions.py", "w") as file:
ruby_regions_list = json.loads(file.read())
except:
ruby_regions_list = {}
for child_region in child_regions_list:
mysql_region = transfer_models.Cities.objects.get(id=child_region.old_id)
if child_region.id in ruby_regions_list:
ruby_data = ruby_regions_list[child_region.id]
else:
ruby_params = {
"country_code": mysql_region.country_code,
"country_code_2": mysql_region.country_code_2,
"region_code": mysql_region.region_code,
"region_name": mysql_region.name,
"subregion_code": mysql_region.subregion_code
}
ruby_data = get_ruby_socket("subregion", ruby_params)
if "error" in ruby_data:
continue
ruby_data_to_write[child_region.id] = ruby_data
try:
parent_region = Region.objects.get(
code=ruby_data['region'],
country__code=ruby_data['country']
)
country = parent_region.country
except MultipleObjectsReturned:
parent_region = Region.objects.filter(
code=ruby_data['region'],
country__code=ruby_data['country']
).first()
country = parent_region.country
except Region.DoesNotExist:
try:
parent_region = Region.objects.get(code=ruby_data['region'])
country = Country.objects.get(code=ruby_data['country'])
except MultipleObjectsReturned:
parent_region = Region.objects.filter(code=ruby_data['region']).first()
country = parent_region.country
child_region.parent_region = parent_region
child_region.country = country
child_region.save()
if len(ruby_data_to_write) > 0:
ruby_data_to_write = {**ruby_data_to_write, **ruby_regions_list}
with open(f"{settings.PROJECT_ROOT}/apps/location/ruby_data/child_regions.py", "w") as file:
file.write(json.dumps(ruby_data_to_write))
# def update_relations(old_instance, new_instance, relations_dict):
# for relation_name, relation_field in relations_dict.items():
# relations_to_update = getattr(old_instance, relation_name, None)
# print(relations_to_update)
# if relations_to_update is None:
# continue
# # elif isinstance(relations_to_update)
#
# # relations_to_update = relations_to_update.all()
#
# # if len(relations_to_update) > 0:
#
#
# def update_country_from_ruby():
# countries = Country.objects.filter(old_id__isnull=False).distinct('code')
#
# json_countries_list = []
# for country in countries:
# json_country_dict = {
# "old_id": [country.old_id]
# }
# mysql_country = transfer_models.Cities.objects.get(id=country.old_id)
#
# ruby_params = {
# "country_code": mysql_country.country_code,
# "country_code_2": mysql_country.country_code_2,
# "region_code": mysql_country.region_code
# }
#
# ruby_data = get_ruby_socket("country", ruby_params)
#
# if "error" in ruby_data:
# print("ERROR: ")
# print(f"{ruby_data['error']}: {ruby_params}")
# continue
#
# json_country_dict["data"] = ruby_data
#
# duplicates = Country.objects.\
# filter(
# old_id__isnull=False,
# code=country.code
# ).exclude(old_id=country.old_id)
#
# for duplicate in duplicates:
# json_country_dict["old_id"].append(duplicate.old_id)
#
# json_countries_list.append(json_country_dict)
#
# with open(f"{settings.PROJECT_ROOT}/apps/location/ruby_data/countries.py", "w") as file:
# file.write(json.dumps(json_countries_list))
#
#
data_types = { data_types = {
"dictionaries": [ "dictionaries": [
# transfer_countries, # transfer_countries,
@ -254,6 +374,8 @@ data_types = {
"migrate_city_gallery": [ "migrate_city_gallery": [
migrate_city_photos migrate_city_photos
], ],
"tmp": [update_subregions] "tmp": [
update_child_regions
]
} }

View File

@ -363,7 +363,7 @@ class CityMapSerializer(serializers.ModelSerializer):
situation = serializers.CharField(allow_blank=True, allow_null=True) situation = serializers.CharField(allow_blank=True, allow_null=True)
class Meta: class Meta:
model = City model = models.City
fields = ( fields = (
"id", "id",
"map1", "map1",
@ -393,8 +393,8 @@ class CityMapSerializer(serializers.ModelSerializer):
def set_city(self, data): def set_city(self, data):
try: try:
city = City.objects.get(old_id=data['old_id']) city = models.City.objects.get(old_id=data['old_id'])
except City.DoesNotExist as e: except models.City.DoesNotExist as e:
raise ValueError(f"Cannot find city with id = {data['old_id']}: {e}") raise ValueError(f"Cannot find city with id = {data['old_id']}: {e}")
except MultipleObjectsReturned as e: except MultipleObjectsReturned as e:
raise ValueError(f"Find multiple cities with id = {data['old_id']}: {e}") raise ValueError(f"Find multiple cities with id = {data['old_id']}: {e}")
@ -415,7 +415,7 @@ class CityGallerySerializer(serializers.ModelSerializer):
attachment_file_name = serializers.CharField() attachment_file_name = serializers.CharField()
class Meta: class Meta:
model = CityGallery model = models.CityGallery
fields = ("id", "city_id", "attachment_file_name") fields = ("id", "city_id", "attachment_file_name")
def validate(self, data): def validate(self, data):
@ -425,7 +425,7 @@ class CityGallerySerializer(serializers.ModelSerializer):
return data return data
def create(self, validated_data): def create(self, validated_data):
return CityGallery.objects.create(**validated_data) return models.CityGallery.objects.create(**validated_data)
def set_old_id(self, data): def set_old_id(self, data):
data['old_id'] = data.pop('id') data['old_id'] = data.pop('id')
@ -444,8 +444,8 @@ class CityGallerySerializer(serializers.ModelSerializer):
def set_city(self, data): def set_city(self, data):
try: try:
data['city'] = City.objects.get(old_id=data.pop('city_id')) data['city'] = models.City.objects.get(old_id=data.pop('city_id'))
except City.DoesNotExist as e: except models.City.DoesNotExist as e:
raise ValueError(f"Cannot get city with {data}: {e}") raise ValueError(f"Cannot get city with {data}: {e}")
except MultipleObjectsReturned as e: except MultipleObjectsReturned as e:
raise ValueError(f"Multiple cities find with {data}: {e}") raise ValueError(f"Multiple cities find with {data}: {e}")

View File

@ -75,6 +75,7 @@ PROJECT_APPS = [
'favorites.apps.FavoritesConfig', 'favorites.apps.FavoritesConfig',
'rating.apps.RatingConfig', 'rating.apps.RatingConfig',
'tag.apps.TagConfig', 'tag.apps.TagConfig',
'transfer.apps.TransferConfig',
] ]
EXTERNAL_APPS = [ EXTERNAL_APPS = [
@ -155,16 +156,6 @@ DATABASES = {
'HOST': os.environ.get('DB_HOSTNAME'), 'HOST': os.environ.get('DB_HOSTNAME'),
'PORT': os.environ.get('DB_PORT'), 'PORT': os.environ.get('DB_PORT'),
}, },
'legacy': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '172.17.0.1',
# 'HOST': '172.23.0.1',
# 'HOST': 'mysql_db',
'PORT': 3306,
'NAME': 'dev',
'USER': 'dev',
'PASSWORD': 'octosecret123'
}
} }

View File

@ -43,7 +43,9 @@ THUMBNAIL_DEBUG = True
DATABASES.update({ DATABASES.update({
'legacy': { 'legacy': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
'HOST': 'mysql_db', 'HOST': '172.17.0.1',
# 'HOST': '172.23.0.1',
# 'HOST': 'mysql_db',
'PORT': 3306, 'PORT': 3306,
'NAME': 'dev', 'NAME': 'dev',
'USER': 'dev', 'USER': 'dev',