如何在Plone站点外触发portal_quickinstaller.reinstallProducts表单?

Ulr*_*arz 4 zope plone

我们正在运行一个Zope服务器,最终有大量的Plone(4)站点.有时会出现扩展产品更新,需要重新安装才能获取配置文件设置中的更改,例如新内容类型.

手动,这意味着点击每个Plone网站portal_quickinstaller,勾选产品,按更新.如果我们谈论几十个网站,这是不太可行的,所以我试图自动化这个.基本上到目前为止,我有以下生活作为Zope根目录中的脚本(Python):

a = context.restrictedTraverse('/')

p = a['Plone']
print p.getSiteManager()
qi = p.restrictedTraverse('portal_quickinstaller')
print qi
qi.reinstallProducts('LinguaPlone')
Run Code Online (Sandbox Code Playgroud)

(简化;实际上我有一个更长的列表而不是单个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'
Run Code Online (Sandbox Code Playgroud)

从我到目前为止的调试尝试来看,BaseGlobalComponents是由Zope SiteManager返回的zope.component.getSiteManager.我如何说服快速安装程序选择正确的安装程序,即它所居住的Plone站点中的那个?

或者,我如何以一种对大型安装仍然模糊可行的方式自动重新安装产品?(ETA:我知道这不是你用cronjob自动做的事情,但我担心内部开发产品的更新是无法避免的.)

Dav*_*ick 8

以下是更改活动本地站点管理器的方法.您将无法在Restricted Python中执行此操作,因此您需要将Python脚本转换为外部方法或浏览器视图.

from zope.app.component.hooks import setHooks, setSite
setHooks()
setSite(site)
Run Code Online (Sandbox Code Playgroud)

setHooks调用只需要完成一次.在Zope 2.12中,应该从zope.site.hooks导入这些调用,而从zope.component.hooks导入Zope 2.13.

请记住,调用reinstallProducts并不适合所有附加产品,除非您仔细检查了重新安装的内容并确定它不会导致问题,否则不建议这样做.某些产品提供了更有选择性地运行操作的升级步骤