我被赋予了将plone站点从3.1.7升级到4.0.3的任务。我已成功升级网站,但现在我正在尝试安装collective.lineage,我收到以下错误:
追溯(最里面):
模块ZPublisher.Publish,第135行,在发布中 模块Zope2.App.startup,第291行,在提交中 模块transaction._manager,第93行,在提交中 模块transaction._transaction,第322行,在提交中 模块transaction._transaction,第416行,在_commitResources中 模块ZODB.Connection,第558行,在提交中 模块ZODB.Connection,第606行,在_commit中 模块ZODB.Connection,第640行,在_store_objects中 模块ZODB.serialize,第422行,序列化
模块ZODB.serialize,第431行,在_dump中 PicklingError:无法腌制<class 'quills.app.portlets.quillslinks.IQuillsLinksPortlet'>
:导入模块quills.app.portlets.quillslinks失败
Quills是在升级之前安装的,但是没有在网站上使用,所以我通过quickinstaller在网站仍然是3.1.7的情况下卸载它(我不相信quills有卸载配置文件)。
此外,此错误不会影响所有加载项,我昨天安装了collective.redirect而没有发生任何事故。
显然,Quills没有干净地卸载,但老实说,在修复此问题时不知道从哪里开始。
非常感谢任何帮助。
答案 0 :(得分:3)
在我看来,Quills在删除Quills时在某处分配了一些未分配的portlet。
最好的解决方案是在删除Quills之前删除这些portlet。不幸的是,我不知道有一个工具可以概述portlet的分配位置,并且可以一目了然地识别出有问题的portlet,以便你可以删除它。也许别人知道这样的工具?
您可以尝试使用portal_setup工具导出portlet配置;生成的portlets.xml可能包含有关此portlet或portlet的分配位置的信息。
或者不是找到并删除portlet,而是可以尝试注册正在破坏的接口的虚拟替换(这应该包含在实例中某些产品的初始化代码中):
import imp, sys
from zope.interface import Interface
m = imp.new_module('quills.app.portlets.quillslinks')
sys.modules['quills.app.portlets.quillslinks'] = m
m.IQuillsLinksPortlet = Interface
但是,最后的解决方案应该被视为丑陋的黑客攻击。