gault-millau/apps/transfer/serializers/reviews.py
littlewolf c8554772f1 Fix review published_at
Add old_id
Add description to establishment
2019-10-31 10:05:00 +03:00

214 lines
7.2 KiB
Python

from rest_framework import serializers
from review.models import Review
from account.models import User
from translation.models import Language
from establishment.models import Establishment
class ReviewSerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
reviewer_id = serializers.IntegerField()
vintage = serializers.IntegerField()
published = serializers.DateTimeField()
published_at = serializers.DateTimeField(allow_null=True)
establishment_id = serializers.IntegerField()
text = serializers.CharField()
locale = serializers.CharField()
aasm_state = serializers.CharField(allow_null=True)
class Meta:
model = Review
fields = (
"id", "reviewer_id", "published", "vintage",
"establishment_id", "text", "locale",
"published_at", "aasm_state"
)
def validate(self, data):
data = self.set_old_id(data)
data = self.set_published_at(data)
data = self.set_reviewer(data)
data = self.set_establishment(data)
data = self.set_language(data)
data = self.set_published(data)
return data
def create(self, validated_data):
try:
return Review.objects.create(**validated_data)
except Exception as e:
raise ValueError(f"Error creating review with {validated_data}: {e}")
def set_old_id(self, data):
data['old_id'] = data.pop("id")
return data
def set_reviewer(self, data):
try:
data['reviewer'] = User.objects.get(old_id=data['reviewer_id'])
except User.DoesNotExist as e:
raise ValueError(f"Cannot find reviewer with {data}: {e}")
del(data['reviewer_id'])
return data
def set_establishment(self, data):
try:
data['content_object'] = Establishment.objects.get(old_id=data.pop('establishment_id'))
except Establishment.DoesNotExist as e:
raise ValueError(f"Cannot find review establishment with {data}: {e}")
return data
def set_language(self, data):
try:
data['language'] = Language.objects.get(locale=data['locale'])
except Language.DoesNotExist as e:
raise ValueError(f"Cannot find language with {data}: {e}")
del(data['locale'])
return data
def set_published(self, data):
data['published_at'] = data.pop("published")
return data
def set_published_at(self, data):
if "aasm_state" in data and data['aasm_state'] is not None and data['aasm_state'] == "published":
data['status'] = Review.READY
del(data['aasm_state'])
return data
class LanguageSerializer(serializers.ModelSerializer):
LANGUAGES = {
"be-BE": "Belarusian - Belarusia",
"el-GR": "Greek - Greek",
"he-IL": "Israel - Hebrew",
"hr-HR": "Croatia - Croatian",
"hu-HU": "Hangarian - Hungary",
"ja-JP": "Japanese - Japan",
"ka-GE": "Georgian - Georgia",
"pl-PL": "Polish - Poland",
"ro-RO": "Romainian - Romania",
"ru-RU": "Russian - Russia",
"sl-SI": "Slovenian - Slovenia",
"ar-DZ": "Arabic - Algeria",
"ar-BH": "Arabic - Bahrain",
"ar-EG": "Arabic - Egypt",
"ar-IQ": "Arabic - Iraq",
"ar-JO": "Arabic - Jordan",
"ar-KW": "Arabic - Kuwait",
"ar-LB": "Arabic - Lebanon",
"ar-LY": "Arabic - Libya",
"ar-MA": "Arabic - Morocco",
"ar-OM": "Arabic - Oman",
"ar-QA": "Arabic - Qatar",
"ar-SA": "Arabic - Saudi Arabia",
"ar-SY": "Arabic - Syria",
"ar-TN": "Arabic - Tunisia",
"ar-AE": "Arabic - United Arab Emirates",
"ar-YE": "Arabic - Yemen",
"az-AZ": "Azeri - Cyrillic",
"zh-CN": "Chinese - China",
"zh-HK": "Chinese - Hong Kong SAR",
"zh-MO": "Chinese - Macau SAR",
"zh-SG": "Chinese - Singapore",
"zh-TW": "Chinese - Taiwan",
"nl-BE": "Dutch - Belgium",
"nl-NL": "Dutch - Netherlands",
"en-AU": "English - Australia",
"en-BZ": "English - Belize",
"en-CA": "English - Canada",
"en-CB": "English - Caribbean",
"en-GB": "English - Great Britain",
"en-IN": "English - India",
"en-IE": "English - Ireland",
"en-JM": "English - Jamaica",
"en-NZ": "English - New Zealand",
"en-PH": "English - Phillippines",
"en-ZA": "English - Southern Africa",
"en-TT": "English - Trinidad",
"en-US": "English - United States",
"fr-BE": "French - Belgium",
"fr-CA": "French - Canada",
"fr-FR": "French - France",
"fr-LU": "French - Luxembourg",
"fr-CH": "French - Switzerland",
"fr-MA": "French - Morocco",
"gd-IE": "Gaelic - Ireland",
"de-AT": "German - Austria",
"de-DE": "German - Germany",
"de-LI": "German - Liechtenstein",
"de-LU": "German - Luxembourg",
"de-CH": "German - Switzerland",
"it-IT": "Italian - Italy",
"it-CH": "Italian - Switzerland",
"ms-BN": "Malay - Brunei",
"ms-MY": "Malay - Malaysia",
"no-NO": "Norwegian - Bokml",
"pt-BR": "Portuguese - Brazil",
"pt-PT": "Portuguese - Portugal",
"ro-MO": "Romanian - Moldova",
"ru-MO": "Russian - Moldova",
"sr-SP": "Serbian - Cyrillic",
"es-AR": "Spanish - Argentina",
"es-BO": "Spanish - Bolivia",
"es-CL": "Spanish - Chile",
"es-CO": "Spanish - Colombia",
"es-CR": "Spanish - Costa Rica",
"es-DO": "Spanish - Dominican Republic",
"es-EC": "Spanish - Ecuador",
"es-SV": "Spanish - El Salvador",
"es-GT": "Spanish - Guatemala",
"es-HN": "Spanish - Honduras",
"es-MX": "Spanish - Mexico",
"es-NI": "Spanish - Nicaragua",
"es-PA": "Spanish - Panama",
"es-PY": "Spanish - Paraguay",
"es-PE": "Spanish - Peru",
"es-PR": "Spanish - Puerto Rico",
"es-ES": "Spanish - Spain (Traditional)",
"es-UY": "Spanish - Uruguay",
"es-VE": "Spanish - Venezuela",
"sv-FI": "Swedish - Finland",
"sv-SE": "Swedish - Sweden",
"uz-UZ": "Uzbek - Cyrillic",
}
id = serializers.CharField()
locale = serializers.CharField()
class Meta:
model = Language
fields = ("locale", "id")
def validate(self, data):
data = self.set_old_id(data)
data = self.set_locale(data)
return data
def create(self, validated_data):
try:
locale = Language.objects.filter(locale=validated_data['locale']).first()
if locale is None:
raise Language.DoesNotExist
locale.old_id = validated_data['old_id']
locale.save()
except Language.DoesNotExist:
locale = Language.objects.create(**validated_data)
return locale
def set_locale(self, data):
data['locale'] = data['locale'].replace("_", "-")
try:
data['title'] = self.LANGUAGES[data['locale']]
except Exception as e:
raise ValueError(f"{data}: {e}")
return data
def set_old_id(self, data):
data['old_id'] = data.pop("id")
return data