跳转到主要内容

通过使用DSL(领域特定语言)用纯文本描述来生成您的Plone工作流程。

项目描述

ftw.lawgiver

ftw.lawgiver 生成基于以自定义 DSL 编写的可读性规范 Plone 工作流。

动机

开发和维护复杂的Plone工作流是一项耗时且繁琐的工作。需要管理几十种不同角色和不同工作流状态的不同权限。通常,这需要在Zope的ZMI中直接通过选择或取消选择成千上万的复选框来完成。这个过程已被证明非常繁琐且容易出错。此外,记录工作流及其相关的设计决策,这些决策导致了权限和角色的最终配置,并非易事。现有工作流的扩展或修改变得非常困难,导致工作流难以维护。

另一个问题是工作流集成者和客户之间的沟通。Zope的安全系统基于基于角色的访问控制(RBAC),由于它使用角色、权限和工作流状态,因此本质上很复杂。经验表明,这些安全概念可能难以向客户传达。

如何工作

ftw.lawgiver通过使用DSL(领域特定语言)来描述工作流应该如何工作,从而帮助解决这些问题。然后,根据此规范,Lawgiver生成完整的工作流定义(definition.xml)。通过将此规范与结果工作流定义(在XML中)分开,规范不需要使用权限——处理权限是Lawgiver的工作。

使用规范文件,工作流可以随时轻松重新生成,并在重新生成时自动处理额外的权限。然而,如果需要管理更多或不同的权限,开发者仍然需要重新生成definition.xml。他或她必须确保工作流通过升级步骤/重新索引安全正确安装。

安装

  • ftw.lawgiver添加到您的buildout配置

[instance]
eggs +=
    ftw.lawgiver
  • 安装ftw.lawgiver的通用设置配置文件。

兼容性

Plone 4.3

操作组

在规范中,我们使用所谓的操作组的概念来描述角色允许做什么。它基本上将一些语义上相似的Plone / Zope权限组合在一起,这样我们只需要根据这些操作组而不是单个权限来定义工作流。

例如,有一个包含权限如ViewAccess Contents Informationview操作组。

将权限注册到操作组

将权限注册到操作组应在定义权限的包中完成。这允许将权限和操作组注册的变化一起保存在分支中,用于审查等。ftw.lawgiver已将默认Plone / Zope权限分配给操作组。

注册是在ZCML中完成的。以下是一个示例lawgiver.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="my.package">

    <include package="ftw.lawgiver" />

    <lawgiver:map_permissions
        action_group="add"
        permissions="my.package: Add Foo,
                     my.package: Add Bar"
        />

</configure>

如果您在同一个map_permissions指令中定义多个权限,请确保用逗号分隔它们。

通过将ZCML放入单独的lawgiver.zcml文件,您可以在您的插件包中定义lawgiver,而无需在默认的configure.zcml中通过使用zcml:condition来定义对ftw.lawgiver的依赖。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:zcml="http://namespaces.zope.org/zcml"
    i18n_domain="my.package">

    <include zcml:condition="installed ftw.lawgiver" file="lawgiver.zcml" />

</configure>

覆盖操作组

可能权限到操作组映射对特定的流程不起作用,您希望仅为此流程更改映射。

这可以通过在ZCML中也定义该工作流程轻松实现。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="my.package">

    <include package="ftw.lawgiver" />

    <lawgiver:map_permissions
        action_group="add"
        permissions="my.package: Add Foo,
                     my.package: Add Bar"
        workflow="my_workflow"
        />

</configure>

将权限分配给多个操作组

有时,应将权限分配给多个操作组。这可以通过map_permissions指令的move属性来完成。只需确保在执行此操作之前,加载了所有其他map_permissions ZCML,特别是ftw.lawgiver的默认lawgiver.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="my.package">

    <include package="ftw.lawgiver" />

    <lawgiver:map_permissions
        action_group="add"
        permissions="Add portal content"
        />

    <lawgiver:map_permissions
        action_group="add ticket"
        permissions="my.package: Add Ticket"
        workflow="my_workflow"
        />

    <!-- We want to have "Add portal content" in the "add ticket" action group too,
         but we should not remove it from "add".
         By using move="False" we can add "Add portal content" to "add ticket" without
         removing it from "add".
         /-->

    <lawgiver:map_permissions
        action_group="add ticket"
        permissions="Add portal content"
        workflow="my_workflow"
        move="False"
        />

