diff --git a/apps/search_indexes/filters.py b/apps/search_indexes/filters.py index 93208a71..a29c186a 100644 --- a/apps/search_indexes/filters.py +++ b/apps/search_indexes/filters.py @@ -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 \ No newline at end of file