Search in all locales

This commit is contained in:
Kuroshini 2019-10-16 14:11:07 +03:00
parent ae53a18e08
commit c71e7f10dd

View File

@ -1,19 +1,22 @@
"""Search indexes filters."""
from elasticsearch_dsl.query import Q
from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend
from utils.models import get_current_locale
from search_indexes.utils import OBJECT_FIELD_PROPERTIES
class CustomSearchFilterBackend(SearchFilterBackend):
"""Custom SearchFilterBackend."""
@staticmethod
def get_field_name(view, field):
field_name = field
def search_among_all_locales(view, search_kwargs: dict):
if hasattr(view, 'search_fields') and hasattr(view, 'translated_search_fields'):
if field in view.translated_search_fields:
field_name = f'{field}.{get_current_locale()}'
return field_name
all_supported_locales = OBJECT_FIELD_PROPERTIES.keys()
fields = search_kwargs.copy().keys()
for field in fields:
if field in view.translated_search_fields:
value = search_kwargs.pop(field)
search_kwargs.update({f'{field}.{locale}': value for locale in all_supported_locales})
def construct_search(self, request, view):
"""Construct search.
@ -54,29 +57,43 @@ class CustomSearchFilterBackend(SearchFilterBackend):
field, value = __values
if field in view.search_fields:
# Initial kwargs for the match query
field_kwargs = {self.get_field_name(view, field): {'query': value}}
field_kwargs = {field: {'query': value}}
# In case if we deal with structure 2
if isinstance(view.search_fields, dict):
extra_field_kwargs = view.search_fields[field]
if extra_field_kwargs:
field_kwargs[self.get_field_name(view, field)].update(extra_field_kwargs)
field_kwargs[field].update(extra_field_kwargs)
# The match query
__queries.append(
Q("match", **field_kwargs)
)
self.search_among_all_locales(view, field_kwargs)
if len(field_kwargs.keys()) > 1:
for k, v in field_kwargs.items():
__queries.append(
Q("match", **{k: v})
)
else:
__queries.append(
Q("match", **field_kwargs)
)
else:
for field in view.search_fields:
# Initial kwargs for the match query
field_kwargs = {self.get_field_name(view, field): {'query': search_term}}
field_kwargs = {field: {'query': search_term}}
# In case if we deal with structure 2
if isinstance(view.search_fields, dict):
extra_field_kwargs = view.search_fields[field]
if extra_field_kwargs:
field_kwargs[self.get_field_name(view, field)].update(extra_field_kwargs)
field_kwargs[field].update(extra_field_kwargs)
# The match query
__queries.append(
Q("match", **field_kwargs)
)
self.search_among_all_locales(view, field_kwargs)
if len(field_kwargs.keys()) > 1:
for k, v in field_kwargs.items():
__queries.append(
Q("match", **{k: v})
)
else:
__queries.append(
Q("match", **field_kwargs)
)
return __queries