Мы используем сервер Zope с большим количеством сайтов Plone (4). Время от времени появляется обновление продукта расширения, которое требует переустановки, чтобы принять изменения в настройках профиля, например. новые типы контента.
Вручную это означало бы щелкнуть portal_quickinstaller
каждого сайта Plone, отметить продукты, нажать обновить. Это не очень осуществимо, если мы говорим о десятках сайтов, поэтому я пытаюсь автоматизировать это. По сути, до сих пор у меня есть следующий сценарий (Python) в корне Zope:
a = context.restrictedTraverse('/')
p = a['Plone']
print p.getSiteManager()
qi = p.restrictedTraverse('portal_quickinstaller')
print qi
qi.reinstallProducts('LinguaPlone')
(Упрощенно; на самом деле у меня есть более длинный список вместо одного экземпляра Plone, и я мог бы захотеть переустановить более длинный список продуктов.) Это приводит к следующему сбою:
Module Products.CMFQuickInstallerTool.QuickInstallerTool, line 613, in uninstallProducts
Module Products.CMFQuickInstallerTool.InstalledProduct, line 272, in uninstall
Module Products.CMFQuickInstallerTool.InstalledProduct, line 351, in _cascadeRemove
AttributeError: 'BaseGlobalComponents' object has no attribute 'objectItems'
Судя по моим попыткам отладки, BaseGlobalComponents
— это Zope SiteManager, возвращаемый zope.component.getSiteManager
. Как мне убедить quickinstaller выбрать правильный, т.е. тот, который находится на сайте Plone?
В качестве альтернативы, как мне автоматизировать переустановку продуктов таким образом, чтобы это было неосуществимо для более крупных установок? (ETA: я знаю, что это не то, что вы делаете автоматически с помощью cronjob, но, боюсь, нельзя избежать обновлений продуктов собственной разработки.)