</configure>

工作流范围

可以使用lawgiver:workflow指令来组合多个语句并将它们应用于特定的工作流程。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="my.package">

  <include package="ftw.lawgiver" />

  <lawgiver:workflow name="the-workflow">

    <lawgiver:map_permissions
        action_group="add folder"
        permissions="Add folder"
        />

    <lawgiver:ignore
        permissions="ATContentTypes: View history"
        />

  </lawgiver:workflow>

</configure>

工作流规范

规范以纯文本文件(specification.txt)的形式编写,该文件保存在保存definition.xml的同一目录中。

示例

状态和转换

状态和转换由简单的列表定义

[My Custom Workflow]
Description: A three state publication workflow
Initial Status: Private

Status Private:

Status Pending:

Status Published:

Transitions:
  Publish (Private => Published)
  Submit for publication (Private => Pending)
  Reject (Pending => Private)
  Retract (Pending => Private)
  Publish (Pending => Published)
  Reject (Published => Private)

我们不使用任何内部ID来标识工作流程状态或转换。相反,我们使用用户实际上将看到的相同的标签-这些ID由ftw.lawgiver自动生成。

角色映射

在Plone中,我们有一组相当技术性的角色(例如,编辑器、贡献者、读者),这些角色可能不适用于现实生活中的所有用例。客户可能有具有不同名称的自己的角色。由于现有的角色已经在Plone中建立,因此通常不是在Plone中添加新角色的好方法。最好尝试重用现有角色。

由于客户对其角色的标签不同,因此我们需要将客户角色映射到Plone角色

Role mapping:
  editor-in-chief => Reviewer
  editor => Editor
  everyone => Anonymous

在我们的示例中,我们只有“普通”编辑器和一名可以审查和发布内容的“主编”。我们不需要使用贡献者角色,因为我们的编辑器可以编辑、添加新内容,并为现有内容请求审查。因此,没有必要区分编辑器和贡献者角色。

转换守卫表达式

转换保护表达式是一种动态隐藏转换的方法,除了保护角色之外。使用选项语法来定义保护表达式。

DCWorkflow中的表达式是TALES表达式。要查看表达式中可用的上下文,请查看

警告:转换保护表达式本身不保护转换。如果用户知道执行转换的URL,它将通过。它只是从用户那里隐藏了转换。

[My Custom Workflow]
Initial Status: Private

Status Private:
Status Published:

Transitions:
  Publish (Private => Published) [guard-expression => python:here.guard(state_change)]
  Reject (Published => Private) [guard-expression => here/guard_reject]

一般说明

通常有一些通用语句,例如,具有管理员角色的用户可以始终在任何工作流程状态下编辑内容。此类语句不应为每个状态重复,而应定义一次作为通用语句。

示例

General:
  An administrator can always view the content
  An administrator can always edit the content
  An administrator can always delete the content

这些通用语句适用于所有状态。

描述状态

对于每个状态,我们描述具有特定角色的用户可以执行的操作。我们遵循的原则是任何用户/角色默认情况下都不允许执行任何操作,我们必须明确列出他将被允许执行的所有操作。

Status Private:
  An editor can view this content.
  An editor can edit this content.
  An editor can delete this content.
  An editor can add new content.
  An editor can submit for publication.
  An editor-in-chief can view this content.
  An editor-in-chief can edit this content.
  An editor-in-chief can delete this content.
  An editor-in-chief can add new content.
  An editor-in-chief can publish this content.

Status Pending:
  An editor can view this content.
  An editor can add new content.
  An editor can retract this content.
  An editor-in-chief can view this content.
  An editor-in-chief can edit this content.
  An editor-in-chief can delete this content.
  An editor-in-chief can add new content.
  An editor-in-chief can publish this content.
  An editor-in-chief can reject this content.

Status Published:
  An editor can view this content.
  An editor can add new content.
  An editor can retract this content.
  An editor-in-chief can view this content.
  An editor-in-chief can add new content.
  An editor-in-chief can retract this content.
  Anyone can view this content.

角色继承

角色可以从其他角色继承,全局和单一状态

