Проблемы со ссылками на связанные элементы Plone 4

Мне не удалось найти объект обратной ссылки для связанных элементов.

мой код:

back_rels = list(catalog.findRelations({'to_id': intids.getId(aq_base(self.context))}))

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

Выдает исключение при запуске по адресу ob = portal.unrestrictedTraverse(rel.from_path).

Результаты отладки:

> 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'

Я предполагаю, что проблема в том, что rel.from_path не возвращает полный путь, как это делает rel.to_path.

Мой вопрос в том, как rel.from_path может вернуться с полным путем и получить правильный объект в

portal.unrestrictedTraverse(rel.from_path)?

Я запускаю Plone 4 и использую тип содержимого ловкости.


person Robert Wu    schedule 13.05.2011    source источник
comment
О проблеме следует сообщить в системе отслеживания проблем. пожалуйста, сообщите об этом на dev.plone.org   -  person toutpt    schedule 14.05.2011
comment
В каком каталоге вы используете метод findRelations? Я просто не могу найти его.   -  person marcosfromero    schedule 14.05.2011


Ответы (1)


К сожалению, вы не можете получить прямой доступ к from_object. Это объясняется в этом выпуске http://code.google.com/p/dexterity/issues/detail?id=95

Используйте from_id, в котором хранится IntId, и используйте утилиту IntIds для получения конкретного объекта:

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
person Radim Novotny    schedule 02.10.2011