Plone 4: как получить контекст для подпапки с дефисом в коротком имени - PullRequest
2 голосов
/ 27 ноября 2011

Я пишу скрипт на python для импорта контента из другой CMS в Plone 4.1.По ряду причин я запускаю его так: bin/instance run path/to/myscript

У меня есть вопрос, как получить правильный контекст для папки с дефисом в ID / сокращенном имени.Например, из корня сайта Plone, называемого mysite, я могу работать с папкой «sub-folder» следующим образом:

from Products.CMFCore.utils import getToolByName
urltool = getToolByName(app.mysite, "portal_url")
portal  = urltool.getPortalObject()
folder = getattr(portal, 'sub-folder')

Но если я затем захочу создать папку или страницу в этой подпапке-folder следующее выдает ошибку: «AttributeError: sub»

urltool = getToolByName(app.mysite.sub-folder, "portal_url")
portal  = urltool.getPortalObject()

И выполнение того же в папке «Новости» (без дефиса) не приводит к ошибке:

urltool = getToolByName(app.mysite.news, "portal_url")
portal  = urltool.getPortalObject()

Простая попытка portal.sub-folder выдает ту же ошибку.

Так что же будет кодом Python для получения правильного контекста "http://localhost:8080/mysite/sub-folder", чтобы я мог затем успешно вызвать метод invokeFactory и создать папкуили страницу в папке mysite / sub-folder?

Что если мне нужно найти контекст "http://localhost:8080/mysite/sub-folder/2nd-level"?

В найденной мной онлайн-документации, похоже, учитываются только папки с именем dog илиновости, которые не имеют дефис в ID / Shortname.Однако, если вы создаете эти элементы вручную в Plone, короткие имена, очевидно, имеют дефисы, и поэтому должен быть способ получить правильный контекст папки.

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Это потому, что если вы используете:

app.mysite.sub-folder

python считает, что вы пытаетесь сделать разницу между app.mysite.sub и folder. Вместо этого вы должны использовать этот синтаксис:

secondlevel = mysite['sub-folder']['2nd-level']

или

secondlevel = mysite.restrictedTraverse('/mysite/sub-folder/2nd-level')
0 голосов
/ 29 ноября 2011

Вы уже делаете:

folder = getattr(portal, 'sub-folder')

Итак, у вас есть папка с дефисом, на которую есть ссылка в переменной "folder".

Вы можете использовать переменную папки для вызова invokeFactory, и все готово. Он знает, где находится в Плоне.

Вам не нужно пользоваться инструментом portal_url для запуска invokeFactory. Но если хочешь, а не как пишешь:

getToolByName(app.mysite.sub-folder, "portal_url")

Вы можете сделать:

getToolByName(folder, "portal_url")

Однако в настоящее время (и, вероятно, навсегда) вам даже не нужно этого делать, поскольку инструмент portal_url для вашей подпапки такой же, как и для всего сайта, поэтому вы можете просто написать:

urltool = getToolByName(app.mysite, "portal_url")
...