列出用户在Plone 4中具有Reviewer访问权限的文件夹

时间:2011-10-16 21:11:01

标签: plone

我的网站中有一个包含数百个子文件夹的文件夹。每个子文件夹代表一个文档提交,其中包含与提交相关的项目。每个子文件夹的默认页面是一个自定义页面模板(基于文档),根据查看用户的角色显示略有不同的信息。例如,具有Manager角色的用户看到的内容与具有Reviewer角色或Editor角色的用户略有不同。网站上的用户被分配到不同文件夹的不同角色 - 例如,管理员可以将用户A指定为文件夹1-5上的审阅者,将用户B指定为文件夹6-10上的审阅者。

我想在用户的仪表板中创建一个portlet,显示他们被分配给审阅者访问权限的所有文件夹,或者我可以只使用仪表板中的一个链接转到页面模板,如果这更容易。我原本以为我会创建一个集合,但是没有内置的“钩子”来显示用户被分配了某个角色的内容。

我不能简单地限制它,以便除非你有审阅者角色,否则内容是不可见的,因为它需要所有经过身份验证的用户都可以查看。

我一直在使用标准视图(folder_listing)模板来尝试找到正确的代码。我已经尝试在“条目”插槽的开头定义一个“角色”变量:

tal:define="member context/portal_membership/getAuthenticatedMember; 
                   roles python:member.getRolesInContext(item);"

并对项目使用条件以仅显示用户具有审阅者角色的项目:

tal:condition="python:'Reviewer' in roles"

以下是整页模板的链接:http://www.tempfiles.net/download/201110/214265/folder_listing.html

当我使用它时,我得不到任何结果。我稍微修改了它,它只是在页面中显示我正在获得的角色,我不认为它正在拉动当前项目的角色。

非常感谢向正确的方向推进!!

1 个答案:

答案 0 :(得分:1)

我认为问题在于getRolesInContext正如名称所说,期望一个背景,而不仅仅是一个大脑。你应该尝试提供真实的对象:

tal:define="member context/portal_membership/getAuthenticatedMember; 
            itemObj item/getObject
            roles python:member.getRolesInContext(itemObj);"

否则,如果您只想查找本地分配的角色,可以使用以下代码:

from Products.CMFCore.utils import getToolByName

portal_url = getToolByName(context, "portal_url")
portal = portal_url.getPortalObject()
acl_users = portal.acl_users

res = []

for item in items:
    itemObj = item.getObject()
    local_roles = acl_users._getLocalRolesForDisplay(itemObj)
    for name, roles, rtype, rid in local_roles:
        if member.getId() == rid and 'Reviewer' in roles:
           res.append(item)

这个(未经测试的)代码的灵感来自plone.app.workflow包中的sharing view。 您可以将此代码放在自定义portlet中,也可以放在Renderer类中的方法中。