Plone/Workflow- 为什么 portal_workflow 工具的 getStatusOf 返回 None?
Plone/Workflow- Why is portal_workflow tool's getStatusOf returning None?
我正在尝试获取灵巧内容类型的工作流状态 (my.product.my_object)
我的工作流程 'my_object_workflow' 具有三种状态:
草案
pending_approval
批准
在我的浏览器视图中,我正在尝试获取 my_objects 的状态。
我在 portal_catalog 中查询 my_objects。
my_objects = api.portal.get_tool(name='portal_catalog').searchResults(
{'portal_type':'my.product.my_object',
...
})
我脑洞大开,然后遍历列表并尝试使用 portal_workflow 工具打印状态。:
wf_tool = api.portal.get_tool(name='portal_workflow')
for m_obj in my_objects:
print wf_tool.getStatusOf('my_object_workflow',m_obj.getObject())
不幸的是,它没有打印对象的状态,而是打印了 None。
我可以使用 m_obj['review_state'] 因为 m_obj 是大脑,但我更愿意使用 portal_workflow 工具。
什么会导致这种情况发生?我是不是误解了 getStatusOf 的实际用途?
我正在使用 Plone 4.3
要解决您的问题,您需要知道 getStatusOf
实际在做什么。
如果调用 getStatusOf
,有几种可能的情况会得到 None
。
先看一下实现(Products.CMFCore.WorkflowTool
):
def getStatusOf(self, wf_id, ob):
""" Get the last element of a workflow history for a given workflow.
"""
wfh = self.getHistoryOf(wf_id, ob)
if wfh:
return wfh[-1]
return None
def getHistoryOf(self, wf_id, ob):
""" Get the history of an object for a given workflow.
"""
if hasattr(aq_base(ob), 'workflow_history'):
wfh = ob.workflow_history
return wfh.get(wf_id, None)
return ()
getStatusOf
获取存储在 workflow_history
属性中的列表的最后一个条目。
workflow_history
是一个持久化字典:
- 键是工作流 ID - 在您的情况下
my_object_workflow
- 值是工作流转换(转换列表)
为什么你的大脑元数据有错误的值?
如果您 manipulate/change 工作流程而忘记更新目录,通常会发生这种情况。
为什么调用getStatusOf
是None?
如果您更改工作流程并且新工作流程的 workflow_history
存储为空或尚未初始化,通常会发生这种情况。
如果更改我的类型的工作流程配置,如何避免此问题?
恕我直言,这不是一件容易的事。您需要了解几件事。
我个人使用 ftw.upgrade
为我的类型引入新的工作流程。
通过 Workflow Chain Updater section of Readme or check out the implementation
如果您更改了类型的工作流程,则必须手动执行以下步骤或使用 ftw.upgrade:
- 将每个对象的状态设置为新工作流的初始状态
- 将工作流历史从旧工作流迁移到新工作流
- 如果从特定类型中删除工作流,则需要为每个受影响的对象手动重置权限。
- 使目录保持最新。
我正在尝试获取灵巧内容类型的工作流状态 (my.product.my_object)
我的工作流程 'my_object_workflow' 具有三种状态: 草案 pending_approval 批准
在我的浏览器视图中,我正在尝试获取 my_objects 的状态。 我在 portal_catalog 中查询 my_objects。
my_objects = api.portal.get_tool(name='portal_catalog').searchResults(
{'portal_type':'my.product.my_object',
...
})
我脑洞大开,然后遍历列表并尝试使用 portal_workflow 工具打印状态。:
wf_tool = api.portal.get_tool(name='portal_workflow')
for m_obj in my_objects:
print wf_tool.getStatusOf('my_object_workflow',m_obj.getObject())
不幸的是,它没有打印对象的状态,而是打印了 None。
我可以使用 m_obj['review_state'] 因为 m_obj 是大脑,但我更愿意使用 portal_workflow 工具。
什么会导致这种情况发生?我是不是误解了 getStatusOf 的实际用途?
我正在使用 Plone 4.3
要解决您的问题,您需要知道 getStatusOf
实际在做什么。
如果调用 getStatusOf
,有几种可能的情况会得到 None
。
先看一下实现(Products.CMFCore.WorkflowTool
):
def getStatusOf(self, wf_id, ob):
""" Get the last element of a workflow history for a given workflow.
"""
wfh = self.getHistoryOf(wf_id, ob)
if wfh:
return wfh[-1]
return None
def getHistoryOf(self, wf_id, ob):
""" Get the history of an object for a given workflow.
"""
if hasattr(aq_base(ob), 'workflow_history'):
wfh = ob.workflow_history
return wfh.get(wf_id, None)
return ()
getStatusOf
获取存储在 workflow_history
属性中的列表的最后一个条目。
workflow_history
是一个持久化字典:
- 键是工作流 ID - 在您的情况下
my_object_workflow
- 值是工作流转换(转换列表)
为什么你的大脑元数据有错误的值?
如果您 manipulate/change 工作流程而忘记更新目录,通常会发生这种情况。
为什么调用getStatusOf
是None?
如果您更改工作流程并且新工作流程的 workflow_history
存储为空或尚未初始化,通常会发生这种情况。
如果更改我的类型的工作流程配置,如何避免此问题?
恕我直言,这不是一件容易的事。您需要了解几件事。
我个人使用 ftw.upgrade
为我的类型引入新的工作流程。
通过 Workflow Chain Updater section of Readme or check out the implementation
如果您更改了类型的工作流程,则必须手动执行以下步骤或使用 ftw.upgrade:
- 将每个对象的状态设置为新工作流的初始状态
- 将工作流历史从旧工作流迁移到新工作流
- 如果从特定类型中删除工作流,则需要为每个受影响的对象手动重置权限。
- 使目录保持最新。