假設有個名稱是 my.packages 的模組,用了一陣子,產生許多 MyType 的內容項目,想要把它改名為 my.package,下列是處理經驗記錄。
第一次的嘗試,是在 src 目錄裡把 my.packages 複製並修改成 my.package,停用 my.packages 再啟用 my.package 模組後,存取 http://localhost:8080/mysite/myfolder/my-item 時,會遇到 <persistent broken my.packages.content.mytype.MyType instance '\x00\x00\x00\x00\x00Un^'> 訊息。當然,使用 migration 程式碼是個方法,但實在是殺雞用牛刀。
有個輕量級的方案,是先在模組的 __init__.py 裡用 sys.modules 來建立相容資訊:
import sys sys.modules['my.packages'] = sys.modules[__name__]
不過,我的模組還額外有用到 content type based portlet,它同樣把舊的模組名稱記到 instance 裡,在 https://dev.plone.org/ticket/7375 有提到處理方法,試了沒成功,有成功的方式是到 @@types-controlpanel 先取消 portlet 的設定值,再啟用 my.package 模組。這時候出現一些警告訊息,但是系統看起來運作正常,應該是提供相容資訊後的暫時訊息:
INFO Archetypes ArchetypesTool: Trying to register "my.package.MyType" which has already been registered. The new type my.packages.content.mytype.MyType is going to override my.package.content.mytype.MyType
再到 ZMI 裡 archetype_tool,執行 Update Schema 後,希望這樣就算是把 instance 更新了。
No comments:
Post a Comment