我的站点中有一个包含数百个子文件夹的文件夹。每个子文件夹代表一个文档提交,其中包含与提交相关的项。每个子文件夹的默认页面都是一个自定义页面模板(基于文档),根据查看用户角色的不同,该模板显示的信息略有不同。例如,具有经理角色的用户看到的内容与具有审阅者角色或编辑角色的用户略有不同。站点上的用户被分配到不同文件夹的不同角色-例如,Manager可以将用户A指定为文件夹1-5的审阅者,将用户B指定为文件夹6-10的审阅者。
我想在用户的仪表板中创建一个portlet,以显示他们被分配了审阅者访问权限的所有文件夹,或者,如果这样做更容易,我也可以只在仪表板中创建一个指向页面模板的链接。我最初认为我应该创建一个集合,但是没有内置的“钩子”来显示用户被分配了特定角色的内容。
我不能简单地限制它,使内容不可见,除非您拥有审阅者角色,因为它需要对所有经过身份验证的用户可见。
我一直在尝试使用标准视图(folder_listing)模板来尝试找到正确的代码。我曾尝试在"entry“插槽的开头定义一个"roles”变量:
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
当我使用它的时候,我没有得到任何结果。我稍微修改了一下,这样它只会在页面中显示它所扮演的角色,并且我不认为它是在拉动当前条目的角色。
如果能朝着正确的方向前进,我们将非常感激!
发布于 2011-10-17 05:44:03
我认为问题在于,顾名思义,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类的方法中。
https://stackoverflow.com/questions/7787352
复制相似问题