Plone/IRelatedItems-我如何以编程方式设置灵巧内容类型的relatedItems?

Pat*_*ney 4 python plone

在一个事件中,IAfterTransitionEvent,我正在尝试捕获正在发布的对象的事件,并且在发布对象时,创建了两个对象并且我想要关联.

在正在发布的对象的类型xml文件中,我添加了行为:

element value="plone.app.relationfield.behavior.IRelatedItems"
Run Code Online (Sandbox Code Playgroud)

这样我就可以得到relatedItems.

在我的活动中,我有:

@grok.subscribe(InitialContract, IAfterTransitionEvent)
def itemPublished(obj, event):
    site = api.portal.get()
    if event.status['action'] == 'publish':

        house_agreement = customCreateFunction(container...,type..)
        #I get the HouseAgreement object
        labor_contract = customCreateFunction(container....,type)
        #I get the LaborContract object
        relIDs = []
        relIDs.append(RelationValue(IUUID(house_agreement)))
        relIDs.append(RelationValue(IUUID(labor_contract)))

        obj.relatedItems = relIDs
Run Code Online (Sandbox Code Playgroud)

不幸的是,打印obj.relatedItems会给我一个空列表,当我转到View类并查看Categorization时,Related Items字段为空.我尝试使用_relatedItems而不是relatedItems,但这似乎不起作用,因为我认为它为obj创建了一个属性.我也试过使用IUUID而不是将它转换为RelationValue,但这并没有给我任何错误.

它就像它没有设置relatedItems值,但似乎接受传递的列表.

如果可能,我如何以编程方式设置relatedItems?

另外,我计划添加代码以防止对象被添加两次.

Mat*_*ias 5

您需要存储RelationValues列表.

>>> from zope.component import getUtility
>>> from zope.intid.interfaces import IIntIds
>>> from z3c.relationfield import RelationValue


>>> intids = getUtility(IIntIds)
>>> source.relatedItems = [RelationValue(self.intids.getId(target))]
>>> source.relatedItems
[<z3c.relationfield.relation.RelationValue object at 0x10bf2eed8>]
Run Code Online (Sandbox Code Playgroud)

您现在可以通过...访问目标

>>> target_ref = source.relatedItems[0]
>>> target_ref.to_object
<XXX at / Plone/target>
Run Code Online (Sandbox Code Playgroud)

我的代码示例的重要更改是:

  • RelationValues基于Intid而不是uuid.