2011-03-24 55 views
1

我被授予將Plone站點從3.1.7升級到4.0.3的任務。我已經成功地得到升級的站點,但現在我想安裝collective.lineage,我得到以下錯誤:安裝附加組件時出現PicklingError

Traceback (innermost last):
Module ZPublisher.Publish, line 135, in publish
Module Zope2.App.startup, line 291, in commit
Module transaction._manager, line 93, in commit
Module transaction._transaction, line 322, in commit
Module transaction._transaction, line 416, in _commitResources
Module ZODB.Connection, line 558, in commit
Module ZODB.Connection, line 606, in _commit
Module ZODB.Connection, line 640, in _store_objects
Module ZODB.serialize, line 422, in serialize
Module ZODB.serialize, line 431, in _dump
PicklingError: Can't pickle <class 'quills.app.portlets.quillslinks.IQuillsLinksPortlet'> : import of module quills.app.portlets.quillslinks failed

鵝毛筆在升級之前安裝,但沒有被利用在網站上所以我通過快速安裝程序卸載它,同時該網站仍然是3.1.7(我不相信羽毛筆有卸載配置文件)。

此外,這個錯誤不會影響所有的附加組件,昨天我沒有發生意外安裝了collective.redirect。

很明顯,奎斯並沒有徹底卸載,但老實說,當修復這個問題時不知道從哪裏開始。

任何幫助將不勝感激。

回答

3

它看起來像我一樣,當Quills被移除時,Quills分配了一些portlet,這些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 

這最後解決方案應該被認爲是一個醜陋的黑客,但。