2014-10-01 32 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