2014-10-01 30 views
3

我正在使用invokeFactory從PloneFormGen表單自定義腳本適配器創建內容項目。目前爲止一切正常,但是我們想要開始生成註釋,以包含在創建操作中,以獲取該項目的歷史記錄。評論本身將使用表單中的字段和一些預設文本生成。從InvokeFactory創建內容時包含「更改註釋」

這是PFG能做的嗎?

內容類型是一種自定義類型,它是可版本化的。使用的Plone 4.3.2PFG 1.7.14

編輯

我當前的代碼:

from Products.CMFPlone.utils import normalizeString 

portal_root = context.portal_url.getPortalObject() 
target = portal_root['first-folder']['my-folder'] 
form = request.form 
title = "My Title: "+form['title-1'] 
id = normalizeString(title) 
id = id+"_"+str(DateTime().millis()) 

target.invokeFactory(
    "MyCustomType", 
    id=id, 
    title=title, 
    text=form['comments'], 
    relatedItems=form['uid'] 
    ) 

我一直在使用像comments鍵試過,commentmessage,甚至cmfeditions_version_commenttarget.invokeFactory參數內。到目前爲止沒有運氣。

回答

2

我不確定這是否可能在自定義腳本適配器中。

您首次進入的行爲是None。如果動作是None,則歷史記錄將自動顯示Create。這是實現here (plone.app.layout.viewlets.content)

# On a default Plone site you got the following 
>>> item.workflow_history 
{'simple_publication_workflow': ({'action': None, 'review_state': 'private', 'actor': 'admin', 'comments': '', 'time': DateTime('2014/10/02 08:08:53.659345 GMT+2')},)} 

關鍵的字典中是工作流程ID和值是所有條目的元組。 所以你可以操縱你想要的條目。但是我不知道這是否可以用限制的python(自定義腳本適配器只能使用受限制的python)。

但你也可以添加新條目,通過擴展你的腳本:

... 

new_object = target.get(id) 
workflow_tool = getToolByName(new_object, 'portal_workflow') 

workflows = workflow_tool.getWorkflowsFor(new_object) 

if not workflows: 
    return 

workflow_id = workflows[0].id # Grap first workflow, if you have more, take the the one you need 
review_state = workflow_tool.getInfoFor(new_object, 'review_state', None) 

history_entry = { 
       'action' : action, # Your action 
       'review_state' : review_state, 
       'comments' : comment, # Your comment 
       'actor' : actor, # Probably you could get the logged in user 
       'time' : time, 
       } 

workflow_tool.setStatusOf(workflow_id, context, history_entry) 
+0

我試圖在CSA你的建議。我收到了這個錯誤:'未經授權:您不允許在此上下文中訪問'setStatusOf'。 內容類型在其內容類型的python文件中有一個'at_post_create_script'和'at_post_edit_script'函數。我想知道我是否可以在那裏使用武力?我注意到,從'invokeFactory'創建項目時,這些函數不會被調用,但也許我可以得到它? – rain2o 2014-10-02 13:17:58

+1

我能夠通過'workflow_tool.doActionFor()'工作。我只需要創建一個新的工作流程轉換,其中包含我想要的操作名稱。 – rain2o 2014-10-02 13:44:08

+0

您必須使用正確的權限運行腳本。 afaik可以使用代理角色(例如Manager)來運行腳本。所以你可以避免權限問題(新的工作流也可能是一個解決方案)。您也可以將其添加到'at_post_create_script'腳本中。但也有你需要確保擁有正確的權限。 – Mathias 2014-10-03 06:35:23