列出用户在Plone 4中有审阅者访问权限的文件夹

列出用户在Plone 4中有审阅者访问权限的文件夹,plone,Plone,我的站点中有一个包含数百个子文件夹的文件夹。每个子文件夹表示文档提交,其中包含与提交相关的项。每个子文件夹的默认页面是一个自定义页面模板(基于文档),根据查看用户角色的不同,该模板显示的信息略有不同。例如,具有经理角色的用户看到的内容与具有审阅者角色或编辑器角色的用户略有不同。站点上的用户被分配到不同的文件夹中,例如,管理员可以将用户A分配到文件夹1-5中作为审阅者,将用户B分配到文件夹6-10中作为审阅者 我想在用户的仪表板中创建一个portlet,显示他们已被指派审阅者访问的所有文件夹,或者

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

我想在用户的仪表板中创建一个portlet,显示他们已被指派审阅者访问的所有文件夹,或者如果更简单的话,我只需要仪表板中指向页面模板的链接就可以了。我最初认为我应该创建一个集合,但是没有内置的“钩子”来显示用户被分配了特定角色的内容

我不能简单地限制它,使内容不可查看,除非您具有审阅者角色,因为它需要由所有经过身份验证的用户查看

我一直在使用标准视图(文件夹列表)模板来尝试找到正确的代码。我尝试在“entry”槽的开头定义一个“roles”变量:

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

tal:condition="python:'Reviewer' in roles"
以下是指向完整页面模板的链接:

当我使用它时,我只是没有得到任何结果。我对它进行了轻微的修改,这样它就可以在页面中显示它所扮演的角色,而我不认为它是在拉当前项目的角色


如果能朝着正确的方向努力,我们将不胜感激

我认为问题在于,
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)
此(未经测试)代码的灵感来源于in-plone.app.workflow包。
您可以将此代码放在自定义portlet中,也可以放在Renderer类中的方法中。

我认为问题在于,
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)
此(未经测试)代码的灵感来源于in-plone.app.workflow包。
您可以将此代码放在自定义portlet中,也可以放在Renderer类中的方法中。

第一个解决方案在我的页面模板中非常有效!我将使用其他代码,看看是否可以让它在portlet中工作,这会更好。此外,第一个选项也可以调整为在portlet中使用:),区别在于如果您只想找到本地角色或获得的角色,那么第一个解决方案在我的页面模板中可以完美地工作!我将使用其他代码,看看是否可以让它在portlet中工作,这会更好。此外,第一个选项也可以调整为在portlet中使用:),区别在于,如果您只想查找本地角色或获取的角色