Plone/Workflow-为什么portal_workflow工具的getStatusOf返回None?

标签 plone plone-4.x

我正在尝试获取敏捷内容类型 (my.product.my_object) 的工作流程状态

我的工作流程“my_object_workflow”具有三种状态: 草稿 待批准 已批准

在我的浏览器 View 中,我试图获取 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
  • 这些值是工作流程转换(转换列表)

为什么你的大脑元数据有错误的值?

如果您操作/更改工作流程并且忘记更新目录,通常会发生这种情况。


为什么调用getStatusOf是None?

如果您更改工作流程并且新工作流程的 workflow_history 存储为空或尚未初始化,通常会发生这种情况。


如果更改我的类型的工作流程配置,如何避免此问题?

恕我直言,这不是一件容易的事。您需要注意几件事。

我个人使用 ftw.upgrade 为我的类型引入新的工作流程。

浏览Workflow Chain Updater自述文件部分或查看 implementation

如果您更改了适合您类型的工作流程,则必须手动执行以下步骤或使用 ftw.upgrade:

  • 将每个对象的状态设置为新工作流程的初始状态
  • 将工作流程历史记录从旧工作流程迁移到新工作流程
  • 如果您从特定类型中删除工作流程,则需要为每个受影响的对象手动重置权限。
  • 保持目录最新。

关于Plone/Workflow-为什么portal_workflow工具的getStatusOf返回None?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853835/

相关文章:

plone - 重置 plone 以访问主题控制面板

plone - 在 Plone 中添加一个简单的 html 和 css 页面

OS X Mavericks 上的 Plone 4.3.x

python - 如何在 ZPT 中循环 OrderedDict 的子组?

python - 以编程方式创建敏捷项目

python - 我们可以使用 DataContentAdapter 在 plone 表单生成中搜索增值

plone - 如何在 Plone 站点外触发 portal_quickinstaller.reinstallProducts 表单?

plone - 安装快速安装程序产品时选择配置文件 (Plone 4)

plone.registry - 当 IRecordModifiedEvent 被触发时,如何捕获注册表中的更改?

plone - 属性错误: 'module' object has no attribute 'NavigationViewlet'