2012-04-13 7 views
3

Ich schreibe ein Plone-Kalendermodul zum Reservieren verschiedener Ressourcen. Dieses Modul verfügt über einen Kalender, dessen Ereignisse in Postgresql gespeichert sind. Jeder Kalender ist ein Geschicklichkeitsobjekt, das im ZODB gespeichert ist.Abfrage von portal_catalog mit typisierten Uuids anstelle von String-Uuids

Um eine Verbindung zwischen Plone und Postgresql herzustellen, wandte ich mich natürlich der Uuid-Eigenschaft der Plone-Objekte zu. So dient jede UUID in Plone als Fremdschlüssel in Postgresql, der nativ UUID unterstützt.

Das hat in den letzten 6 Monaten gut funktioniert, bis ich mit Plone 4.1.4 angefangen habe. Damit wurde plone.uuid 1.0.2 eingeführt, welches die Darstellung der UUIDs von UUID mit in UUID ohne Striche ändert.

Das Problem mit dieser Änderung ist, dass ich nicht mehr sicher sein kann, welche Darstellung für ein bestimmtes Objekt verwendet wird. Objekte, die vor Plone 4.1.4 erstellt wurden, enthalten einen anders formatierten UUID-String als Objekte, die danach erstellt werden.

Lange Rede, kurzer Sinn, um sicherzustellen, dass mein Code mit jeder UUID-Darstellung funktioniert, würde ich gerne mit Pythons UUID-Typ suchen können.

Anstatt also diese:

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

Welche verschiedene Ergebnisse als dies zurück:

catalog.searchResults(UID='325dc47e08f94fa1bc183944a725adb4') 

Ich würde gerne, dies zu tun:

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

Welche Äquivalent dazu wäre:

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

Wer weiß, wie ich diese Art von Unabhängigkeit von der UUID Vertretung in Plone erreichen kann?

+0

Hm. Können Sie nicht an anderer Stelle eine Funktions-UUID haben, die die Zeichenfolge prüft, bei Bedarf Striche einfügt oder entfernt und dann 'uuid.UUID' aufruft? (Erstaunlich, wie viel Bruch Plone bei jeder kleinen Aktualisierung erzeugt ...) –

+0

uuid.UUID erlaubt tatsächlich Strings mit oder ohne Bindestriche. Und wo immer ich kann, kann ich dieses Feature nutzen, indem ich dafür sorge, dass die Strings, mit denen ich arbeite (hauptsächlich für JSON), immer ein vorhersagbares Format haben. Das Problem ist wirklich, dass ich im Wesentlichen den Katalog mit beiden Darstellungen abfragen muss, um sicherzustellen, dass ich das Objekt zurückbekomme. –

+0

Wäre die Lösung, dass Sie einfach annehmen, dass (U) UID String-ID ist und jede Art von Zeichen enthalten? Warum strippst du die Striche weg? –

Antwort

3

Sie müssten für beide Formate abfragen; Sobald das UID-Feld zugewiesen wurde, sollte es nicht wirklich geändert werden. Ihre Optionen sind also:

  1. Erstellen Sie eine Methode, die eine UID gibt ein Tupel mit den beiden gestrichelt und nicht schraffierte Versionen gegeben, dann verwenden Sie den Katalog abfragen:

    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:]])) 
    

    Mit dieser Methode an Ort und Stelle die Abfrage wird einfach:

    catalog.searchResults(UID=queryUID('325dc47e-08f9-4fa1-bc18-3944a725adb4')) 
    
  2. Datenbank Verwendung Machen Versionen gestrichelte wo die Plone UID Striche, nicht schraffierte Versionen, bei denen ältere Plone Inhalte nach wie vor eine UID witho hat ut Striche. Mit anderen Worten, behandeln Sie die UID als undurchsichtige Zeichenfolge.

    Die UIDs in Plone werden sich in keinem Fall ändern, so dass Sie nicht nach der nicht gestrichelten Version suchen müssen, wenn eine gestrichelte Version generiert wurde. Sobald eine UID einem Objekt zugewiesen wurde, ändert sie sich nie und erhält nie die Bindestriche.

  3. NICHT empfohlen Iterieren Sie durch Ihren ZODB und ersetzen Sie alle UIDs ohne Bindestriche durch das gestrichelte Äquivalent. Dies wird höchstwahrscheinlich alle anderen Verknüpfungen zwischen UID und diesen Elementen unterbrechen.

+0

Ich werde mit Option eins fortfahren. Ich denke, ich kann einen Index nachschlagen. Vielen Dank! –

+0

Es ist keine zusätzliche Suche im Index; Wir verlangen, dass der Index auf zwei Werte statt auf einen übereinstimmt. Es ist ziemlich effizient. :-) –

Verwandte Themen