from rest_framework import serializers from location.models import Country, Region, City class CountrySerializer(serializers.ModelSerializer): country_code_2 = serializers.CharField() id = serializers.IntegerField() class Meta: model = Country fields = ( "id", "country_code_2", ) def validate(self, data): data["code"] = self.get_country_code(data) del(data['country_code_2']) data['old_id'] = data.pop('id') return data def create(self, validated_data): # Some countries already in database try: country = Country.objects.get(code=validated_data['code']) except Country.DoesNotExist: country = Country.objects.create(**validated_data) return country def get_country_code(self, obj): return obj.get("country_code_2") class RegionSerializer(serializers.ModelSerializer): region_code = serializers.CharField() subregion_code = serializers.CharField(allow_null=True, allow_blank=True) country_code_2 = serializers.CharField() id = serializers.IntegerField() class Meta: model = Region fields = ( "region_code", "country_code_2", "subregion_code", "id" ) def validate(self, data): data = self.set_old_id(data) data = self.set_code(data) data = self.set_country(data) return data def create(self, validated_data): # Some regions may be already in database try: region = Region.objects.get(old_id=validated_data['old_id']) except Region.DoesNotExist: region = Region.objects.create(**validated_data) except Exception as e: raise ValueError(f"REGION ERROR: {validated_data}: {e}") 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.get(code=str(data['region_code'])) except Exception as e: raise ValueError(f"Parent region error with {data}: {e}") data['parent_region'] = parent_region data['code'] = data.pop('subregion_code') del(data['region_code']) else: data['code'] = data.pop('region_code') del(data['subregion_code']) return data def set_country(self, data): try: country = Country.objects.get(code=data['country_code_2']) except Exception as e: raise ValueError(f"Country error with {data}: {e}") data["country"] = country del(data['country_code_2']) return data def set_old_id(self, data): data['old_id'] = data.pop("id") return data class CitySerializer(serializers.ModelSerializer): country_code_2 = serializers.CharField() 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() class Meta: model = City fields = ( "country_code_2", "region_code", "subregion_code", "zip_code", "is_island", "name", "id" ) def validate(self, data): data = self.set_old_id(data) data = self.set_relations(data) data = self.set_is_island(data) data = self.set_code(data) data = self.set_zip_code(data) return data def create(self, validated_data): return City.objects.create(**validated_data) def set_is_island(self, data): data['is_island'] = True if "is_island" in data \ and data['is_island'] is not None \ and data['is_island'] > 0 \ else False return data def set_code(self, data): data['code'] = data.pop('region_code') return data def set_relations(self, data): try: region = Region.objects.filter(code=data['region_code']).first() except Region.DoesNotExist as 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(code=data['country_code_2']) except Country.DoesNotExist as 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): data['old_id'] = data.pop('id') return data