# HG changeset patch # User Thierry Florac # Date 1542214083 -3600 # Node ID 2af087625f6f8af7fbc23930c2da9890b2d04c6c # Parent 50d04e6c37047a57ca12b47093ac33f0646cd0dd Updated "references" view extension to handle new references mode diff -r 50d04e6c3704 -r 2af087625f6f src/pyams_content_es/shared/view/__init__.py --- a/src/pyams_content_es/shared/view/__init__.py Wed Nov 14 17:46:37 2018 +0100 +++ b/src/pyams_content_es/shared/view/__init__.py Wed Nov 14 17:48:03 2018 +0100 @@ -38,27 +38,34 @@ # check publication dates now = tztime(datetime.utcnow()) params = Q('range', **{'workflow.effective_date': {'lte': now}}) - params &= Q('bool', must=Q('range', **{'workflow.push_end_date': {'gte': now}})) | \ - Q('bool', must_not=Q('exists', **{'field': 'workflow.push_end_date'})) - # check content types - content_types = view.get_content_types(context) - if content_types: - params &= Q('terms', **{'content_type': content_types}) - # check data types - data_types = view.get_data_types(context) - if data_types: - params &= Q('terms', **{'data_type': data_types}) # check workflow states wf_params = [] for workflow in registry.getAllUtilitiesRegisteredFor(IWorkflow): wf_params.extend(workflow.published_states) params &= Q('terms', **{'workflow.status': wf_params}) # check custom extensions + 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 + if not do_search: + break + # activate search + if do_search: + params &= Q('bool', must=Q('range', **{'workflow.push_end_date': {'gte': now}})) | \ + Q('bool', must_not=Q('exists', **{'field': 'workflow.push_end_date'})) + # check content types + content_types = view.get_content_types(context) + if content_types: + params &= Q('terms', **{'content_type': content_types}) + # check data types + data_types = view.get_data_types(context) + if data_types: + params &= Q('terms', **{'data_type': data_types}) return params def get_results(self, context, sort_index, reverse, limit): diff -r 50d04e6c3704 -r 2af087625f6f src/pyams_content_es/shared/view/reference.py --- a/src/pyams_content_es/shared/view/reference.py Wed Nov 14 17:46:37 2018 +0100 +++ b/src/pyams_content_es/shared/view/reference.py Wed Nov 14 17:48:03 2018 +0100 @@ -12,16 +12,12 @@ __docformat__ = 'restructuredtext' - -# import standard library - -# import interfaces from elasticsearch_dsl import Q -from pyams_content.shared.view.interfaces import IWfView, IViewQueryEsParamsExtension, IViewInternalReferencesSettings from zope.intid.interfaces import IIntIds -# import packages -from pyams_utils.adapter import adapter_config, ContextAdapter +from pyams_content.shared.view.interfaces import IViewInternalReferencesSettings, IViewQueryEsParamsExtension, \ + IWfView, ONLY_REFERENCE_MODE +from pyams_utils.adapter import ContextAdapter, adapter_config from pyams_utils.registry import get_utility @@ -29,10 +25,20 @@ class ViewInternalReferencesQueryEsParamsExtension(ContextAdapter): """View internal references query params extension""" - weight = 50 + weight = 10 def get_es_params(self, context): settings = IViewInternalReferencesSettings(self.context) + # check view references mode + query = None + if settings.references_mode == ONLY_REFERENCE_MODE: + query = Q('terms', **{'reference_id': settings.references}) + # check view settings if settings.exclude_context: intids = get_utility(IIntIds) - return Q('bool', must_not=Q('term', internal_id=intids.register(context))) + context_query = Q('bool', must_not=Q('term', internal_id=intids.register(context))) + if query is None: + query = context_query + else: + query &= context_query + return query, settings.references_mode != ONLY_REFERENCE_MODE