跳转到主要内容

能够创建具有本地工作流程的项目工作区

项目描述

概述

borg.project添加了创建具有本地工作流程策略和本地角色的项目工作区的功能。

已知borg.project与Plone 3.2、Plone 3.3以及最新的Plone 4.0 Beta兼容。

可以使用它为仅某些成员可以访问和修改的项目创建工作区,并且您可以决定在门户的其余部分使用不同于内容的其他工作流程。所有这些设置都集中配置在项目工作区本身。

变更历史

borg.project 更新日志

1.1rc9(未发布)

  • i18n:domain=plone for workflow,更新了德语翻译。如果您想使用这些翻译,需要删除borg工作流程并重新安装。像往常一样,安装前请备份![chaoflow]

  • 正确配置配置文件以在plone插件面板中显示[chaoflow]

  • 忽略获取的工作流程策略,启用嵌套borg.projects[chaoflow]

1.1rc8(2010-07-22)

  • Plone 4 兼容性[chaoflow, pbauer]

  • 当项目成员资格更改时,自动更新目录中的安全索引[do3cc]

1.1rc7(2010-02-04)

  • 捕获并处理项目复制粘贴过程中发生的异常[do3cc]

1.1rc6(2010-02-03)

  • 更改项目上多个方法上的权限限制,以便复制粘贴能正常工作[do3cc]

1.1rc5(2009-10-31)

  • 棕色纸袋发布,svn太新,文件太少[do3cc]

1.1rc4(2009-10-31)

  • 修复了过渡声明中工作流程状态错误的问题[jessesnyder]

  • 添加了i18n结构和德语翻译[redcor]

  • 为一些字段添加了默认值和测试[jcbrand]

  • 修复了返回本地角色的错误[do3cc]

  • 移动代码并添加buildout.cfgs以测试针对多个不同plone版本的兼容性[do3cc]

1.1rc3(13.02.2008)

  • 初始包结构。[zopeskel]

  • 从borg中提取borg.project[optilude]

  • 添加了测试和文档[optilude]

详细文档

borg.project:大众协作工作区

由Martin Aspeli <optilude@gmx.net>

此产品基于b-org,且仅在Plone 3上运行。它依赖于borg.localrole包。

将这些包放置在您的PYTHONPATH中或安装到buildout或工作环境中,然后使用Plone的插件产品配置进行安装。

使用borg.project,您可以在门户中创建一个文件夹,并分配以下内容:

  • 一些用户作为管理员,分配本地管理员角色

  • 一些用户作为团队成员,分配本地团队成员角色

  • 一个自定义工作流程,由CMFPlacefulWorkflow策略指定

  • 一个明确管理的可添加内容类型列表

项目工作流程的默认版本包含内容发布、仅对团队成员可见或完全私有的状态。

设置新项目

首先,我们需要添加一些成员

>>> from Products.CMFCore.utils import getToolByName
>>> membership = getToolByName(self.portal, 'portal_membership')
>>> membership.addMember('member1', 'secret', ('Member',), ())
>>> membership.addMember('member2', 'secret', ('Member',), ())
>>> membership.addMember('member3', 'secret', ('Member',), ())
>>> membership.addMember('member4', 'secret', ('Member',), ())
>>> membership.addMember('member5', 'secret', ('Member',), ())
>>> membership.addMember('member6', 'secret', ('Member',), ())

和一个只有一个成员的组

>>> groups = getToolByName(self.portal, 'portal_groups')
>>> _ = groups.addGroup('group1')
>>> _ = groups.addPrincipalToGroup('member4', 'group1')

我们需要是管理员才能创建项目工作区。

>>> self.loginAsPortalOwner()

plone/app/form/widgets中的UberMultiSelectionWidget要求addform的模式.List字段每个都有一个默认值,该值是可迭代的。(例如列表、元组、集合等。)

>>> from zope.publisher.browser import TestRequest
>>> from borg.project.browser.project import ProjectAddForm
>>> from borg.project.interfaces import IProject
>>> request = TestRequest()
>>> addform = ProjectAddForm(IProject, request)
>>> addform.form_fields.get('managers').field.default
[]
>>> addform.form_fields.get('members').field.default
[]
>>> addform.form_fields.get('groups').field.default
[]

现在我们可以创建项目对象。在这里,我们将通过在新建对象上设置相关属性,对其FTI调用_finishConstruction()以最终化工作流程创建,并发送IObjectCreatedEvent事件来模拟发生添加表单上的情况。

注意,管理员和成员是用户ID的列表。

>>> from zope.component import createObject
>>> project1 = createObject(u"borg.project.Project")
>>> project1.id = 'project1'
>>> project1.title = "Project 1"
>>> project1.description = "A first project"
>>> project1.managers = ('member1', 'member2',)
>>> project1.members = ('member2', 'member3',)
>>> project1.groups = ('group1',)

工作流程策略是从词汇表中获得的。默认词汇表简单地返回在安装时安装的特定策略。

>>> from zope.schema.interfaces import IVocabularyFactory
>>> from zope.component import getUtility
>>> policies_factory = getUtility(IVocabularyFactory, name=u"borg.project.WorkflowPolicies")
>>> policies_vocabulary = policies_factory(self.portal)
>>> workflow_policy = list(policies_vocabulary)[0]
>>> workflow_policy.value
'borg_project_placeful_workflow'
>>> project1.workflow_policy = workflow_policy.value

