[Grok-dev] Catalog Utility

Ruslan Spivak ruslan.spivak at gmail.com
Wed Mar 25 19:47:36 EDT 2009


Vanderson Mota dos Santos <vanderson.mota at gmail.com> writes:

> Hi,
>
> I'm developing with some friends a "real world" grok application, and by
> now, i've used the hurry.query, according with the site documentation.
>
> I would like to know if is there any implementation of catalog like plone's
> portal_catalog, because i don't want to create a new grok.Indexes class just
> to index some attribute in a diferent model/context.
>
> If such thing doesn't exists, can someone give an opnion about building it
> or if is there a better option instead of making a centralized catalog
> utility?
>
>

I whipped out some code that you can use a basis for registering indexes
in one place:

import grok

from grok.meta import IndexesSetupSubscriber
from zope.app.catalog.field import FieldIndex
from zope.app.catalog.text import TextIndex
from zc.catalog.catalogindex import SetIndex

# Your interfaces
from zope.dublincore.interfaces import IZopeDublinCore
from zope.index.text.interfaces import ISearchableText

def setup_indexes(catalog):
    """Custom indexes to populate catalog"""

    # index_name, index_class,
    # attr_name, attr_interface, attr_is_callable
    indexes = (
        ('title', TextIndex,
         'title', None, False),

        ('created', FieldIndex,
         'created', IZopeDublinCore, False),

        ('searchable', TextIndex,
         'getSearchableText', ISearchableText, True),
        )

    for (index_name, index_class,
         name, iface, callable) in indexes:

        catalog[index_name] = index_class(
            field_name=name,
            interface=iface,
            field_callable=callable
            )

# Hack Grok's IndexesSetupSubscriber
class CustomIndexesSetupSubscriber(IndexesSetupSubscriber):

    def __init__(self):
        """Override base class constructor."""
        self.catalog_name = u''

    def __call__(self, site, event):
        """Override base class's __call__"""
        self._createIntIds(site)
        catalog = self._createCatalog(site)

        setup_indexes(catalog)


# Your application class
class Sample(grok.Application, grok.Container):
    pass

@grok.subscribe(Sample, grok.IObjectAddedEvent)
def registerCatalogIndexes(app, event):
    subscriber = CustomIndexesSetupSubscriber()
    # call it to set up catalog and indexes
    subscriber(app, event)


Main steps:
1) subscriber handler for your site's IObjectAddedEvent

2) use Grok's IndexesSetupSubscriber with overridden
   __init__ and __call__ and hook your index creation
   routine (as done above).

3) add indexes to catalog without using Grok's Indexes
   machinery

For more information about indexes and catalog check out:

http://svn.zope.org/zope.catalog/trunk/src/zope/catalog/
http://svn.zope.org/zope.index/trunk/src/zope/index/
http://svn.zope.org/zc.catalog/trunk/src/zc/catalog/

Hope it helps you to move further.

Cheers,
Ruslan
--

http://ruslanspivak.com



More information about the Grok-dev mailing list