Search in all locales
This commit is contained in:
parent
ae53a18e08
commit
c71e7f10dd
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user