2017-01-05 4 views
2

私のPloneインスタンスでは、作成したすべての新しいページを、作成後に独自のフォルダに移動します。フォルダは、そのページと同じタイトルと説明を持つ必要があります。これは私が新しいフォルダに追加した新しいページを移動する最後の行まで働くPloneページを移動すると「インデックスに値のある別のドキュメントがあります」エラー

def notifyDocumentIsAdded(document, event): 
portal = api.portal.get() 
context = aq_inner(document) 
folder = aq_parent(context) 
if getattr(document,"title") != getattr(folder,"title"): 
    newfolder = api.content.create(
      type='Folder', 
      title=getattr(document,"title"), 
      container=folder, 
      description=getattr(document,"description")) 
    api.content.move(source=document,target=newfolder,safe_id=True) 

:だから私はzope.lifecycleevent.interfaces.IObjectAddedEventのイベントハンドラとして、この機能を書きました。私は得る

ERROR Products.ZCatalog A different document with value 'c31f15e4923e4f2683dedc829d2f773d' already exists in the index.' 

この値を持つドキュメントとは何ですか? IDの競合ですか?または、イベントをトリガーしたオブジェクトを移動するのは問題ですか?

更新:ページは上記の私の文にもかかわらず、正確に移動され : 私は今より良い実際の問題を理解するのpythonデバッガを使用した後。問題は次のとおりです。ハンドラが実行された後、ハンドラによって移動された古いカタログのカタログによってページが索引付けされます。移動後にtransaction.commit()を使用しても、ページは以前の場所と新しい場所でインデックスされます。上記のエラーです。どのように起こるのを防ぐことができますか?

+0

同じトランザクションでスクリプトで切り取り/貼り付けを実行するときに問題が発生することがあります。 2つの操作の間に 'transaction.savepoint'(または、必要に応じて完全なコミット)を実行してください。 –

答えて

2

完全に作成されていないオブジェクトを移動しようとしているため、これが起こっていると思います。

イベントハンドラのロジックを変更するか、IObjectCreatedEvent用に登録するか、ループで終了することができます。

IObjectAddedEventは、オブジェクトをコンテナに追加するたびに呼び出されます。これは、移動後も発生します。

+0

私がイベントのドキュメンテーションを理解している限り、http://docs.plone.org/external/plone.app.dexterity /docs/advanced/event-handlers.html IObjectCreatedEventは、IObjectAddedEventの前に発生します。ドキュメンテーションは、後のものを使用することを勧めます。だから私はオブジェクトが完全に作成されるべきだと思う。可能なループが私の心の中にありました。タイトルを比較するifステートメントによってループを止めようとしました。 – Waynebird

+0

あなたは正しいです、この答えを間違って考えることは自由です。 – alepisa

+0

オブジェクトがコンテナに追加される前にIObjectCreatedEventが起動されるため、ドキュメントではIObjectAddedEventを使用する方が「しばしば簡単です」と表示されます。しかし、アレピサは正しいです、あなたはそれを取る必要があります、他はオブジェクトを貼り付けるときにも解雇されるからです。 –

関連する問題