[Grok-dev] Catalog Utility

Vanderson Mota dos Santos vanderson.mota at gmail.com
Wed Mar 25 21:24:08 EDT 2009


Wow! Really nice man. I'll implement it here and return the results.

thanks a lot!



2009/3/25 Ruslan Spivak <ruslan.spivak at gmail.com>

> 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
>



-- 
Vanderson Mota dos Santos
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/grok-dev/attachments/20090325/e7cf16c0/attachment.html 


More information about the Grok-dev mailing list