创建对象时DocTest失败

时间:2014-11-27 07:55:01

标签: plone plone-4.x

我遇到了doctest问题,因为我试图在IObjectAddedEvent处理程序中重命名内容类型对象的ID。我的要求是具有顺序和上下文特定的ID,例如CAM-001,CAM-002,BLK-001,BLK-002等

当我在浏览器中手动添加对象时,事件处理程序会正确地重命名id,但是当我尝试在doctest中创建它时,它会在添加到它的容器后很快失败。 plone.dexterity addContentToContainer用原始id调用_setObject,然后事件处理程序启动并重命名id,然后当_getObject使用原始id时,它显然无法找到该对象,因此它会弹出属性错误。

我在这里创建了一个产品来说明https://github.com/mikejmets/wt.testrig

我也尝试在doctest中使用plone.api,但也失败了。

欢迎所有想法。

1 个答案:

答案 0 :(得分:0)

由于您使用的是灵巧,最好的解决方案是编写自己的NameGenerator行为。

我猜您的DX内容已激活以下行为: <element value="plone.app.content.interfaces.INameFromTitle" />

此行为负责在创建后重命名该项目。 你应该删除它并添加自己的。

示例:

使用zcml注册行为。

<plone:behavior
    title="Special name(id) generator"
    description=""
    provides="dotted.name.to.your.INameGenerator"
    factory="dotted.name.to.your.name_generator.NameGenerator"
    for="dotted.name.to.content.interface"
    />

对应的python代码。

from plone.app.content.interfaces import INameFromTitle
from zope.component import getUtility
from zope.interface import implements


class INameGenerator(INameFromTitle):
    """Behavior interface.
    """


class NameGenerator(object):
    """Customized name from title behavior."
    """

    implements(INameGenerator)


    def __init__(self, context):
        self.context = context

    @property
    def title(self):

        # YOUR IMPLEMENTATION
        title = ...

        return title

重要: 从INameFromTitle

继承您的界面

现在将<element value="dotted.name.to.your.INameGenerator" />添加到您的内容行为中。

从您的内容类型中移除INameFromTitle行为可能就足够了,但明确实施您自己的行为会更好。