News search
This commit is contained in:
parent
729a77866d
commit
50a9622f78
|
|
@ -5,7 +5,6 @@ from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin
|
from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin
|
||||||
from random import sample as random_sample
|
|
||||||
|
|
||||||
|
|
||||||
class NewsType(models.Model):
|
class NewsType(models.Model):
|
||||||
|
|
|
||||||
|
|
@ -13,18 +13,26 @@ NewsIndex.settings(number_of_shards=1, number_of_replicas=1)
|
||||||
class NewsDocument(Document):
|
class NewsDocument(Document):
|
||||||
"""News document."""
|
"""News document."""
|
||||||
|
|
||||||
news_type = fields.NestedField(properties={
|
news_type = fields.ObjectField(properties={'id': fields.IntegerField(),
|
||||||
'id': fields.IntegerField(),
|
'name': fields.KeywordField()})
|
||||||
'name': fields.KeywordField()
|
title = fields.ObjectField(attr='title_indexing',
|
||||||
})
|
properties=OBJECT_FIELD_PROPERTIES)
|
||||||
title = fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES)
|
subtitle = fields.ObjectField(attr='subtitle_indexing',
|
||||||
subtitle = fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES)
|
properties=OBJECT_FIELD_PROPERTIES)
|
||||||
description = fields.ObjectField(properties=OBJECT_FIELD_PROPERTIES)
|
description = fields.ObjectField(attr='description_indexing',
|
||||||
country = fields.NestedField(properties={
|
properties=OBJECT_FIELD_PROPERTIES)
|
||||||
'id': fields.IntegerField(),
|
country = fields.ObjectField(properties={'id': fields.IntegerField(),
|
||||||
'code': fields.KeywordField()
|
'code': fields.KeywordField()})
|
||||||
})
|
|
||||||
web_url = fields.KeywordField(attr='web_url')
|
web_url = fields.KeywordField(attr='web_url')
|
||||||
|
tags = fields.ObjectField(
|
||||||
|
properties={
|
||||||
|
'id': fields.IntegerField(attr='metadata.id'),
|
||||||
|
'label': fields.ObjectField(attr='metadata.label_indexing',
|
||||||
|
properties=OBJECT_FIELD_PROPERTIES),
|
||||||
|
'category': fields.ObjectField(attr='metadata.category',
|
||||||
|
properties={'id': fields.IntegerField()})
|
||||||
|
},
|
||||||
|
multi=True)
|
||||||
|
|
||||||
class Django:
|
class Django:
|
||||||
|
|
||||||
|
|
@ -32,20 +40,19 @@ class NewsDocument(Document):
|
||||||
fields = (
|
fields = (
|
||||||
'id',
|
'id',
|
||||||
'playlist',
|
'playlist',
|
||||||
|
'start',
|
||||||
|
'end',
|
||||||
|
'slug',
|
||||||
|
'state',
|
||||||
|
'is_highlighted',
|
||||||
|
'image_url',
|
||||||
|
'preview_image_url',
|
||||||
|
'template',
|
||||||
)
|
)
|
||||||
related_models = [models.NewsType]
|
related_models = [models.NewsType]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().published()
|
return super().get_queryset().published().with_base_related()
|
||||||
|
|
||||||
def prepare_title(self, instance):
|
|
||||||
return instance.title
|
|
||||||
|
|
||||||
def prepare_subtitle(self, instance):
|
|
||||||
return instance.subtitle
|
|
||||||
|
|
||||||
def prepare_description(self, instance):
|
|
||||||
return instance.description
|
|
||||||
|
|
||||||
def get_instances_from_related(self, related_instance):
|
def get_instances_from_related(self, related_instance):
|
||||||
"""If related_models is set, define how to retrieve the Car instance(s) from the related model.
|
"""If related_models is set, define how to retrieve the Car instance(s) from the related model.
|
||||||
|
|
|
||||||
|
|
@ -1,45 +1,11 @@
|
||||||
"""Search indexes serializers."""
|
"""Search indexes serializers."""
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from django_elasticsearch_dsl_drf.serializers import DocumentSerializer
|
from django_elasticsearch_dsl_drf.serializers import DocumentSerializer
|
||||||
|
from news.serializers import NewsTypeSerializer
|
||||||
from search_indexes.documents import EstablishmentDocument, NewsDocument
|
from search_indexes.documents import EstablishmentDocument, NewsDocument
|
||||||
from search_indexes.utils import get_translated_value
|
from search_indexes.utils import get_translated_value
|
||||||
|
|
||||||
|
|
||||||
class NewsDocumentSerializer(DocumentSerializer):
|
|
||||||
"""News document serializer."""
|
|
||||||
|
|
||||||
title_translated = serializers.SerializerMethodField(allow_null=True)
|
|
||||||
subtitle_translated = serializers.SerializerMethodField(allow_null=True)
|
|
||||||
description_translated = serializers.SerializerMethodField(allow_null=True)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
"""Meta class."""
|
|
||||||
|
|
||||||
document = NewsDocument
|
|
||||||
fields = (
|
|
||||||
'id',
|
|
||||||
'title',
|
|
||||||
'subtitle',
|
|
||||||
'description',
|
|
||||||
'web_url',
|
|
||||||
'title_translated',
|
|
||||||
'subtitle_translated',
|
|
||||||
'description_translated',
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_title_translated(obj):
|
|
||||||
return get_translated_value(obj.title)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_subtitle_translated(obj):
|
|
||||||
return get_translated_value(obj.subtitle)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_description_translated(obj):
|
|
||||||
return get_translated_value(obj.description)
|
|
||||||
|
|
||||||
|
|
||||||
class TagsDocumentSerializer(serializers.Serializer):
|
class TagsDocumentSerializer(serializers.Serializer):
|
||||||
"""Tags serializer for ES Document."""
|
"""Tags serializer for ES Document."""
|
||||||
|
|
||||||
|
|
@ -64,6 +30,39 @@ class AddressDocumentSerializer(serializers.Serializer):
|
||||||
geo_lat = serializers.FloatField(allow_null=True, source='coordinates.lat')
|
geo_lat = serializers.FloatField(allow_null=True, source='coordinates.lat')
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
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):
|
class EstablishmentDocumentSerializer(DocumentSerializer):
|
||||||
"""Establishment document serializer."""
|
"""Establishment document serializer."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"""Search indexes app signals."""
|
"""Search indexes app signals."""
|
||||||
from django.db.models.signals import post_save, post_delete
|
from django.db.models.signals import post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django_elasticsearch_dsl.registries import registry
|
from django_elasticsearch_dsl.registries import registry
|
||||||
|
|
||||||
|
|
@ -17,17 +17,65 @@ def update_document(sender, **kwargs):
|
||||||
address__city__country=instance)
|
address__city__country=instance)
|
||||||
for establishment in establishments:
|
for establishment in establishments:
|
||||||
registry.update(establishment)
|
registry.update(establishment)
|
||||||
|
|
||||||
if model_name == 'city':
|
if model_name == 'city':
|
||||||
establishments = Establishment.objects.filter(
|
establishments = Establishment.objects.filter(
|
||||||
address__city=instance)
|
address__city=instance)
|
||||||
for establishment in establishments:
|
for establishment in establishments:
|
||||||
registry.update(establishment)
|
registry.update(establishment)
|
||||||
|
|
||||||
if model_name == 'address':
|
if model_name == 'address':
|
||||||
establishments = Establishment.objects.filter(
|
establishments = Establishment.objects.filter(
|
||||||
address=instance)
|
address=instance)
|
||||||
for establishment in establishments:
|
for establishment in establishments:
|
||||||
registry.update(establishment)
|
registry.update(establishment)
|
||||||
|
|
||||||
# todo: delete document
|
if app_label == 'establishment':
|
||||||
|
if model_name == 'establishmenttype':
|
||||||
|
establishments = Establishment.objects.filter(
|
||||||
|
establishment_type=instance)
|
||||||
|
for establishment in establishments:
|
||||||
|
registry.update(establishment)
|
||||||
|
if model_name == 'establishmentsubtype':
|
||||||
|
establishments = Establishment.objects.filter(
|
||||||
|
establishment_subtypes=instance)
|
||||||
|
for establishment in establishments:
|
||||||
|
registry.update(establishment)
|
||||||
|
|
||||||
|
if app_label == 'main':
|
||||||
|
if model_name == 'metadata':
|
||||||
|
establishments = Establishment.objects.filter(tags__metadata=instance)
|
||||||
|
for establishment in establishments:
|
||||||
|
registry.update(establishment)
|
||||||
|
if model_name == 'metadatacontent':
|
||||||
|
establishments = Establishment.objects.filter(tags=instance)
|
||||||
|
for establishment in establishments:
|
||||||
|
registry.update(establishment)
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(post_save)
|
||||||
|
def update_news(sender, **kwargs):
|
||||||
|
from news.models import News
|
||||||
|
app_label = sender._meta.app_label
|
||||||
|
model_name = sender._meta.model_name
|
||||||
|
instance = kwargs['instance']
|
||||||
|
|
||||||
|
if app_label == 'location':
|
||||||
|
if model_name == 'country':
|
||||||
|
qs = News.objects.filter(country=instance)
|
||||||
|
for news in qs:
|
||||||
|
registry.update(news)
|
||||||
|
|
||||||
|
if app_label == 'news':
|
||||||
|
if model_name == 'newstype':
|
||||||
|
qs = News.objects.filter(news_type=instance)
|
||||||
|
for news in qs:
|
||||||
|
registry.update(news)
|
||||||
|
|
||||||
|
if app_label == 'main':
|
||||||
|
if model_name == 'metadata':
|
||||||
|
qs = News.objects.filter(tags__metadata=instance)
|
||||||
|
for news in qs:
|
||||||
|
registry.update(news)
|
||||||
|
if model_name == 'metadatacontent':
|
||||||
|
qs = News.objects.filter(tags=instance)
|
||||||
|
for news in qs:
|
||||||
|
registry.update(news)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ class NewsDocumentViewSet(BaseDocumentViewSet):
|
||||||
|
|
||||||
filter_backends = [
|
filter_backends = [
|
||||||
filters.CustomSearchFilterBackend,
|
filters.CustomSearchFilterBackend,
|
||||||
|
FilteringFilterBackend,
|
||||||
]
|
]
|
||||||
|
|
||||||
search_fields = (
|
search_fields = (
|
||||||
|
|
@ -37,6 +38,16 @@ class NewsDocumentViewSet(BaseDocumentViewSet):
|
||||||
'description',
|
'description',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
filter_fields = {
|
||||||
|
'tag': {
|
||||||
|
'field': 'tags.id',
|
||||||
|
'lookups': [
|
||||||
|
constants.LOOKUP_QUERY_IN,
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'slug': 'slug',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class EstablishmentDocumentViewSet(BaseDocumentViewSet):
|
class EstablishmentDocumentViewSet(BaseDocumentViewSet):
|
||||||
"""Establishment document ViewSet."""
|
"""Establishment document ViewSet."""
|
||||||
|
|
@ -62,7 +73,13 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
|
||||||
'description',
|
'description',
|
||||||
)
|
)
|
||||||
filter_fields = {
|
filter_fields = {
|
||||||
'tag': 'tags.id',
|
'slug': 'slug',
|
||||||
|
'tag': {
|
||||||
|
'field': 'tags.id',
|
||||||
|
'lookups': [
|
||||||
|
constants.LOOKUP_QUERY_IN,
|
||||||
|
]
|
||||||
|
},
|
||||||
'toque_number': {
|
'toque_number': {
|
||||||
'field': 'toque_number',
|
'field': 'toque_number',
|
||||||
'lookups': [
|
'lookups': [
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user