Plone 4:collective.formcriteria卸载现在无法导入网站

时间:2012-06-21 16:39:40

标签: plone python-import buildout

我在一个站点上安装了collective.formcriteria,然后卸载了它。从Buildout中移除。

当我导出我的网站时,它运行正常,但尝试导入该网站会给我这个错误:

Traceback (innermost last):

    Module ZPublisher.Publish, line 127, in publish
    Module ZPublisher.mapply, line 77, in mapply
    Module ZPublisher.Publish, line 47, in call_object
    Module OFS.ObjectManager, line 628, in manage_importObject
    Module OFS.ObjectManager, line 646, in _importObjectFromFile
    Module ZODB.ExportImport, line 92, in importFile
    Module transaction._transaction, line 253, in savepoint
    Module transaction._transaction, line 250, in savepoint
    Module transaction._transaction, line 647, in __init__
    Module ZODB.Connection, line 1128, in savepoint
    Module ZODB.Connection, line 570, in _commit
    Module ZODB.ExportImport, line 175, in _importDuringCommit

ImportError: No module named formcriteria.criteria.relativepath

是否会再次安装此插件并尝试导入/导出我的网站工作,还是有其他修复方法?

感谢。

1 个答案:

答案 0 :(得分:2)

在导入过程中,ZODB必须重新映射转储的pickle中的持久ID,并且必须“加载”导出文件中的所有条目。

在重映射过程中,它将尝试导入每个引用的类。您的导出仍然保留对collective.formcriteria类的引用,这就是导入过程中出现错误的原因。

您可以做两件事:

  1. collective.formcriteria安装到您的buildout中,只是为了让此导入正常工作。无需运行安装代码或任何东西,Zope进程只需要能够在导入过程中导入类。之后您可以将其删除。

  2. 使用空存根填写缺少的导入。这需要更多一些,因为您需要创建一个虚拟模块,您将插入sys.modules以便为此过程加载。

    虚拟模块看起来像这样;我把它命名为'placeholder.py':

    from persistent import Persistent
    
    class PlaceHolderClass(Peristent):
        def __repr__(self):
            return "<Persistent placeholder class for now-removed instances>"
    

    你用以下内容删除了导入:

    import sys
    import placeholder
    
    sys.modules['collective.formcriteria.criteria.relativepath'] = placeholder
    
    placeholder.FormRelativePathCriterion = placeholder.PlaceHolderClass
    

    根据collective.formcriteria package layout,您很可能需要存根更多此类。

    使用此技术不会删除损坏的引用;它只允许您将.zexp文件导入新实例。