"""Search indexes serializers.""" from rest_framework import serializers from elasticsearch_dsl import AttrDict from django_elasticsearch_dsl_drf.serializers import DocumentSerializer from news.serializers import NewsTypeSerializer from search_indexes.documents import EstablishmentDocument, NewsDocument from search_indexes.documents.product import ProductDocument from search_indexes.utils import get_translated_value class TagsDocumentSerializer(serializers.Serializer): """Tags serializer for ES Document.""" id = serializers.IntegerField() label_translated = serializers.SerializerMethodField() def get_label_translated(self, obj): if isinstance(obj, dict): return get_translated_value(obj.get('label')) return get_translated_value(obj.label) class EstablishmentTypeSerializer(serializers.Serializer): """Establishment type serializer for ES Document""" id = serializers.IntegerField() name_translated = serializers.SerializerMethodField() index_name = serializers.CharField() def get_name_translated(self, obj): if isinstance(obj, dict): return get_translated_value(obj.get('name')) return get_translated_value(obj.name) class ProductSubtypeDocumentSerializer(serializers.Serializer): """Product subtype serializer for ES Document.""" id = serializers.IntegerField() name_translated = serializers.SerializerMethodField() def get_name_translated(self, obj): return get_translated_value(obj.name) class WineRegionCountryDocumentSerialzer(serializers.Serializer): """Wine region country ES document serializer.""" id = serializers.IntegerField() code = serializers.CharField() name_translated = serializers.SerializerMethodField() @staticmethod def get_name_translated(obj): return get_translated_value(obj.name) def get_attribute(self, instance): return instance.country if instance and instance.country else None class WineRegionDocumentSerializer(serializers.Serializer): """Wine region ES document serializer.""" id = serializers.IntegerField() name = serializers.CharField() country = WineRegionCountryDocumentSerialzer(allow_null=True) def get_attribute(self, instance): return instance.wine_region if instance and instance.wine_region else None class TagDocumentSerializer(serializers.Serializer): """Tag ES document serializer,""" id = serializers.IntegerField() label_translated = serializers.SerializerMethodField() index_name = serializers.CharField(source='value') @staticmethod def get_label_translated(obj): if isinstance(obj, dict): return get_translated_value(obj.get('label')) return get_translated_value(obj.label) class ProductTypeDocumentSerializer(serializers.Serializer): """Product type ES document serializer.""" id = serializers.IntegerField() index_name = serializers.CharField() name_translated = serializers.SerializerMethodField() @staticmethod def get_name_translated(obj): return get_translated_value(obj.name) class CityDocumentShortSerializer(serializers.Serializer): """City serializer for ES Document,""" id = serializers.IntegerField() code = serializers.CharField(allow_null=True) name = serializers.CharField() class CountryDocumentSerializer(serializers.Serializer): id = serializers.IntegerField() code = serializers.CharField(allow_null=True) svg_image = serializers.CharField() name_translated = serializers.SerializerMethodField() @staticmethod def get_name_translated(obj): return get_translated_value(obj.name) class AnotherCityDocumentShortSerializer(CityDocumentShortSerializer): country = CountryDocumentSerializer() def to_representation(self, instance): if instance != AttrDict(d={}) or \ (isinstance(instance, dict) and len(instance) != 0): return super().to_representation(instance) return None class ProductEstablishmentDocumentSerializer(serializers.Serializer): """Related to Product Establishment ES document serializer.""" id = serializers.IntegerField() name = serializers.CharField() slug = serializers.CharField() index_name = serializers.CharField() city = AnotherCityDocumentShortSerializer() class AddressDocumentSerializer(serializers.Serializer): """Address serializer for ES Document.""" id = serializers.IntegerField() city = CityDocumentShortSerializer() street_name_1 = serializers.CharField() street_name_2 = serializers.CharField() number = serializers.IntegerField() postal_code = serializers.CharField() latitude = serializers.FloatField(allow_null=True, source='coordinates.lat') longitude = serializers.FloatField(allow_null=True, source='coordinates.lon') geo_lon = serializers.FloatField(allow_null=True, source='coordinates.lon') geo_lat = serializers.FloatField(allow_null=True, source='coordinates.lat') # todo: refator def to_representation(self, instance): if instance != AttrDict(d={}) or \ (isinstance(instance, dict) and len(instance) != 0): return super().to_representation(instance) return None class ScheduleDocumentSerializer(serializers.Serializer): """Schedule serializer for ES Document""" id = serializers.IntegerField() weekday = serializers.IntegerField() weekday_display = serializers.CharField() closed_at = serializers.CharField() class InFavoritesMixin(DocumentSerializer): """Append in_favorites field.""" in_favorites = serializers.SerializerMethodField() def get_in_favorites(self, obj): request = self.context['request'] user = request.user if user.is_authenticated: return user.id in obj.favorites_for_users return False class Meta: """Meta class.""" _abstract = True class NewsDocumentSerializer(InFavoritesMixin, DocumentSerializer): """News document serializer.""" title_translated = serializers.SerializerMethodField(allow_null=True) subtitle_translated = serializers.SerializerMethodField(allow_null=True) news_type = NewsTypeSerializer() tags = TagsDocumentSerializer(many=True, source='visible_tags') class Meta: """Meta class.""" document = NewsDocument fields = ( 'id', 'title_translated', 'subtitle_translated', 'is_highlighted', 'image_url', 'preview_image_url', 'news_type', 'tags', 'slug', ) @staticmethod def get_title_translated(obj): return get_translated_value(obj.title) @staticmethod def get_subtitle_translated(obj): return get_translated_value(obj.subtitle) class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer): """Establishment document serializer.""" establishment_type = EstablishmentTypeSerializer() establishment_subtypes = EstablishmentTypeSerializer(many=True) address = AddressDocumentSerializer(allow_null=True) tags = TagsDocumentSerializer(many=True, source='visible_tags') schedule = ScheduleDocumentSerializer(many=True, allow_null=True) class Meta: """Meta class.""" document = EstablishmentDocument fields = ( 'id', 'name', 'transliterated_name', 'index_name', 'price_level', 'toque_number', 'public_mark', 'slug', 'preview_image', 'address', 'tags', 'schedule', 'works_noon', 'works_evening', 'works_at_weekday', # 'works_now', # 'collections', # 'establishment_type', # 'establishment_subtypes', ) class ProductDocumentSerializer(InFavoritesMixin, DocumentSerializer): """Product document serializer""" tags = TagsDocumentSerializer(many=True, source='related_tags') subtypes = ProductSubtypeDocumentSerializer(many=True, allow_null=True) wine_region = WineRegionDocumentSerializer(allow_null=True) wine_colors = TagDocumentSerializer(many=True) grape_variety = TagDocumentSerializer(many=True) product_type = ProductTypeDocumentSerializer(allow_null=True) establishment_detail = ProductEstablishmentDocumentSerializer(source='establishment', allow_null=True) class Meta: """Meta class.""" document = ProductDocument fields = ( 'id', 'category', 'preview_image_url', 'name', 'available', 'public_mark', 'slug', 'old_id', 'state', 'old_unique_key', 'vintage', 'tags', 'product_type', 'subtypes', 'wine_region', 'wine_colors', 'grape_variety', 'establishment_detail', 'average_price', )