Search in all locales
This commit is contained in:
parent
ae53a18e08
commit
c71e7f10dd
|
|
@ -1,19 +1,22 @@
|
||||||
"""Search indexes filters."""
|
"""Search indexes filters."""
|
||||||
from elasticsearch_dsl.query import Q
|
from elasticsearch_dsl.query import Q
|
||||||
from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend
|
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):
|
class CustomSearchFilterBackend(SearchFilterBackend):
|
||||||
"""Custom SearchFilterBackend."""
|
"""Custom SearchFilterBackend."""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_field_name(view, field):
|
def search_among_all_locales(view, search_kwargs: dict):
|
||||||
field_name = field
|
|
||||||
if hasattr(view, 'search_fields') and hasattr(view, 'translated_search_fields'):
|
if hasattr(view, 'search_fields') and hasattr(view, 'translated_search_fields'):
|
||||||
|
all_supported_locales = OBJECT_FIELD_PROPERTIES.keys()
|
||||||
|
fields = search_kwargs.copy().keys()
|
||||||
|
for field in fields:
|
||||||
if field in view.translated_search_fields:
|
if field in view.translated_search_fields:
|
||||||
field_name = f'{field}.{get_current_locale()}'
|
value = search_kwargs.pop(field)
|
||||||
return field_name
|
search_kwargs.update({f'{field}.{locale}': value for locale in all_supported_locales})
|
||||||
|
|
||||||
|
|
||||||
def construct_search(self, request, view):
|
def construct_search(self, request, view):
|
||||||
"""Construct search.
|
"""Construct search.
|
||||||
|
|
@ -54,28 +57,42 @@ class CustomSearchFilterBackend(SearchFilterBackend):
|
||||||
field, value = __values
|
field, value = __values
|
||||||
if field in view.search_fields:
|
if field in view.search_fields:
|
||||||
# Initial kwargs for the match query
|
# 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
|
# In case if we deal with structure 2
|
||||||
if isinstance(view.search_fields, dict):
|
if isinstance(view.search_fields, dict):
|
||||||
extra_field_kwargs = view.search_fields[field]
|
extra_field_kwargs = view.search_fields[field]
|
||||||
if extra_field_kwargs:
|
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
|
# The match query
|
||||||
|
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(
|
__queries.append(
|
||||||
Q("match", **field_kwargs)
|
Q("match", **field_kwargs)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
for field in view.search_fields:
|
for field in view.search_fields:
|
||||||
# Initial kwargs for the match query
|
# 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
|
# In case if we deal with structure 2
|
||||||
if isinstance(view.search_fields, dict):
|
if isinstance(view.search_fields, dict):
|
||||||
extra_field_kwargs = view.search_fields[field]
|
extra_field_kwargs = view.search_fields[field]
|
||||||
if extra_field_kwargs:
|
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
|
# The match query
|
||||||
|
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(
|
__queries.append(
|
||||||
Q("match", **field_kwargs)
|
Q("match", **field_kwargs)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user