# HG changeset patch # User Thierry Florac # Date 1543226916 -3600 # Node ID d1122192d6f89ae2f538bd53660e750d710e6ff5 # Parent b9885a695f88b42550c54a03cc6aefa2165484a1 User iterators to get query params diff -r b9885a695f88 -r d1122192d6f8 src/pyams_content_es/shared/view/__init__.py --- a/src/pyams_content_es/shared/view/__init__.py Mon Nov 26 10:16:04 2018 +0100 +++ b/src/pyams_content_es/shared/view/__init__.py Mon Nov 26 11:08:36 2018 +0100 @@ -14,14 +14,15 @@ from datetime import datetime -from elasticsearch_dsl import Search, Q +from elasticsearch_dsl import Q, Search from pyramid.threadlocal import get_current_registry from pyramid_es import get_client from pyams_catalog.query import CatalogResultSet -from pyams_content.shared.view.interfaces import IWfView, IViewQuery, IViewQueryEsParamsExtension, \ - IViewQueryFilterExtension -from pyams_utils.adapter import adapter_config, ContextAdapter +from pyams_content.features.search import ISearchFolder +from pyams_content.shared.view.interfaces import IViewQuery, IViewQueryEsParamsExtension, IViewQueryFilterExtension, \ + IViewUserQuery, IWfView +from pyams_utils.adapter import ContextAdapter, adapter_config from pyams_utils.list import unique_iter from pyams_utils.request import check_request from pyams_utils.timezone import tztime @@ -32,7 +33,7 @@ class EsViewQuery(ContextAdapter): """View query for Elasticsearch""" - def get_es_params(self, context): + def get_params(self, context): view = self.context registry = get_current_registry() # check publication dates @@ -47,11 +48,11 @@ do_search = True for name, adapter in sorted(registry.getAdapters((view,), IViewQueryEsParamsExtension), key=lambda x: x[1].weight): - new_params = adapter.get_es_params(context) - if isinstance(new_params, tuple): - new_params, do_search = new_params - if new_params: - params &= new_params + for new_params in adapter.get_es_params(context): + if isinstance(new_params, tuple): + new_params, do_search = new_params + if new_params: + params &= new_params if not do_search: break # activate search @@ -72,7 +73,7 @@ request = check_request() registry = request.registry client = get_client(request) - params = self.get_es_params(context) + params = self.get_params(context) search = Search(using=client.es, index=client.index) \ .query(params) \ .sort({ @@ -89,3 +90,29 @@ key=lambda x: x[1].weight): items = adapter.filter(context, items) return unique_iter(items) + + +@adapter_config(name='es', context=ISearchFolder, provides=IViewQuery) +class EsSearchFolderQuery(EsViewQuery): + """Search folder view query for Elasticsearch""" + + def get_params(self, context): + params = super(EsSearchFolderQuery, self).get_params(context) + request = check_request() + registry = request.registry + for name, adapter in registry.getAdapters((self,), IViewUserQuery): + for user_param in adapter.get_user_params(request): + params &= user_param + return params + + +@adapter_config(name='user_search', context=EsSearchFolderQuery, provides=IViewUserQuery) +class EsSearchFolderUserQuery(ContextAdapter): + """Search folder user query for Elasticsearch""" + + @staticmethod + def get_user_params(request): + params = request.params + fulltext = params.get('user_search') + if fulltext is not None: + yield Q('simple_query_string', **{'query': fulltext})