# HG changeset patch # User Thierry Florac # Date 1544790810 -3600 # Node ID 23855cc6ae6d67acbef882ce90ec4a325f3f0321 # Parent 6387a1195db4bc8da207a2e7be25f69c4c534c72 Update views and search engine so that results displayed in a view component can be excluded from other search results diff -r 6387a1195db4 -r 23855cc6ae6d src/pyams_content_es/shared/view/__init__.py --- a/src/pyams_content_es/shared/view/__init__.py Fri Dec 14 11:12:42 2018 +0100 +++ b/src/pyams_content_es/shared/view/__init__.py Fri Dec 14 13:33:30 2018 +0100 @@ -22,6 +22,7 @@ from pyams_content.features.search import ISearchFolder from pyams_content.shared.view.interfaces import IViewQuery, IViewQueryEsParamsExtension, IViewQueryFilterExtension, \ IViewUserQuery, IWfView, RELEVANCE_ORDER +from pyams_content.shared.view.portlet import SEARCH_EXCLUDED_ITEMS from pyams_utils.adapter import ContextAdapter, adapter_config from pyams_utils.list import unique_iter from pyams_utils.timezone import tztime @@ -103,6 +104,10 @@ return unique_iter(items), search.count() +# +# Custom search folders extensions +# + @adapter_config(name='es', context=ISearchFolder, provides=IViewQuery) class EsSearchFolderQuery(EsViewQuery): """Search folder view query for Elasticsearch""" @@ -116,9 +121,27 @@ return params +@adapter_config(name='exclusions', context=EsSearchFolderQuery, provides=IViewUserQuery) +class EsSearchFolderExclusionsQuery(ContextAdapter): + """Search folder exclusions for Elasticsearch + + This adapter is looking into request's annotations for items which should be excluded + from search. + """ + + @staticmethod + def get_user_params(request): + excluded_items = request.annotations.get(SEARCH_EXCLUDED_ITEMS) + if excluded_items: + yield Q('bool', must_not=Q('terms', **{'reference_id': tuple(excluded_items)})) + + @adapter_config(name='user_search', context=EsSearchFolderQuery, provides=IViewUserQuery) class EsSearchFolderUserQuery(ContextAdapter): - """Search folder user query for Elasticsearch""" + """Search folder user query for Elasticsearch + + This adapter is looking for any fulltext search entered by user + """ @staticmethod def get_user_params(request): diff -r 6387a1195db4 -r 23855cc6ae6d src/pyams_content_es/shared/view/reference.py --- a/src/pyams_content_es/shared/view/reference.py Fri Dec 14 11:12:42 2018 +0100 +++ b/src/pyams_content_es/shared/view/reference.py Fri Dec 14 13:33:30 2018 +0100 @@ -32,7 +32,7 @@ # check view settings if settings.exclude_context: intids = get_utility(IIntIds) - yield Q('bool', must_not=Q('term', internal_id=intids.register(context))) + yield Q('bool', must_not=Q('term', **{'internal_id': intids.register(context)})) # check view references mode if settings.references_mode == ONLY_REFERENCE_MODE: yield Q('terms', **{'reference_id': settings.references}), False