Fix and add city transfer

This commit is contained in:
littlewolf 2019-10-28 07:19:17 +03:00
parent 255b1ad5f1
commit 25d58a8bc5
3 changed files with 33 additions and 18 deletions

View File

@ -79,7 +79,6 @@ class City(models.Model):
is_island = models.BooleanField(_('is island'), default=False) is_island = models.BooleanField(_('is island'), default=False)
old_id = models.IntegerField(null=True, blank=True, default=None) old_id = models.IntegerField(null=True, blank=True, default=None)
objects = CityQuerySet.as_manager() objects = CityQuerySet.as_manager()
class Meta: class Meta:

View File

@ -71,16 +71,20 @@ def transfer_regions():
def transfer_cities(): def transfer_cities():
queryset = Cities.objects.exclude(Q(region_code__isnull=True) | queryset = Cities.objects.raw("""SELECT cities.id, cities.name, cities.country_code_2, cities.zip_code,
Q(country_code_2__isnull=True) | cities.is_island, cities.region_code, cities.subregion_code
Q(region_code="") | FROM cities WHERE
Q(country_code_2="")).only("id", "name", "region_code", region_code IS NOT NULL AND
"country_code_2", "zip_code", "is_island").distinct() region_code != "" AND
country_code_2 IS NOT NULL AND
country_code_2 != ""
""")
serialized_data = CitySerializer(data=list(queryset.values()), many=True) queryset = [vars(query) for query in queryset]
serialized_data = CitySerializer(data=queryset, many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
# serialized_data.save() serialized_data.save()
print(serialized_data.validated_data)
else: else:
pprint(f"City serializer errors: {serialized_data.errors}") pprint(f"City serializer errors: {serialized_data.errors}")
@ -88,9 +92,9 @@ def transfer_cities():
data_types = { data_types = {
"dictionaries": [ "dictionaries": [
transfer_countries, transfer_countries,
transfer_regions,
transfer_cities
], ],
"tmp": [ "tmp": [
transfer_regions,
# transfer_cities
] ]
} }

View File

@ -99,8 +99,10 @@ class RegionSerializer(serializers.ModelSerializer):
class CitySerializer(serializers.ModelSerializer): class CitySerializer(serializers.ModelSerializer):
country_code_2 = serializers.CharField() country_code_2 = serializers.CharField()
zip_code = serializers.CharField() region_code = serializers.CharField()
is_island = serializers.IntegerField() subregion_code = serializers.CharField(allow_null=True, allow_blank=True)
zip_code = serializers.CharField(allow_null=True, allow_blank=True)
is_island = serializers.IntegerField(allow_null=True)
name = serializers.CharField() name = serializers.CharField()
id = serializers.IntegerField() id = serializers.IntegerField()
@ -108,6 +110,8 @@ class CitySerializer(serializers.ModelSerializer):
model = City model = City
fields = ( fields = (
"country_code_2", "country_code_2",
"region_code",
"subregion_code",
"zip_code", "zip_code",
"is_island", "is_island",
"name", "name",
@ -133,27 +137,35 @@ class CitySerializer(serializers.ModelSerializer):
return data return data
def set_code(self, data): def set_code(self, data):
data['code'] = data.pop('country_code_2') data['code'] = data.pop('region_code')
return data return data
def set_relations(self, data): def set_relations(self, data):
try: try:
region = Region.objects.get(old_id=data['old_id']) region = Region.objects.filter(code=data['region_code']).first()
except Region.DoesNotExist as e: except Region.DoesNotExist as e:
raise ValueError(f"Region not found with {data}: {e}") try:
region = Region.objects.filter(code=data['subregion_code']).first()
except Region.DoesNotExist as e:
raise ValueError(f"Region not found with {data}: {e}")
data['region'] = region data['region'] = region
del(data['subregion_code'])
try: try:
country = Country.objects.get(old_id=data['old_id']) country = Country.objects.get(code=data['country_code_2'])
except Country.DoesNotExist as e: except Country.DoesNotExist as e:
raise ValueError(f"Region not found with {data}: {e}") raise ValueError(f"Country not found with {data}: {e}")
data['country'] = country data['country'] = country
del(data['country_code_2'])
return data return data
def set_zip_code(self, data): def set_zip_code(self, data):
data['postal_code'] = data.pop('zip_code') data['postal_code'] = data.pop('zip_code')
if data['postal_code'] is None:
data['postal_code'] = ""
return data return data
def set_old_id(self, data): def set_old_id(self, data):