From fd1a5d9fecb3fae01bacbd4aeb97fb9bec7a4d8e Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Fri, 27 Oct 2023 11:51:37 +0200 Subject: [PATCH] Layered listing searchable text adapter lookup Lookup listing searchable text adapter with request --- src/senaite/core/catalog/indexer/sample.py | 21 ++++++++++++++++++--- src/senaite/core/catalog/utils.py | 20 +++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/senaite/core/catalog/indexer/sample.py b/src/senaite/core/catalog/indexer/sample.py index c33c79e2df..62ac347e23 100644 --- a/src/senaite/core/catalog/indexer/sample.py +++ b/src/senaite/core/catalog/indexer/sample.py @@ -22,6 +22,7 @@ from bika.lims.interfaces import IAnalysisRequest from bika.lims.interfaces import IListingSearchableTextProvider from plone.indexer import indexer +from senaite.core import logger from senaite.core.catalog import SAMPLE_CATALOG from senaite.core.interfaces import ISampleCatalog from zope.component import getAdapters @@ -118,10 +119,24 @@ def listing_searchable_text(instance): batch = obj.getBatch() entries.add(batch.getId() if batch else '') + catalog = api.get_tool(SAMPLE_CATALOG) + text_providers = getAdapters((instance, api.get_request(), catalog), + IListingSearchableTextProvider) + # BBB + bbb_text_providers = getAdapters((instance, catalog), + IListingSearchableTextProvider) + + # combine the adapters for backwards compatibility + adapters = list(text_providers) + list(bbb_text_providers) + # Allow to extend search tokens via adapters - for name, adapter in getAdapters((instance, api.get_tool(SAMPLE_CATALOG)), - IListingSearchableTextProvider): - value = adapter() + for name, adapter in adapters: + try: + value = adapter() + except (AttributeError, TypeError, api.APIError) as exc: + logger.error(exc) + value = [] + if isinstance(value, (list, tuple)): values = map(api.to_searchable_text_metadata, value) entries.update(values) diff --git a/src/senaite/core/catalog/utils.py b/src/senaite/core/catalog/utils.py index ecd9de5751..40350e4da8 100644 --- a/src/senaite/core/catalog/utils.py +++ b/src/senaite/core/catalog/utils.py @@ -24,6 +24,7 @@ from Products.CMFPlone.CatalogTool import \ sortable_title as plone_sortable_title from Products.CMFPlone.utils import safe_callable +from senaite.core import logger from zope.component import getAdapters @@ -65,10 +66,23 @@ def get_searchable_text_tokens(instance, catalog_name, field_value = api.to_searchable_text_metadata(field_value) entries.add(field_value) + text_providers = getAdapters((instance, api.get_request(), catalog), + IListingSearchableTextProvider) + # BBB + bbb_text_providers = getAdapters((instance, catalog), + IListingSearchableTextProvider) + + # combine the adapters for backwards compatibility + adapters = list(text_providers) + list(bbb_text_providers) + # Extend metadata entries with pluggable text providers - for name, adapter in getAdapters((instance, catalog), - IListingSearchableTextProvider): - value = adapter() + for name, adapter in adapters: + try: + value = adapter() + except (AttributeError, TypeError, api.APIError) as exc: + logger.error(exc) + value = [] + if isinstance(value, (list, tuple)): values = map(api.to_searchable_text_metadata, value) entries.update(values)