2013-10-12 23 views
0

使用plone 4.Plone:我如何将用户角色分配给以组员身份为基础的用户?

我上次使用plone 5年前,与python生锈,通常不认为我自己是一个开发人员这些天。我只是想知道我想要做的是:

  1. 可能没有编码。
  2. 如果没有,在我到达某个地方之前,我需要阅读哪些资源。问题

声明:

我开发Plone站点为一个中型的学术组织(它没有自己的IT部门,一般是不知道CMS'es的)。该组织有一个总体领导。该组织分为5个组,由不同的用户组成。这5个小组中的每一个都有小组组长。 Plone网站有内部和外部发布工作流程(我认为它是作为附加组件发布的)。

我在我的plone网站上创建了5个组(Group1-5)以反映这种结构。我还创建了一个名为GroupLeaders的小组,其中包含5个小组的5位领导。每个用户都有一个个人文件夹。此外,每个组都有一个组文件夹。还有一个整体组织文件夹。

读(r)/写(W)/内部刊物(IP)/外部出版物(EP)的权限:

用户文件夹:使用者(RW IP EP) 组文件夹:使用者(RW),组领导者(rw ip ep) 组织文件夹:用户(rw),组长(rw ip),组织负责人(rw ip ep)。

此外,组长也是他们小组的名义成员。最后,组织领导者属于5个小组之一。组织领导和组长不是同一个人。

团队领导和组织领导的身份在两年的固定期限后发生变化。在失去领导者身份后,用户将成为该组的简单成员(用户)。

我想实现以下工作流程:

在任何一组用户可以创建他们的个人文件夹(任何种类的)文件(这是外部立即发布)。用户在Group文件夹中创建的所有文档都必须经过相关组长的内部/外部发布批准。但仅仅是GroupLeaders的会员资格还不够。只有第2组的GroupLeader(说)应该能够批准/拒绝按组2。所以成员所做出的编辑,我需要这样的东西(元代码):

如果(成员属于关联GroupLeader & &成员属于关联集团2) 为成员分配审批工作流程 结束

我该如何做?

回答

2

您可以将角色分配到直接,无论是全局还是在给定的上下文中。

只需根据角色而不是组来设计您的工作流。通过组员资格,用户将在正确的上下文中拥有正确的角色。

因此,在组文件夹中,将编辑器角色分配给相应的Group组,并将审阅者角色分配给相应的GroupLeader组。当组长从GroupLeader组中删除,并且其他用户添加到该组时,角色自动跟随。

+0

感谢您的回答。然而,这里的GroupLeader小组由5人组成,其中只有一个小组被允许担任小组审查员角色(小组3的负责人不应该被允许审查小组2的编辑)。显而易见的答案是,我应该创建5个额外的组(Group1Leader,Group2Leader等),每个组只由一个组领导组成。这是一个不整洁的解决方案。 – user2751530

+0

另一种方法是使用['borg.localrole'](https://pypi.python.org/pypi/borg.localrole/)根据组成员身份计算动态组;因此根据“Group1”和“GroupLeaders”中的成员资格生成“Group1Leader”。对于只有5位领导,我确实认为这是过分的。 –

+0

IIRC,博格已弃用或不再推荐,不是吗? –

0

以下的Martijn的回答后,“前脚本”添加以下内容作为对transistions“publish_internally”和“publish_externally”:

pu=context.plone_utils 

current_user_group_memberships = pu.portal_membership.getAuthenticatedMember().getGroups() 
groups_with_locally_assigned_write_permission = [] 

# Get all local role-assignments of object: 
local_roles=context.acl_users.getLocalRolesForDisplay(context) 
inherited_local_roles=pu.getInheritedLocalRoles(context) 
all_local_roles = local_roles + inherited_local_roles 

# Of these assignments, collect groups with write-permissions: 
for role in all_local_roles: 
    if role[2] is 'group' and 'Contributor' in role[1] or 'Editor' in role[1]: 
     groupname = role[0] 
     if groupname not in groups_with_locally_assigned_write_permission: 
      groups_with_locally_assigned_write_permission.append(groupname) 

# Now, we compare, if the user is a member of one of these groups: 
for group in groups_with_locally_assigned_write_permission: 

    # Is member of an assigned group: 
    if group in current_user_group_memberships: 
     return True 

    # Not groupmember, but in orgafolder should be able to publish internally: 
    #elif [CONTEXT_IS_ORGAFOLDER] and transition=='publish_internally': 
    # return True 

    # Neither of conditions applied, continue for-loop: 
    else: 
     pass 

# For-loop ended and didn't bring good news: 
return False 

你还是得虽然找到一种方法,来识别,如果上下文是组织文件夹,并将其插入占位符[CONTEXT_IS_ORGAFOLDER]。

我想提一下,zopyx.plone.cassandra对理解权限的存储很有帮助。

相关问题