[Role Inheritance Workflow]
Initial Status: Foo

Role mapping:
  editor => Editor
  editor-in-chief => Reviewer
  administrator => Site Administrator

General:
  An administrator can always perform the same actions as an editor.
  An administrator can always perform the same actions as an editor-in-chief.

Status Foo:
  An editor-in-chief can perform the same actions as an editor.
  An editor can view this content.
  An editor can edit this content.

Status Bar:
  An editor can view this content.
  An editor-in-chief can view this content.
  An editor-in-chief can edit this content.

工作列表

当您授予访问工作列表的权限时,将自动为您生成工作列表

[A workflow]
...

Status Pending:
  An editor-in-chief can access the worklist.

那些“可以访问工作列表”的语句在“通用”部分中不起作用,它们需要在“状态”部分中定义。

对于每个具有“可以访问工作列表”语句的状态,将生成一个受相应角色保护的工作列表。

工作流规范发现

所有注册的通用设置配置文件中的工作流目录都会自动扫描工作流规范。只需在工作流目录中放置一个specification.txtftw.lawgiver将自动发现它。

示例路径

  • 规范:profiles/default/workflows/my_custom_workflow/specification.txt

  • 工作流XML:profiles/default/workflows/my_custom_workflow/definition.txt

在这个例子中,假设profiles/default是一个注册的通用设置配置文件目录。

更改转换URL

有时过渡URL需要指向另一个视图。这可以通过使用transition-url选项来实现,其中可以传递一个字符串,然后将其替换为transition id。确保在生成工作流时使用双%%来替换不应该被替换的部分,例如%%(content_url)s

示例

transition-url = %%(content_url)s/custom_wf_action?workflow_action=%(transition)s

语言

当前支持的语言

英语(默认)

德语

贡献新语言

我们欢迎接受新语言的拉取请求!

创建新语言非常简单

  • ftw/lawgiver/tests/assets/languages/中创建一个新的规范示例,实现与specification.txt相同的流程。

  • 使用bin/test运行测试。此时应该失败。每次更改后都要继续运行它们。

  • ftw/lawgiver/wdl/languages/中添加一个新的语言模块。

  • ftw/lawgiver/wdl/languages/__init__.py中注册新语言。

  • 在您的新的语言类中实现特定于语言的限制和提取方法,直到所有测试都通过。

  • 将语言添加到readme中。

  • 向我们发送拉取请求!

生成工作流

要生成工作流,请转到lawgiver控制面板(在Plone控制面板中)。在那里您可以查看所有工作流的列表,通过选择其中一个,您可以查看规范和其他详细信息,例如操作组。

在此视图中,您可以生成工作流(自动保存到与specification.txt相同的目录中的definition.xml)并安装工作流/更新安全性。

https://raw.github.com/4teamwork/ftw.lawgiver/master/docs/screenshot-workflow-details.png

更新翻译

工作流详细信息视图中的“在本地目录更新翻译”按钮可以帮助您保持翻译的更新。它将直接写入您的机器上的本地目录。

在更新翻译时,这些文件会被写入

  • your/package/locales/plone.pot

  • your/package/locales/en/LC_MESSAGES/plone.po

在更新您的本地文件中的消息时,所有以工作流ID前缀开头的不再有效的消息将被自动删除。

测试工作流

检测您何时需要重新构建工作流非常重要。检测尚未映射到操作组的第三方插件权限也同样重要。

通过扩展WorkflowTest,可以轻松编写您的流程测试

from ftw.lawgiver.tests.base import WorkflowTest
from my.package.testing import MY_INTEGRATION_TESTING


class TestMyWorkflow(WorkflowTest):

    # The workflow path may be a path relative to the this file or
    # an absolute path.
    workflow_path = '../profiles/default/workflows/my-workflow'

    # Use an integration testing layer.
    layer = MY_INTEGRATION_TESTING

测试什么?

  • 当您的流程(definition.xml)需要重新生成时,测试将失败。这可能是由于新的权限应该被管理。

  • 当您安装提供新权限的新插件时,测试将失败。权限应该映射到操作组或明确标记为未管理。

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="ftw.lawgiver">

    <include package="ftw.lawgiver" />

    <lawgiver:ignore
        workflow="my_workflow"
        permissions="ATContentTypes: Upload via url,
                     ATContentTypes: View history"
        />

