3

さまざまなリソースを予約するためのPloneカレンダーモジュールを書いています。このモジュールは、イベントがPostgresqlに保存されているカレンダーを備えています。各カレンダーは、ZODBに保存されているDexterityオブジェクトです。

PloneとPostgresqlの間のリンクを作成するために、私は自然にPloneオブジェクトのuuidプロパティに目を向けました。したがって、Ploneの各uuidは、ネイティブでuuidをサポートするPostgresqlの外部キーとして機能します。

これは、私がPlone 4.1.4を使い始めるまで、過去6か月間でうまく機能しました。これに伴い、plone.uuid 1.0.2が導入され、uuidの文字列表現がダッシュ付きのuuidからダッシュなしのuuidに変更されました。

この変更の問題は、特定のオブジェクトでどの表現が使用されるかがわからなくなることです。Plone 4.1.4より前に作成されたオブジェクトには、後に作成されたオブジェクトとは異なる形式のuuid文字列が含まれています。

簡単に言うと、私のコードが任意のuuid表現で機能することを確認するために、Pythonのuuidタイプを使用して検索できるようにしたいと思います。

したがって、これの代わりに:

catalog.searchResults(UID='325dc47e-08f9-4fa1-bc18-3944a725adb4')

これはこれとは異なる結果を返します:

catalog.searchResults(UID='325dc47e08f94fa1bc183944a725adb4')

私はこれをしたいです:

from uuid import UUID
catalog.searchResults(UID=UUID('325dc47e-08f9-4fa1-bc18-3944a725adb4'))

これはこれに相当します:

catalog.searchResults(UID=UUID('325dc47e08f94fa1bc183944a725adb4'))

Ploneでのuuidの表現から、この種の独立性を実現する方法を知っている人はいますか?

4

1 に答える 1

4

両方の形式を照会する必要があります。UIDフィールドが割り当てられたら、実際には変更しないでください。したがって、オプションは次のとおりです。

  1. UIDを指定すると、破線と非破線の両方のバージョンのタプルが返されるメソッドを作成し、を使用してカタログを照会します。

    def queryUID(UID):
        if '-' in UID:
            return (UID.replace('-', ''), UID)
        return (UID, '-'.join([
            UID[:8], UID[8:12], UID[12:16], UID[16:20], UID[20:]]))
    

    そのメソッドを配置すると、クエリは単純に次のようになります。

    catalog.searchResults(UID=queryUID('325dc47e-08f9-4fa1-bc18-3944a725adb4'))
    
  2. データベースで、Plone UIDにダッシュがあるダッシュバージョンと、古いPloneコンテンツにダッシュのないUIDがある非ダッシュバージョンを使用するようにします。つまり、UIDを不透明な文字列として扱います。

    PloneのUIDはどのような場合でも変更されないため、破線バージョンが生成されたときに非破線バージョンを検索する必要はありません。UIDがオブジェクトに割り当てられると、それが変更されることはなく、ダッシュが取得されることもありません。

  3. 推奨されませんZODBを繰り返し処理し、ダッシュなしのすべてのUIDをダッシュ​​付きの同等のものに置き換えます。これにより、UIDによってそれらのアイテムにリンクしている他のすべてのものが壊れる可能性があります。

于 2012-04-13T13:22:00.223 に答える