У нас работает сервер Zope с большим количеством сайтов Plone (4). Время от времени появляется обновление продукта расширения, которое требует переустановки, чтобы зафиксировать изменения в настройках профиля, например, новые типы контента.
Вручную, это будет означать переход на все сайты Plone portal_quickinstaller
, отметку продуктов, пресс-обновление. Это не очень выполнимо, если мы говорим о десятках сайтов, поэтому я пытаюсь автоматизировать это. По сути, до сих пор у меня есть следующие сценарии (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, но, боюсь, обновлений разработанных на месте продуктов нельзя избежать).