使用plone.indexer在一个索引下编目多个类型

时间:2014-10-23 01:49:35

标签: python plone

configure.zcml我有:

<adapter name="getCountry" factory=".extender.country_indexer" />

extender.py我有:

@indexer(IATFile)
@indexer(IATImage)
@indexer(IProject)
@indexer(IATDocument)
def country_indexer(context):
    return _country_indexer(context)

但是getCountry索引下的所有类型进行编目。

如果我注释掉除了一个装饰器以外的所有装饰器,它适用于那种类型。

如何设置所有目录?

更多信息。只有一个注册使用适当的可调用进行调用。使用DelegatingIndexerFactory调用其他函数:

indexer.__init__ <plone.indexer.decorator.indexer instance at 0xafa6998> (<InterfaceClass Products.ATContentTypes.interfaces.file.IATFile>,)
indexer.__init__ <plone.indexer.decorator.indexer instance at 0xafa6f80> (<InterfaceClass Products.ATContentTypes.interfaces.image.IATImage>,)
indexer.__init__ <plone.indexer.decorator.indexer instance at 0xafa8050> (<InterfaceClass project.interfaces.project.IProject>,)
indexer.__init__ <plone.indexer.decorator.indexer instance at 0xafa8128> (<InterfaceClass Products.ATContentTypes.interfaces.document.IATDocument>,)
indexer.__call__ <plone.indexer.decorator.indexer instance at 0xafa8128> <function country_indexer at 0xafa76e0>
indexer.__call__ <plone.indexer.decorator.indexer instance at 0xafa8050> <plone.indexer.delegate.DelegatingIndexerFactory object at 0xafa5910>
indexer.__call__ <plone.indexer.decorator.indexer instance at 0xafa6f80> <plone.indexer.delegate.DelegatingIndexerFactory object at 0xafa5b90>
indexer.__call__ <plone.indexer.decorator.indexer instance at 0xafa6998> <plone.indexer.delegate.DelegatingIndexerFactory object at 0xafa5910>

1 个答案:

答案 0 :(得分:1)

我担心@indexer装饰器不支持链接。

有几种可能的解决方案:

1。标记界面(我最喜欢的)

使用单独的标记界面标记支持_country_indexer的内容。 例如ICountry

这可以通过ZCML完成:

<class class="dotted.name.to.my.class">
      <implements interface="dotted.name.to.ICountry" />
</class>

然后将此界面用于indexer

@indexer(ICountry)
def country_indexer(context):
    return _country_indexer(context)

2。在Interface上注册并直接在方法中实现逻辑:

@indexer(Interface)
def country_indexer(context):
    SUPPORTED = [IATFile, IATImage, IProject, IATDocument]
    ...

3。多次复制代码

@indexer(IATDocument)
def country_indexer_at_doc(context):
    return _country_indexer(context)

@indexer(IATFile)
def country_indexer_at_file(context):
    return _country_indexer(context)

@indexer(IATImage)
def country_indexer_at_img(context):
    return _country_indexer(context)

...

zcml部分:

<adapter name="getCountry" factory=".extender.country_indexer_at_doc" />
<adapter name="getCountry" factory=".extender.country_indexer_at_file" />
<adapter name="getCountry" factory=".extender.country_indexer_at_img" />
...