我遇到了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,但也失败了。
欢迎所有想法。
答案 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
行为可能就足够了,但明确实施您自己的行为会更好。