开发者

Plone 4 related items back reference issue

开发者 https://www.devze.com 2023-03-05 13:03 出处:网络
I failed to find back reference object for related items. my code: back_rels = list(catalog.findRelations({\'开发者_开发问答to_id\': intids.getId(aq_base(self.context))}))

I failed to find back reference object for related items.

my code:

back_rels = list(catalog.findRelations({'开发者_开发问答to_id': intids.getId(aq_base(self.context))}))

for rel in back_rels:
    ob = portal.unrestrictedTraverse(rel.from_path)

It throws exception when running at ob = portal.unrestrictedTraverse(rel.from_path).

Debug results:

> len(back_rels)
> 1 
> rel
> <z3c.relationfield.relation.RelationValue object at oxoA86f8f0>
> rel.from_path 
> 'new-grants-target-bioterrorism'
> rel.to_path
> '/portal/urnews/ur-gets-20-million-for-biodefense-studies'

I guess the problem is the rel.from_path doesn't return the full path like the rel.to_path does.

My question is how can rel.from_path return with full path and get right object at

portal.unrestrictedTraverse(rel.from_path)?

I am running Plone 4 and use dexterity content type.


Unfortunately you can't access from_object directy. It is explained in this issue http://code.google.com/p/dexterity/issues/detail?id=95

Use from_id, which stores IntId and use IntIds utility to retrieve the particular object:

from Acquisition import aq_inner
from zope.component import getUtility
from zope.intid.interfaces import IIntIds
from zope.security import checkPermission
from zc.relation.interfaces import ICatalog


def back_references(source_object, attribute_name):
    """ Return back references from source object on specified attribute_name """
    catalog = getUtility(ICatalog)
    intids = getUtility(IIntIds)
    result = []
    for rel in catalog.findRelations(
                            dict(to_id=intids.getId(aq_inner(source_object)),
                                 from_attribute=attribute_name)
                            ):
        obj = intids.queryObject(rel.from_id)
        if obj is not None and checkPermission('zope2.View', obj):
            result.append(obj)
    return result
0

精彩评论

暂无评论...
验证码 换一张
取 消