1

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

このアドオンを再度インストールして、サイトのインポート/エクスポートを試みますか、それとも別の修正がありますか?

ありがとう。

4

1 に答える 1

2

インポート中に、ZODBはダンプされたピクルスの永続IDを再マップする必要があり、そのためには、エクスポートファイルのすべてのエントリを「ロード」する必要があります。

したがって、その再マッピングプロセス中に、参照されているすべてのクラスをインポートしようとします。エクスポートには引き続きcollective.formcriteriaクラスへの参照が含まれているため、インポート中にエラーが発生します。

できることは2つあります。

  1. このインポートを機能させるためだけに、ビルドアウトにインストールcollective.formcriteriaします。インストールコードなどを実行する必要はありません。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パッケージのレイアウトに基づいて、このようなクラスをさらにスタブ化する必要がある可能性があります。

    この手法を使用しても、壊れた参照は削除されません。.zexpファイルを新しいインスタンスにインポートすることしかできません。

于 2012-06-22T12:18:58.423 に答える