Plone:如何为以组成员身份为基础的用户分配角色?

时间:2013-10-12 07:42:54

标签: permissions workflow plone roles

使用plone 4。

我上次使用过5年前的plone,生锈了python,现在通常不认为自己是开发人员。我只是想知道我想要做的是:

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

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

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

    阅读(r)/写(w)/内部出版物(ip)/外部出版物(ep)权限:

    用户文件夹:user(r w ip ep) 组文件夹:用户(r w),组长(r w ip ep) 组织文件夹:用户(r w),组长(r w ip),组织领导(r w ip ep)。

    此外,集团领导人也是其集团的名义成员。最后,组织领导者属于5个组中的一个。组织领导者和组长从不是同一个人。

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

    我正在尝试实施以下工作流程:

    任何组中的用户都可以在其个人文件夹中创建(任何类型的)文档(立即在外部发布)。用户在组文件夹中创建的所有文档必须由相关组长批准进行内部/外部发布。但是,仅仅成为GroupLeaders的会员资格是不够的。只有第2组(例如)的GroupLeader应该能够批准/拒绝第2组成员所做的编辑。因此,我需要类似(元代码)的内容:

    如果(成员属于GroupLeader&&成员属于第2组)    为成员分配批准工作流程 端

    我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以在全局和给定的上下文中将角色直接分配给

只需围绕角色而不是群组设计工作流程。通过组成员身份,用户将在正确的上下文中拥有正确的角色。

因此,在组文件夹中,将编辑者角色分配给相应的Group组,将审阅者角色分配给相应的GroupLeader组。从GroupLeader组中删除组长,并将另一个用户添加到该组后,角色会自动跟随。

答案 1 :(得分:0)

在遵循Martijn的回答后,将以下内容添加为“之前的'脚本'到转换'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对于理解权限的存储是一个很大的帮助。