diff --git a/CHANGES.rst b/CHANGES.rst index 9186142b23..ccf8ad0797 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.5.0 (unreleased) ------------------ +- #2412 Layered listing searchable text adapter lookup - #2409 Fix empty results get interpreted as 0.0 by 2-Dimensional-CSV importer - #2410 Fix order of choices for interims on data entry is not preserved - #2408 Support DX type catalogs lookup 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..bbfe9841b9 100644 --- a/src/senaite/core/catalog/utils.py +++ b/src/senaite/core/catalog/utils.py @@ -19,11 +19,11 @@ # Some rights reserved, see README and LICENSE. from bika.lims import api -from bika.lims import logger from bika.lims.interfaces import IListingSearchableTextProvider 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 +65,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)