275 lines
8.5 KiB
Python
275 lines
8.5 KiB
Python
"""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 NewsDocumentSerializer(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(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(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',
|
|
)
|