Problem with plone.indexer and Dexterity
Asked Answered
A

2

8

I wish to enable a special index, called Sectors, for a attribute ('sectors') of my Dexterity based custom content-type.

In my schema, inside types/mycontent.py I have:

class IMyContent(form.Schema):
    """
    My Content
    """
    sectors = schema.Set(
            title=_(u"Sectors"),
            description=_(u"Select some sectors"),
            value_type=schema.Choice(vocabulary=vocs.sectors),
            required=True,
        )

    (...)

I then define the index in this way, inside indexers.py

from plone.indexer.decorator import indexer
from zr.content.types.mycontent import IMyContent

@indexer(IMyContent)
def Sectors(obj):
    """Indexer for Sectors attribute.
    """
    d = getattr(obj, "sectors", u"")
    return d if d else None

Finally in the root package configure.zcml:

<adapter name="Sectors" factory=".indexers.Sectors"/>

However, it does not seem to work. Even after reinstalling the product, I don't see the index in portal_catalog and catalog brain object do not seem to have it either.

What am I doing wrong?

Adenosine answered 11/7, 2011 at 13:54 Comment(0)
S
9

You aren't defining the catalogue index. This will just make the indexer available to be added. You require a catalog.xml in your GenericSetup profile with:

<?xml version="1.0"?>
<object name="portal_catalog" meta_type="Plone Catalog Tool">
 <index name="Sectors" meta_type="KeywordIndex">
  <indexed_attr value="Sectors"/>
 </index>
</object>
Searchlight answered 11/7, 2011 at 13:59 Comment(2)
Still, do not add new index with Generic Setup, because you will lose all your data if you reinstall it using quick_installer.Plenipotent
Reinstalling products in general is a sign you're doing it wrong.Searchlight
F
0

The accepted solution may be slightly obscure, so here are a couple of clarifications:

1) Do NOT edit your global generic setup.

Unless you're doing something extremely weird, you'll have setup your site as a series of plone extensions, and have a folder structure like:

app.plugin/
app.plugin/app/
app.plugin/app/configure.zcml
app.plugin/app/profiles/
app.plugin/app/profiles/default
app.plugin/app/profiles/default/types
app.plugin/app/profiles/default/types/Folder.xml
app.plugin/app/profiles/default/types/app.mydexteritytype.xml
app.plugin/app/profiles/default/types.xml
app.plugin/app/profiles/default/portlets.xml
app.plugin/app/profiles/default/catalog.xml <---- ADD THIS

2) You don't have to have an xml block (as per the accepted solution) in catalog.xml, you can just create the index from the frontend ZMI. However, if you do this, it'll get blown away the next time you install your plugins. So you probably do want to.

3) After installing your catalog.xml, browse to the ZMI interface to portal_catalog and check that under the 'indexes' tab your index exists. If it doesn't you've messed up.

4) To build the index, you need to go the 'advanced' tab and choose rebuild.

5) The indexer greedily consumes exceptions and does not raise them (especially important for AttributeError; you may not index some values you want to be indexing), so if you want to make sure your indexer is actually running, try adding a log or print statement in it:

@indexer(IMyDexterityType)
def dummy_indexer(obj, **kw):
    try:
        print('indexed: %r' % obj)
        return obj.title
    except Exception as e:
        print('index fail: %r' % e)
    return ''

If nothing else you should see some output like:

2013-08-12 16:42:28 INFO GenericSetup.archetypetool Archetype tool imported.
2013-08-12 16:42:28 INFO GenericSetup.resourceregistry Stylesheet registry imported.
2013-08-12 16:42:28 INFO GenericSetup.resourceregistry Javascript registry imported.
indexed: <MyDexterityType at /Plone/test/cat-document-0>
indexed: <MyDexterityType at /Plone/test/hello>

6) grok.global_adapter() as mentioned in some of the documentation (http://developer.plone.org/reference_manuals/external/plone.app.dexterity/advanced/catalog-indexing-strategies.html?highlight=custom%20indexing#creating-custom-indexers) is about registering virtual properties, and does not mitigate the need to setup your catalog.xml.

Finally, someone's put a working example up on github here, which is extremely useful:

https://github.com/aclark4life/event_days_indexer

Fichu answered 12/8, 2013 at 8:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.