2012-03-05 14 views
5

my.packages jest niestandardowym pakietem archetypes w katalogu src. Tysiące elementów w instancji Plone są dodawane wraz z jej typami. Chcę zmienić nazwę pakietu jako my.package. Po prostu odinstalowując pliki my.packages i instalując plik my.package, znajduję http://localhost:8080/mysite/myfolder/my-item, pokazując <persistent broken my.packages.content.mytype.MyType instance '\x00\x00\x00\x00\x00Un^'>. Czy muszę przeprowadzić migrację? Czy istnieje prosty sposób na rozwiązanie tego problemu?Zmiana nazwy my.packages na my.package

Odpowiedz

5

Możesz utworzyć alias dla kompatybilności wstecznej, wykonując operację pod numerem sys.modules. Czy to w pakiecie __init__.py:

import sys 
sys.modules['my.packages'] = sys.modules[__name__] 

ten sposób maszyny wytrwałość może znaleźć zajęcia jeszcze.

Co się dzieje, gdy instancje Archetypes są przechowywane w ZODB, mechanizm trwałości przechowuje ścieżkę modułu dla klasy (kropkowana ścieżka Pythona, taka jak my.packages.types.foobar.FooBar) w przechowywanych danych. Podczas przywracania obiektu z ZODB ta sama ścieżka jest używana do ponownego utworzenia instancji. Gdy zmienisz nazwę pakietu, wszystkie te odniesienia są zepsute.

W powyższej sztuczce fajnie jest, że jeśli obiekt został zmieniony i ponownie zapisany w ZODB w transakcji, zapisana zostanie ścieżka modułu nowa. Można w ten sposób napisać do wszystkich instancji Archetypes z tego pakietu, aby migracja stała się trwała, aby można było ponownie usunąć powyższe działania.