gault-millau/apps/search_indexes/documents/product.py
2019-11-13 18:43:30 +03:00

118 lines
3.7 KiB
Python

"""Product app documents."""
from django.conf import settings
from django_elasticsearch_dsl import Document, Index, fields
from search_indexes.utils import OBJECT_FIELD_PROPERTIES
from product import models
ProductIndex = Index(settings.ELASTICSEARCH_INDEX_NAMES.get(__name__, 'product'))
ProductIndex.settings(number_of_shards=1, number_of_replicas=1)
@ProductIndex.doc_type
class ProductDocument(Document):
"""Product document."""
@staticmethod
def _get_standard_properties():
return {
'name': fields.KeywordField(),
'standard_type': fields.IntegerField(),
'coordinates': fields.GeoPointField(),
}
@staticmethod
def _get_country_properties():
return {
'id': fields.IntegerField(),
'name': fields.ObjectField(attr='name_indexing',
properties=OBJECT_FIELD_PROPERTIES),
'code': fields.KeywordField(),
}
@staticmethod
def _get_tags_properties():
return {
'label': fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES),
'value': fields.KeywordField(),
'category': fields.ObjectField(properties={
'label': fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES),
'public': fields.BooleanField(),
'index_name': fields.KeywordField(),
'value_type': fields.KeywordField(),
'country': fields.ObjectField(properties=ProductDocument._get_country_properties()),
}),
}
description = fields.ObjectField(attr='description_indexing',
properties=OBJECT_FIELD_PROPERTIES)
product_type = fields.ObjectField(properies={
'id': fields.IntegerField(),
'name': fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES),
'index_name': fields.KeywordField(),
'use_subtypes': fields.BooleanField(),
})
subtypes = fields.ObjectField(
properties={
'name': fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES),
'index_name': fields.KeywordField(),
},
multi=True
)
# TODO establishment
wine_region = fields.ObjectField(properties={
'name': fields.KeywordField(),
'country': fields.ObjectField(properties=_get_country_properties()),
'coordinates': fields.GeoPointField(),
'description': fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES),
})
wine_sub_region = fields.ObjectField(properties={'name': fields.KeywordField()})
classifications = fields.ObjectField( # TODO
properties={
'classification_type': fields.ObjectField(properties={}),
'standard': fields.ObjectField(properties=_get_standard_properties()),
'tags': fields.ObjectField(
properties=_get_tags_properties(),
multi=True
),
},
multi=True
)
standards = fields.ObjectField(
properties=_get_standard_properties(),
multi=True
)
wine_village = fields.ObjectField(properties={
'name': fields.KeywordField(),
})
tags = fields.ObjectField(
properties=_get_tags_properties(),
multi=True
)
class Django:
model = models.Product
fields = (
'id',
'category',
'name',
'available',
'public_mark',
'slug',
'old_id',
'state',
'old_unique_key',
'vintage',
)
related_models = [models.ProductType]
def get_queryset(self):
return super().get_queryset().published().with_base_related()