gault-millau/apps/transfer/serializers/location.py
2019-10-26 09:35:09 +03:00

74 lines
2.1 KiB
Python

from rest_framework import serializers
from location.models import Country, Region
class CountrySerializer(serializers.ModelSerializer):
country_code_2 = serializers.CharField()
class Meta:
model = Country
fields = (
"country_code_2",
)
def validate(self, data):
data["code"] = self.get_country_code(data)
del(data['country_code_2'])
return data
def create(self, validated_data):
# Some countries already in database
country, _ = Country.objects.get_or_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()
class Meta:
model = Region
fields = (
"region_code",
"country_code_2",
"subregion_code"
)
def validate(self, data):
if "subregion" in data and data["subregion"] is not None:
try:
parent_region = Region.objects.get(code=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')
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'])
del(data['subregion_code'])
return data
def create(self, validated_data):
# Some regions may be already in database
try:
region, _ = Region.objects.get_or_create(**validated_data)
except Exception as e:
raise ValueError(f"{validated_data}: {e}")
return region
class CitySerializer(serializers.ModelSerializer):
pass