2012-04-26 82 views
3

我已經創建了兩個敏捷類型:lab_equipment.py,class_activity.py。 的class_activity類型包含以下相對於lab_activity類型:反向參考敏捷類型RelationList

class_activity.py:

class IClassActivity(form.Schema, IImageScaleTraversable): 
[...] 
    dexteritytextindexer.searchable('apparatus') 
    apparatus = RelationList(
     title=_(u"Apparatus"), 
     description=_(u"Choose equipment used in this activity"), 
     value_type=RelationChoice(
      source=ObjPathSourceBinder(
       object_provides=ILabEquipment.__identifier__, 
       navigation_tree_query= {'path': {'query':'/Plone/ug-demos/equipment'}}, 
      ), 
     ), 
    ) 

[...] 

現在我需要從lab_equipment頁面模板class_activity類型列出相關的成員。

有沒有辦法將RelationList從class_activity類型引用到lab_activity類型,然後將此列表顯示到頁面模板中?

回答

3

要檢索反向引用(使用指定屬性指向特定對象的所有對象),不能簡單地使用from_object或from_path,因爲源對象存儲在沒有獲取包裝器的關係中。您應該使用from_id和helper方法來搜索IntId目錄中的對象。

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 

請注意,此方法不檢查生效日期或內容語言。

對於您的情況,您需要從某些實驗室設備瀏覽器視圖的方法調用此方法,並將反向引用對象的列表傳遞給您的模板。例如:

class LabEquipmentView(BrowserView): 

    def aparatus_backrefs(self): 
     return back_references(self.context, 'apparatus') 

P.S.我複製了我前一段時間發佈的自己敏捷問題#234的答案:http://code.google.com/p/dexterity/issues/detail?id=234&colspec=ID%20Type%20Status%20Priority%20Difficulty%20Milestone%20Owner%20Summary

+0

謝謝!這正是我所期待的! – jcuot 2012-04-28 14:14:34

+0

這已經工作了一段時間,但現在我在加載一些內容類型時出現錯誤: '[[...] 模塊z3c.relationfield.relation,第28行,from_id 模塊plone.app。 relationfield.monkey,第20行,在get_from_object中 模塊five.intid.intid,第44行,在寄存器 模塊zope.component.hooks,第104行,在adapter_hook中 模塊zope.security.adapter,第88行,在__call__中 Module five.intid.keyreference,line 58,in __init__ NotYet: jcuot 2013-01-30 13:31:24