可添加的类型来自另一个词汇表,该词汇表应包括任何全局允许的类型。

>>> types_factory = getUtility(IVocabularyFactory, name=u"borg.project.AddableTypes")
>>> types_vocabulary = types_factory(self.portal)
>>> 'Document' in [v.value for v in types_vocabulary]
True
>>> 'Topic' in [v.value for v in types_vocabulary]
True

还有一个方法可以获取可添加类型字段的默认值。这会返回所有具有所有者角色列表的全球允许的类型。

>>> from borg.project.utils import default_addable_types
>>> default_addable = default_addable_types(self.portal)
>>> 'Document' in default_addable
True
>>> 'Large Plone Folder' in default_addable
False
>>> project1.addable_types = ('Document', 'Folder',)

现在让我们完成构建并触发这些事件。

>>> from zope.event import notify
>>> from zope.lifecycleevent import ObjectCreatedEvent
>>> try:
...     from zope.container.contained import ObjectAddedEvent, notifyContainerModified
... except ImportError:
...     pass # We are in Plone3 land
>>> notify(ObjectCreatedEvent(project1))
>>> new_id = self.portal._setObject('project1', project1)
>>> project1 = self.portal._getOb(new_id)
>>> if hasattr(project1.getTypeInfo(), '_finishConstruction'):
...     _ = project1.getTypeInfo()._finishConstruction(project1)

有了这个,项目就正确构建了。让我们验证本地策略是否到位。

>>> placeful_workflow = getToolByName(self.portal, 'portal_placeful_workflow')
>>> placeful_workflow.getWorkflowPolicyConfig(project1).getPolicyBelowId()
'borg_project_placeful_workflow'

并且我们的成员有适当的角色

>>> acl_users = getToolByName(self.portal, 'acl_users')

该用户仅是管理员。

>>> member1 = acl_users.getUserById('member1')
>>> 'Manager' in member1.getRolesInContext(project1)
True
>>> 'TeamMember' in member1.getRolesInContext(project1)
False

该用户既是管理员又是成员。

>>> member2 = acl_users.getUserById('member2')
>>> 'Manager' in member2.getRolesInContext(project1)
True
>>> 'TeamMember' in member2.getRolesInContext(project1)
True

该用户仅是成员。

>>> member3 = acl_users.getUserById('member3')
>>> 'Manager' in member3.getRolesInContext(project1)
False
>>> 'TeamMember' in member3.getRolesInContext(project1)
True

该用户通过群组关联。

>>> member4 = acl_users.getUserById('member4')
>>> 'Manager' in member4.getRolesInContext(project1)
False
>>> 'TeamMember' in member4.getRolesInContext(project1)
True

该用户与群组没有关联。

>>> member5 = acl_users.getUserById('member5')
>>> 'Manager' in member5.getRolesInContext(project1)
False
>>> 'TeamMember' in member5.getRolesInContext(project1)
False

最后,让我们验证权限管理是否已正常工作。关键在于具有TeamMember角色的用户应该能够添加我们明确定义的类型,但不能添加其他类型。

不过,两位管理员可以添加其他内容。

>>> self.login('member1')
>>> project1.invokeFactory('Document', 'd1')
'd1'
>>> project1.invokeFactory('Image', 'i1')
'i1'
>>> self.login('member2')
>>> project1.invokeFactory('Document', 'd2')
'd2'
>>> project1.invokeFactory('Image', 'i2')
'i2'
>>> self.login('member3')
>>> project1.invokeFactory('Document', 'd3')
'd3'
>>> project1.invokeFactory('Image', 'i3')
Traceback (most recent call last):
...
Unauthorized: Cannot create Image
>>> self.login('member4')
>>> project1.invokeFactory('Document', 'd4')
'd4'
>>> project1.invokeFactory('Image', 'i4')
Traceback (most recent call last):
...
Unauthorized: Cannot create Image

但当然,不是团队成员的用户无法添加任何内容。

>>> self.login('member5')
>>> project1.invokeFactory('Document', 'd5')
Traceback (most recent call last):
...
Unauthorized: Cannot create Document
>>> project1.invokeFactory('Image', 'i5')
Traceback (most recent call last):
...
Unauthorized: Cannot create Image

后来添加的用户应该能够立即查看文档。但这并不总是与本地角色配合工作。

>>> from zope.lifecycleevent import ObjectModifiedEvent
>>> project1.members = project1.members + ('member6',)
>>> self.login('member6')
>>> catalog = getToolByName(self.portal, 'portal_catalog')
>>> len(catalog(id='d1'))
0

好的,这还不是真正的测试,如果它出了问题,意味着可以移除事件处理器。下面是这个测试

>>> notify(ObjectModifiedEvent(project1))
>>> len(catalog(id='d1'))
1

贡献者

  • 马丁·阿斯佩利 [optilude]

  • 帕特里克·格尔肯 [do3cc]

  • 弗洛里安·弗里茨多夫 [chaoflow]

项目详情


下载文件

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

源分布

borg.project-1.1rc9.tar.gz (33.1 kB 查看哈希)

上传时间

由以下机构支持