能够创建具有本地工作流程的项目工作区
项目描述
概述
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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 21eb9b7dedfbb650ad13442dd3a089fa4f44add2b3ae128b5ebd1c985aafcf1d |
|
MD5 | 6ee87bd6279d425b3e95a84ac021058e |
|
BLAKE2b-256 | 06883951b287c3f42f358396c21dbc74753a221a9fd754ede55818f1557efb60 |