2009/07/25

plonectl debug

以 standalone 方式安裝 Plone3 installer 後,可用 zinstance 目錄裡 bin/plonectl 程式來啟動 Zope/Plone,bin/plonectl 功能和之前的 bin/instance 一樣。例如執行 bin/plonectl fg 後,除了啟動 Zope/Plone 外,還可以在 shell 即時顯示系統訊息。使用 fg 或 start 參數啟動 Zope/Plone 後,它會鎖住 Data.fs 檔案,代表這種啟動方式只允許一個 client 存取 ZODB。想要多個 client 同時存取 ZODB,必須改用 zeo 安裝方式。

在 Data.fs 沒被鎖住的情況下,可以執行 bin/plonectl debug 手動存取 ZODB 內容。

$ bin/plonectl debug
instance: Starting debugger (the name "app" is bound to the top-level Zope object)
>>> dir()
['Zope2', '__builtins__', '__doc__', '__name__', 'app', 'configure']
>>> app.Plone['front-page'].getRawTitle()
'Welcome to Plone'
>>> app.Plone['front-page'].setTitle("New Title for Plone Site")
>>> import transaction
>>> transaction.commit()

>>> myitem = app.mysite['my-folder']['001']
>>> myitem.meta_type
'MyType'

以上是最簡單的範例。下列是其他範例,記得改過內容的話,都要使用 transaction.commit() 來確認寫進 ZODB。

>>> for k, v in app.Plone.Members.marr.objectItems():
...     print k, v.getRawText()
...
>>> for obj in app.Plone.Members.marr.objectValues():
...     obj.setText('<h2>My Test</h2>')
...

另外還可以把指令寫成 script 檔案,例如 updateTitle.py 的內容:

app.Plone['front-page'].setTitle("New Title Updated by Script")
import transaction
transaction.commit()

再用 bin/plonectl run updateTitle.py 執行結果。如果需要 admin 權限的話,要事先加上權限宣告:

import os
import transaction

from AccessControl.User import UnrestrictedUser
from AccessControl.SecurityManagement import newSecurityManager

admin = UnrestrictedUser('admin', '', ['Manager'], '')
newSecurityManager(None, admin)

app['mysite'].mytype['my-item'].setStartDate('1918/01/01')
transaction.commit()

No comments: