Skip to content

Commit

Permalink
Improved catalog lookup (#55)
Browse files Browse the repository at this point in the history
* Improved catalog lookup

* Lookup catalog by portal_type instead of context

* Do not fetch the catalog again from the request

* Removed cache
  • Loading branch information
ramonski committed Mar 26, 2023
1 parent a594794 commit b2d311d
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 46 deletions.
22 changes: 6 additions & 16 deletions src/senaite/jsonapi/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@

from AccessControl import Unauthorized
from Acquisition import ImplicitAcquisitionWrapper
from senaite.jsonapi.interfaces import IUpdate

from bika.lims import api
from bika.lims.utils.analysisrequest import create_analysisrequest as create_ar
from DateTime import DateTime
Expand All @@ -43,14 +41,16 @@
from senaite.jsonapi.interfaces import IBatch
from senaite.jsonapi.interfaces import ICatalog
from senaite.jsonapi.interfaces import ICatalogQuery
from senaite.jsonapi.interfaces import ICreate
from senaite.jsonapi.interfaces import IDataManager
from senaite.jsonapi.interfaces import IFieldManager
from senaite.jsonapi.interfaces import IInfo
from senaite.jsonapi.interfaces import ICreate
from senaite.jsonapi.interfaces import IUpdate
from zope.component import getAdapter
from zope.component import getMultiAdapter
from zope.component import queryAdapter
from zope.schema import getFieldNames
from zope.schema import getFields
from zope.component import queryAdapter

_marker = object()

Expand Down Expand Up @@ -579,14 +579,14 @@ def fail(status, msg):
raise APIError(status, "{}".format(msg))


def search(**kw):
def search(portal_type=None, **kw):
"""Search the catalog adapter
:returns: Catalog search results
:rtype: iterable
"""
portal = get_portal()
catalog = ICatalog(portal)
catalog = getMultiAdapter((portal, portal_type), interface=ICatalog)
catalog_query = ICatalogQuery(catalog)
query = catalog_query.make_query(**kw)
return catalog(query)
Expand Down Expand Up @@ -1163,16 +1163,6 @@ def get_endpoint(brain_or_object, default=DEFAULT_ENDPOINT):
return default


def get_catalog():
"""Get catalog adapter
:returns: ICatalog adapter for the Portal
:rtype: CatalogTool
"""
portal = get_portal()
return ICatalog(portal)


def get_object_by_request():
"""Find an object by request parameters
Expand Down
33 changes: 14 additions & 19 deletions src/senaite/jsonapi/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

from bika.lims import api as senaiteapi
from DateTime import DateTime
from Products.CMFPlone.CatalogTool import CatalogTool
from Products.ZCTextIndex.ZCTextIndex import ZCTextIndex
from senaite.jsonapi import api
from senaite.jsonapi import logger
Expand All @@ -31,7 +30,6 @@
from zope import interface
from ZPublisher import HTTPRequest


SEARCHABLE_TEXT_INDEXES = [
"listing_searchable_text",
"SearchableText",
Expand All @@ -44,35 +42,32 @@ class Catalog(object):
"""
interface.implements(ICatalog)

def __init__(self, context):
def __init__(self, context, portal_type=None):
self.context = context
self._catalogs = {}
self.portal_type = portal_type

def search(self, query):
"""search the catalog
"""
logger.info("Catalog query={}".format(query))
# Support to set the catalog as a request parameter
catalogs = _.to_list(req.get("catalog", None))
if catalogs:
return senaiteapi.search(query, catalog=catalogs)
# Delegate to the search API of Bika LIMS
return senaiteapi.search(query)
catalog = self.get_catalog()
if not catalog:
return senaiteapi.search(query)
return senaiteapi.search(query, catalog=catalog.getId())

def __call__(self, query):
return self.search(query)

def get_catalog(self):
def __repr__(self):
return "<Catalog %s>" % self.get_catalog().getId()

def get_catalog(self, default="portal_catalog"):
name = req.get("catalog")
if not name:
catalogs = senaiteapi.get_catalogs_for(self.context)
name = catalogs[0].getId() if len(catalogs) > 0 else None
if name not in self._catalogs:
# Get the catalog directly from senaite api
cat = senaiteapi.get_tool(name)
if isinstance(cat, CatalogTool):
self._catalogs[name] = cat
return self._catalogs[name]
# get the mapped catalog for the given portal_type
catalogs = senaiteapi.get_catalogs_for(self.portal_type)
name = catalogs[0].getId() if len(catalogs) > 0 else default
return senaiteapi.get_tool(name)

def get_schema(self):
catalog = self.get_catalog()
Expand Down
4 changes: 2 additions & 2 deletions src/senaite/jsonapi/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
Unified interface to one or more Portal Catalog tools.
-->

<!-- Default catalog adapter -->
<!-- Default catalog adapter (context, portal_type) -->
<adapter
for="*"
for="* *"
factory=".catalog.Catalog"
/>

Expand Down
17 changes: 8 additions & 9 deletions src/senaite/jsonapi/dataproviders.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,19 @@
# Copyright 2017-2023 by it's authors.
# Some rights reserved, see README and LICENSE.

from zope import interface
from zope import component

from plone.dexterity.interfaces import IDexterityContent

from AccessControl import Unauthorized
from plone.dexterity.interfaces import IDexterityContent
from Products.ATContentTypes.interfaces import IATContentType
from Products.CMFCore.interfaces import ISiteRoot
from Products.ZCatalog.interfaces import ICatalogBrain
from Products.ATContentTypes.interfaces import IATContentType

from senaite.jsonapi import api
from senaite.jsonapi import logger
from senaite.jsonapi.interfaces import IInfo
from senaite.jsonapi.interfaces import ICatalog
from senaite.jsonapi.interfaces import IDataManager
from senaite.jsonapi.interfaces import IInfo
from zope import component
from zope import interface
from zope.component import getMultiAdapter

_marker = object

Expand Down Expand Up @@ -143,7 +141,8 @@ class ZCDataProvider(Base):

def __init__(self, context):
super(ZCDataProvider, self).__init__(context)
catalog_adapter = ICatalog(context)
catalog_adapter = getMultiAdapter(
(context, context.portal_type), interface=ICatalog)
# extract the metadata
self.keys = catalog_adapter.get_schema()

Expand Down

0 comments on commit b2d311d

Please sign in to comment.