如何为敏捷内容类型设置编辑权限?

时间:2014-03-07 08:01:25

标签: python plone dexterity

我有灵巧内容类型,只有网站管理员才能编辑它。为此,我创建了一个额外的权限,并将其授予Site Admins。到我添加的类型的xml:

<property name="add_permission">my.product.EditContent</property>

这可以防止每个人创建没有适当权限的此类型。此外,我想阻止修改内容,并期望像:

<property name="edit_permission">unimr.subsite.EditTheme</property>

但这不起作用。我该如何管理?

1 个答案:

答案 0 :(得分:1)

基于敏捷的contenttypes的Factory-Type-Information(FTI)在plone.dexterity/plone/dexterity/fti.py中声明了一个add-permission-property,但是没有edit-permission-property。

如果您只是要求,要向管理员授予添加权限并且不需要进一步优化,您实际上不需要定义新权限,只需立即将其授予管理员,像这样:

<property name="add_permission">cmf.ManagePortal</property>

为了仅允许对管理员进行编辑,我在您的contenttype的类声明中使用此行阻止了local-permission-assignment的继承:

class YourDexterityContenttypeClassName(dexterity.Item): __ac_local_roles_block__ = True

但是,这也会阻止继承的View-and Review-permissions。如果您还需要单独处理这些,另一种方法是在创建contenttype时添加eventlistener,检查继承的角色并删除它的编辑角色:

from Acquisition import aq_inner

def blockEditors(obj, event):
    """ Remove possibly inherited editor-role.
    """

    context = aq_inner(obj)
    editors = context.users_with_local_role('Editor')

    # For any editor:
    for editor in editors:

        # Get her local-roles:
        roles = list(context.get_local_roles_for_userid(editor))

        # Subtract editor-role of roles:
        roles.remove('Editor')

        # Set roles (the old roles without editor):
        context.manage_setLocalRoles(editor, roles)

        # Update changes:
        context.reindexObjectSecurity()

默认情况下,管理员可以编辑您的内容类型,并拥有全局修改权限。

注意:这是一个昂贵的电话,这个例子只查找用户分配,您可能需要扩展此示例,以查找已分配的组。