</configure>

自定义共享视图

法规制定者允许您根据需要自定义共享视图。

共享视图中的角色

默认情况下,@@sharing 视图列出了一些默认的Plone角色

  • 可以添加(Contributor

  • 可以编辑(Editor

  • 可以审核(Reviewer

  • 可以查看(Reader

通常工作流程不使用所有这些角色,或者使用不同的角色。法规制定者允许您配置在 sharing 视图中显示哪些角色。如果您的用户正在 @@sharing 视图中授予角色,您可能需要配置角色,以便它们具有有意义的名称,并且只列出相关的角色。

如果您想自定义工作流程中显示的角色,您可以直接在工作流程规范中这样做

[A workflow]

Role mapping:
  editor => Editor
  editor-in-chief => Reviewer
  administrator => Site Administrator

Visible roles:
  editor
  editor-in-chief

法规制定者随后设置了正确管理角色所需的权限。这对于已注册的角色有效。Plone默认情况下仅注册 ContributorEditorReviewerReader。请参阅注册附加角色部分。

翻译角色

法规制定者扩展了Plone的角色翻译系统,以便 @@sharing 视图中的角色可以按工作流程进行翻译。

这是通过Plone标准角色实用工具完成的,允许插件工具也能够使用正确的角色翻译,而无需进行自定义。

法规制定者在法规制定者控制面板中提供了示例翻译(plone.pot / plone.po),可以轻松地复制到您的本地plone翻译(locales)。这些翻译也包括角色翻译,可以根据您的需要进行修改。

法规制定者会根据您的工作流程自动查找正确的角色翻译。

注册其他角色

您可以轻松注册自定义角色或默认情况下不可见的Plone默认角色(例如 Site Manager)。

使用法规制定者指令进行注册新角色

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:lawgiver="http://namespaces.zope.org/lawgiver"
    i18n_domain="my.package">

    <include package="ftw.lawgiver" />

    <lawgiver:role name="Site Manager" />

</configure>

lawgiver:role 指令为您完成所有必要的事情,例如在zope中注册权限,将权限映射到默认的法规制定者 manage security 操作组,并注册所需的实用工具和适配器。

可选参数

  • permission:授予此角色所需的权限。权限自动生成为 Sharing page: Delegate [ROLE] role

  • register_permission:自动在Zope中注册权限。默认情况下为 True

  • map_permission:自动将权限映射到默认的法规制定者 manage security 操作组。法规制定者还会根据您在工作流程规范中的 Visible roles 配置重新映射权限。

共享视图中角色的描述

ftw.lawgiver 在单击共享视图表头中的角色文本时自动注册一个覆盖层。覆盖层显示当前工作流程每个状态下此角色可以执行的操作描述。

https://raw.github.com/4teamwork/ftw.lawgiver/master/docs/screenshot-sharing-overlay.png
向叠加层添加文本

您可以直接在工作流程规范中为每个角色添加文本到覆盖层

[A workflow]

Role mapping:
  editor => Editor
  editor-in-chief => Reviewer
  administrator => Site Administrator

editor-in-chief role description:
  The editor-in-chief reviews and publishes content.

此文本作为 plone 域的翻译建议,使其容易翻译为其他语言的多语言网站。

拦截和自定义转换

有时我们需要在执行某些转换时更改行为。《ftw.lawgiver》提供了一个基本视图类 ModifyStatusViewBase,用于使此类增强更容易,并结合规范中的 transition-url 选项。

思路是实现一个自定义视图,继承自ModifyStatusViewBase。该视图可以针对一个工作流或同一项目中的多个工作流进行实现。视图允许轻松拦截某些转换,改变、增强或终止标准行为。

示例

  1. 实现具有自定义行为的自定义视图

    from ftw.lawgiver.browser.modifystatus import ModifyStatusViewBase
    
    class WebModifyStatus(ModifyStatusViewBase):
    
        @ModifyStatusViewBase.intercept('web--TRANSITION--publish--draft-published')
        def verify_on_publish(self, context, transition):
            # verify things
            return self.redirect_to_content_status_modify(context, transition)

    对于未拦截的转换,默认行为是重定向到默认的content_status_modify脚本,这是Plone的默认行为。默认行为使用redirect_to_content_status_modify实现,因此上面的示例也回退到默认行为。

    基类提供功能作为方法

    • execute_transition(context, transition, **kwargs):直接执行content_status_modify脚本,这样我们可以在稍后更改重定向或在同一事务中做更多的事情。

    • redirect_to_content_status_modify(context, transaction):将浏览器重定向到content_status_modify脚本。脚本不在同一事务中执行。

    • set_workflow_state(context, review_state, **infos):更改上下文的工作流状态,而不执行转换或尊重任何守卫。

    • in_state(context, review_state):上下文管理器,用于暂时切换审查状态。

    • redirect_to(context):重定向到上下文的绝对URL。

  2. 在ZCML中注册视图

    <browser:page
        name="web-modify-status"
        for="*"
        class=".modifystatus.WebModifyStatus"
        permission="zope2.View"
        />
  3. 配置lawgiver工作流使用此视图作为动作

    # Settings
    transition-url = %%(content_url)s/@@web-modify-status?transition=%(transition)s

专业领域

使用collective.deletepermission删除内容

collective.deletepermission通过添加新的删除权限来解决在某些情况下发生的删除问题。请参阅其readme以获取更多详细信息。

为了能够删除内容,用户必须在内容上具有delete动作组(Delete portal content),同时在父内容上具有addDelete objects)。

ftw.lawgivercollective.deletepermission配合良好。使用额外的ftw.lawgiver [deletepermission]来安装带有collective.deletepermission的lawgiver。

请注意,当您使用已安装collective.deletepermission生成工作流时,您还需要在生产环境中安装collective.deletepermission

卸载

此包提供了一个卸载Generic Setup配置文件,但它不会卸载包依赖项。如果您不再使用它们,请确保卸载依赖项。

使用控制台重建

ftw.lawgiver注册了一个zopectl命令,因此可以使用控制台一次性重建所有工作流

$ ./bin/instance rebuild_workflows --help
usage: interpreter [-h] [-s SITE]

Rebuild ftw.lawgiver workflows.

optional arguments:
  -h, --help            show this help message and exit
  -s SITE, --site SITE  Path to the Plone site for discovering the worklfows.
                        (default: Plone)

变更日志

1.17.5 (2020-07-27)

  • 添加与Plone 5(plone.protect)中提供的CSRF自动保护兼容性。[djowett-ftw]

1.17.4 (2020-01-22)

  • 忽略由Products.PloneHotfix20200121引入的权限。[jone]

1.17.3 (2019-12-10)

  • 修复通过REST-API共享视图的bug。[njohner]

1.17.2 (2019-11-28)

  • 测试:在单元测试中改进工作流测试的diff输出。[jone]

1.17.1 (2019-11-22)

  • 使用当前版本的ftw.testing并删除unittest2。[jone, busykoala]

1.17.0 (2019-11-15)

  • 默认情况下忽略Plone 5中的ATContentTypes权限。[jone]

1.16.1 (2019-09-12)

  • 禁用Plone 5.1.5支持的lawgiver-sharing-describe-role上的Diazo。[jone]

  • 修复对象[Nachtalb]上设置工作流状态时的流程安全性和大脑未更新问题。

1.16.0 (2018-08-07)

  • 支持工作流转换守卫表达式。[elioschmutz]

1.15.0 (2018-08-03)

  • 提供实现自定义修改状态视图的基础类。[jone]

1.14.1 (2018-01-15)

  • 修复ZCML文件中的翻译域。[jone]

  • 修复使用非ASCII字符标题描述角色时的编码问题。[jone]

1.14.0 (2018-01-08)

  • 停止对Plone 4.2的支持。[mbaechtold]

  • 添加对Plone 5.1的支持。[mbaechtold]

1.13.0 (2017-12-18)

  • 添加新的lawgiver:workflow指令。[jone]

1.12.0 (2017-12-15)

  • 忽略plone.restapi权限,因为它们是全局管理的。[elioschmutz]

1.11.0 (2017-12-06)

  • 同时翻译状态和它们的ID。[jone]

  • 控制面板:将未映射的权限分别放入忽略和未知组。[jone]

1.10.1 (2017-07-27)

  • 修复共享页面角色描述弹出窗口中的审阅状态翻译。审阅状态现在按状态标题翻译,而不是按ID。[jone]

1.10.0 (2017-07-11)

  • collective.deletepermission依赖项设置为可选。如果您升级到此版本的ftw.lawgiver,您很可能希望启用ftw.lawgiver [deletepermission]额外功能。[jone]

1.9.1 (2017-07-10)

  • 修复德语翻译中的错误[raphael-s]

1.9.0 (2017-01-03)

  • 添加了重建规范和创建升级步骤的控制面板按钮。[jone]

1.8.0 (2016-06-30)

  • 将plone.app.contenttypes权限添加到lawgiver.zcml。由于plone.app.contenttypes是标准Plone,我们将在lawgiver.zcml中添加plone.app.contenttypes映射。[elioschmutz]

1.7.0 (2016-05-02)

  • 添加管理翻译权限以支持plone.app.locales。[raphael-s]

  • 忽略访问非活动内容和未来内容的权限,因为门户目录检查Plone根目录中的这些权限,而不是上下文。[mbaechtold]

  • 不再忽略添加集合端口和静态端口的权限,而是将它们映射到现有的“管理端口”操作组。[mbaechtold]

1.6.2 (2015-11-16)

  • 修复UnicodeDecodeError。[mbaechtold]

1.6.1 (2015-10-08)

  • 通过翻译状态和转换的标签而不是ID来修复翻译问题。请重新构建现有工作流的翻译。[jone]

1.6.0 (2015-05-21)

  • 添加将权限分配给多个操作组的功能。这是通过在map_permissions中使用move="False"来实现的。[jone]

1.5.0 (2014-12-08)

  • Plone 4.3.4:将“编辑评论”权限映射到“编辑”操作组。[jone]

1.4.0 (2014-09-09)

  • 实现bin/instance rebuild_workflows命令。[jone]

  • 添加一次性重建所有工作流规范的按钮。[jone]

  • 在已发布蛋包的工作流上显示警告。[jone]

  • i18n生成器:在生成的消息字符串中转义引号。[jone]

1.3.1 (2014-05-28)

  • generate_role_translation_idtranslate_role_for_workflow提取到utils中。[jone]

  • 修复在OSX Mavericks上定义.xml的漂亮打印问题。在Mavericks上,大部分定义.xml都写在了单行上。[jone]

1.3.0 (2014-05-19)

  • 添加用于描述角色的角色描述语句。这允许为每个角色添加文本描述,这些描述将在共享视图的新角色描述覆盖中显示。[jone]

  • 修复“role”指令的默认权限问题。默认权限之前未正确设置。[jone]

  • 实现卸载配置文件。[jone]

  • 工作流详细信息:新按钮用于更新您包的本地目录中的翻译。[jone]

  • 在共享视图中实现覆盖,描述角色的操作和转换。[jone]

  • 添加德语规范支持。[jone]

  • 添加对非英语规范解析的支持。[jone]

1.2.2 (2014-01-09)

  • 修复在遍历视图时错误的角色标题。[jone]

  • 修复在之前没有发生遍历时的本地角色适配器查找。[jone]

1.2.1 (2013-11-26)

  • 将plone.app.event的“导入iCal”权限映射到“管理内容设置”。[jone]

1.2 (2013-08-26)

  • 工作流生成:对工作列表进行排序,以确保结果是一致的。[jone]

  • 支持全局忽略时按工作流重新映射权限。#22 [jone]

  • 支持配置共享视图中的可见角色。 规范现在允许定义一个应在共享视图中出现的角色列表。[jone]

  • 针对共享视图的上下文/工作流程敏感的角色翻译。 动态角色:取代Plone的默认角色实用工具,允许我们根据当前上下文的工作流程更改共享视图中的角色翻译。Lawgiver的新默认角色实用工具/适配器提供每个工作流程的角色翻译。[jone]

1.1 (2013-08-08)

  • 忽略工作流程的plone.resourceeditor权限。[jone]

1.0 (2013-05-28)

  • 初始实现。[jone]

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

ftw.lawgiver-1.17.5.tar.gz (651.0 kB 查看散列值)

上传时间

由以下组织支持