diff --git a/apps/location/transfer_data.py b/apps/location/transfer_data.py index cb8402ad..e79135ad 100644 --- a/apps/location/transfer_data.py +++ b/apps/location/transfer_data.py @@ -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() ] + } diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index d2387d0d..77ed7e4c 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -28,7 +28,8 @@ class Command(BaseCommand): LONG_DATA_TYPES = [ 'update_country_flag', - 'comment' + 'comment', + 'update_city_info' ] def handle(self, *args, **options): diff --git a/apps/transfer/serializers/location.py b/apps/transfer/serializers/location.py index 4e05897d..5ce82d4f 100644 --- a/apps/transfer/serializers/location.py +++ b/apps/transfer/serializers/location.py @@ -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