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(allow_null=True, allow_blank=True) 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