gault-millau/apps/transfer/serializers/location.py
2019-10-27 20:31:41 +03:00

165 lines
4.6 KiB
Python

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)
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_code(data)
data = self.set_country(data)
data = self.set_old_id(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)
return region
def set_code(self, data):
if "subregion_code" in data and data["subregion_code"] is not None:
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')
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()
subregion_code = serializers.CharField()
zip_code = serializers.CharField()
is_island = serializers.IntegerField()
name = serializers.CharField()
id = serializers.IntegerField()
class Meta:
model = City
fields = (
"country_code_2",
"subregion_code",
"zip_code",
"is_island",
"name",
"id"
)
def validate(self, data):
data = self.set_is_island(data)
data = self.set_code(data)
data = self.set_zip_code(data)
data = self.set_relations(data)
data = self.set_old_id(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('country_code_2')
return data
def set_relations(self, data):
try:
region = Region.objects.get(code=data['code'])
except:
try:
region = Region.objects.get(code=data['subregion_code'])
except Exception 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['code'])
except Exception as e:
raise ValueError(f"Region not found with {data}: {e}")
data['country'] = country
return data
def set_zip_code(self, data):
data['postal_code'] = data.pop('zip_code')
return data
def set_old_id(self, data):
data['old_id'] = data.pop('id')