Каков наилучший способ получить позицию объекта контента в родительском? Plone 4

Я просматриваю папки с элементами контента внутри них. Я использую portal_catalog для поиска мозгов по определенным путям. Мозги имеют доступ к метаданным, а brain.getObject() вернет реальный объект. Я получил родительский объект для объекта brain.getObject(). Aq_parent. Теперь я хочу получить позицию объекта в родительском. Сначала я попробовал brain.getObject(). GetObjPositionInParent(), а потом понял, что getObjPositionInParent() - это атрибут, доступный из данных индекса.

idxData = catalog.getIndexDataForRID(brain.getRID())

sJson = json.dumps( idxData )
l = brain.getObject()
lUpdate = {'path': '/'.join( l.getPhysicalPath()), 'meta_type': l.meta_type, 'title':l.getRawTitle(), 'remoteUrl': l.getRemoteUrl(), 'json':sJson}

Когда я распечатал это на экране, я вижу все элементы внутри dict, которые возвращаются из вызова catalog.getIndexDataForRID. Проблема в том, что для всех объектов getObjPositionInParent() является пустым массивом ([]). На этой странице http://developer.plone.org/searching_and_indexing/query.html кажется, что значение должно быть целым числом. Это заставило меня задуматься, нужно ли мне создавать индексные данные, и, если это так, то я мог бы слишком далеко отойти от объекта, чтобы получить данные, которые уже должны быть там (поскольку папки, очевидно, знают, какую позицию помещать каждый дочерний элемент). в). Каков наилучший способ получить позицию объекта контента в родительском? Заранее спасибо за любую информацию?

Больше:

Я не уверен, почему адаптер не может быть найден, но это может быть связано с отсутствием его регистрации. Это скрипт, который я создаю в среде Zope для чтения ZODB непосредственно из файла, а не поверх работающего экземпляра Zope. Возможно ли, что я должен зарегистрировать адаптер в GlobalSiteManager?

Спасибо, Матиас. Когда я использую sort_on="getObjPositionInParent", я получаю следующую ошибку:

Traceback (most recent call last):
  File "extractMenuStructure.py", line 459, in <module>
    res = processFolder( home['childItems'], '/Sanford Guide Web Edition/' + appFolderNm + '', config['screens'] )
  File "extractMenuStructure.py", line 390, in processFolder
    results = portal_catalog(path={"query":currentPath, "depth":d},sort_on="getObjPositionInParent")
  File "/Applications/Plone/buildout-cache/eggs/Products.CMFPlone-4.1.2-py2.6.egg/Products/CMFPlone/CatalogTool.py", line 427, in searchResults
    return ZCatalog.searchResults(self, REQUEST, **kw)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/ZCatalog.py", line 604, in searchResults
    return self._catalog.searchResults(REQUEST, used, **kw)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 909, in searchResults
    return self.search(args, sort_index, reverse, sort_limit, _merge)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 658, in search
    b_size=b_size)
  File "/Applications/Plone/buildout-cache/eggs/Products.ZCatalog-2.13.20-py2.6.egg/Products/ZCatalog/Catalog.py", line 678, in sortResults
    index_key_map = sort_index.documentToKeyMap()
  File "/Applications/Plone/buildout-cache/eggs/plone.app.folder-1.0.4-py2.6.egg/plone/app/folder/nogopip.py", line 91, in documentToKeyMap
    ids = folder.getOrdering().idsInOrder()
  File "/Applications/Plone/buildout-cache/eggs/plone.folder-1.0.1-py2.6.egg/plone/folder/ordered.py", line 41, in getOrdering
    adapter = getAdapter(self, IOrdering)
  File "/Applications/Plone/buildout-cache/eggs/zope.component-3.9.5-py2.6.egg/zope/component/_api.py", line 96, in getAdapter
    raise ComponentLookupError(object, interface, name)
zope.component.interfaces.ComponentLookupError: (&lt;ATFolder at /Sanford Guide Web Edition/amt&gt;, &lt;InterfaceClass plone.folder.interfaces.IOrdering&gt;, u'')

1 ответ

Решение

Лучший способ - это сделать сам индекс.

Код взломан на основе CatalogTool (Products.CMFPlone)

from Acquisition import aq_inner
from Acquisition import aq_parent
from OFS.interfaces import IOrderedContainer

obj = brain.getObject()
parent = aq_parent(aq_inner(obj))
ordered = IOrderedContainer(parent, None)
if ordered is not None:
    return ordered.getObjectPosition(obj.getId())
return 0
Другие вопросы по тегам