diff --git a/apps/location/models.py b/apps/location/models.py index abf58da2..0b650bce 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -79,7 +79,6 @@ class City(models.Model): is_island = models.BooleanField(_('is island'), default=False) old_id = models.IntegerField(null=True, blank=True, default=None) - objects = CityQuerySet.as_manager() class Meta: diff --git a/apps/location/transfer_data.py b/apps/location/transfer_data.py index 6d6861cc..dca432e7 100644 --- a/apps/location/transfer_data.py +++ b/apps/location/transfer_data.py @@ -71,16 +71,20 @@ def transfer_regions(): def transfer_cities(): - queryset = Cities.objects.exclude(Q(region_code__isnull=True) | - Q(country_code_2__isnull=True) | - Q(region_code="") | - Q(country_code_2="")).only("id", "name", "region_code", - "country_code_2", "zip_code", "is_island").distinct() + 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 = 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(): - # serialized_data.save() - print(serialized_data.validated_data) + serialized_data.save() else: pprint(f"City serializer errors: {serialized_data.errors}") @@ -88,9 +92,9 @@ def transfer_cities(): data_types = { "dictionaries": [ transfer_countries, + transfer_regions, + transfer_cities ], "tmp": [ - transfer_regions, - # transfer_cities ] } diff --git a/apps/transfer/serializers/location.py b/apps/transfer/serializers/location.py index 5a95e223..11d809ec 100644 --- a/apps/transfer/serializers/location.py +++ b/apps/transfer/serializers/location.py @@ -99,8 +99,10 @@ class RegionSerializer(serializers.ModelSerializer): class CitySerializer(serializers.ModelSerializer): country_code_2 = serializers.CharField() - zip_code = serializers.CharField() - is_island = serializers.IntegerField() + region_code = serializers.CharField() + 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() id = serializers.IntegerField() @@ -108,6 +110,8 @@ class CitySerializer(serializers.ModelSerializer): model = City fields = ( "country_code_2", + "region_code", + "subregion_code", "zip_code", "is_island", "name", @@ -133,27 +137,35 @@ class CitySerializer(serializers.ModelSerializer): return data def set_code(self, data): - data['code'] = data.pop('country_code_2') + data['code'] = data.pop('region_code') return data def set_relations(self, data): try: - region = Region.objects.get(old_id=data['old_id']) + region = Region.objects.filter(code=data['region_code']).first() 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 + del(data['subregion_code']) try: - country = Country.objects.get(old_id=data['old_id']) + country = Country.objects.get(code=data['country_code_2']) 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 + del(data['country_code_2']) return data def set_zip_code(self, data): data['postal_code'] = data.pop('zip_code') + if data['postal_code'] is None: + data['postal_code'] = "" return data def set_old_id(self, data):