diff --git a/apps/search_indexes/documents/product.py b/apps/search_indexes/documents/product.py index d2d8be42..a182cad2 100644 --- a/apps/search_indexes/documents/product.py +++ b/apps/search_indexes/documents/product.py @@ -22,12 +22,30 @@ class ProductDocument(Document): }) subtypes = fields.ObjectField( properties={ + 'id': fields.IntegerField(), 'name': fields.ObjectField(attr='name_indexing', properties=OBJECT_FIELD_PROPERTIES), 'index_name': fields.KeywordField(), }, multi=True ) + establishment = fields.ObjectField( + properties={ + 'id': fields.IntegerField(), + 'name': fields.KeywordField(), + 'slug': fields.KeywordField(), + # 'city' TODO: city indexing + } + ) + wine_colors = fields.ObjectField( + properties={ + 'id': fields.IntegerField(), + 'label': fields.ObjectField(attr='label_indexing', properties=OBJECT_FIELD_PROPERTIES), + 'value': fields.KeywordField(), + }, + multi=True, + ) wine_region = fields.ObjectField(properties={ + 'id': fields.IntegerField(), 'name': fields.KeywordField(), 'country': fields.ObjectField(properties={ 'id': fields.IntegerField(), @@ -71,6 +89,7 @@ class ProductDocument(Document): }) tags = fields.ObjectField( properties={ + 'id': fields.IntegerField(), 'label': fields.ObjectField(attr='label_indexing', properties=OBJECT_FIELD_PROPERTIES), 'value': fields.KeywordField(), }, diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index cb16a514..e83e8413 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -20,6 +20,62 @@ class TagsDocumentSerializer(serializers.Serializer): return get_translated_value(obj.label) +class ProductSubtypeDocumentSerializer(serializers.Serializer): + """Product subtype serializer for ES Document.""" + + id = serializers.IntegerField() + name_translated = serializers.SerializerMethodField() + + @staticmethod + def get_name_translted(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 + + +class WineRegionDocumentSerializer(serializers.Serializer): + """Wine region ES document serializer.""" + + id = serializers.IntegerField() + name = serializers.CharField() + country = WineRegionCountryDocumentSerialzer(allow_null=True) + + +class WineColorDocumentSerializer(serializers.Serializer): + """Wine color 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 ProductEstablishmentDocumentSerializer(serializers.Serializer): + """Related to Product Establishment ES document serializer.""" + + id = serializers.IntegerField() + name = serializers.CharField() + slug = serializers.CharField() + + class CityDocumentShortSerializer(serializers.Serializer): """City serializer for ES Document,""" @@ -129,6 +185,17 @@ class EstablishmentDocumentSerializer(DocumentSerializer): class ProductDocumentSerializer(DocumentSerializer): """Product document serializer""" + tags = TagsDocumentSerializer(many=True) + subtypes = ProductSubtypeDocumentSerializer(many=True) + wine_region = WineRegionDocumentSerializer(allow_null=True) + wine_colors = WineColorDocumentSerializer(many=True) + product_type = serializers.SerializerMethodField() + establishment_detail = ProductEstablishmentDocumentSerializer(source='establishment', allow_null=True) + + @staticmethod + def get_product_type(obj): + return get_translated_value(obj.product_type.name if obj.product_type else {}) + class Meta: """Meta class.""" @@ -143,5 +210,11 @@ class ProductDocumentSerializer(DocumentSerializer): 'old_id', 'state', 'old_unique_key', - 'vintage' + 'vintage', + 'tags', + 'product_type', + 'subtypes', + 'wine_region', + 'wine_colors', + 'establishment_detail', ) diff --git a/apps/search_indexes/urls.py b/apps/search_indexes/urls.py index ce568013..70e21369 100644 --- a/apps/search_indexes/urls.py +++ b/apps/search_indexes/urls.py @@ -8,7 +8,7 @@ router = routers.SimpleRouter() router.register(r'establishments', views.EstablishmentDocumentViewSet, basename='establishment') router.register(r'mobile/establishments', views.EstablishmentDocumentViewSet, basename='establishment-mobile') router.register(r'news', views.NewsDocumentViewSet, basename='news') -router.register(r'product', views.ProductDocumentViewSet, basename='product') +router.register(r'products', views.ProductDocumentViewSet, basename='product') urlpatterns = router.urls diff --git a/apps/search_indexes/views.py b/apps/search_indexes/views.py index 2a9d7537..bc17be7a 100644 --- a/apps/search_indexes/views.py +++ b/apps/search_indexes/views.py @@ -205,9 +205,16 @@ class ProductDocumentViewSet(BaseDocumentViewSet): serializer_class = serializers.ProductDocumentSerializer ordering = ('id',) + # def get_queryset(self): + # qs = super(ProductDocumentViewSet, self).get_queryset() + # qs = qs.filter('match', is_publish=True) + # return qs + filter_backends = [ - filters.CustomSearchFilterBackend, FilteringFilterBackend, + filters.CustomSearchFilterBackend, + GeoSpatialFilteringFilterBackend, + DefaultOrderingFilterBackend, ] search_fields = { @@ -216,4 +223,11 @@ class ProductDocumentViewSet(BaseDocumentViewSet): ) filter_fields = { + 'slug': 'slug', + 'tag': { + 'field': 'tags.id', + 'lookups': [constants.LOOKUP_QUERY_IN] + }, + } + geo_spatial_filter_fields = { } \ No newline at end of file