Перечислите папки, к которым у пользователя есть доступ Reviewer в Plone 4 - PullRequest
1 голос
/ 17 октября 2011

У меня есть папка на моем сайте, которая содержит сотни подпапок. Каждая подпапка представляет отправку документа и содержит элементы, связанные с отправкой. Страницей по умолчанию для каждой подпапки является пользовательский шаблон страницы (на основе документа), который отображает немного различную информацию в зависимости от роли просматриваемого пользователя. Например, пользователи с ролью диспетчера видят что-то немного отличающееся от пользователей с ролью рецензента или редактора. Пользователям на сайте назначены разные роли для разных папок - например, диспетчер может назначить пользователя A в качестве проверяющего в папках 1-5 и пользователя B в качестве проверяющего в папках 6-10.

Я бы хотел создать на панели пользователя пользователя портлет, отображающий все папки, к которым ему был предоставлен доступ Reviewer, или я согласился бы, если бы на панели инструментов была ссылка, которая ведет к шаблону страницы, если это проще , Первоначально я думал, что создам коллекцию, но нет встроенного «крючка» для отображения контента, в котором пользователю назначена определенная роль.

Я не могу просто ограничить его, чтобы содержимое не было доступно для просмотра, если у вас нет роли рецензента, поскольку оно должно быть доступно для просмотра всем аутентифицированным пользователям.

Я играл с шаблоном стандартного представления (folder_listing), чтобы попытаться найти правильный код. Я попытался определить переменную "role" в начале слота "entry":

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 Ответ

1 голос
/ 17 октября 2011

Я думаю, что проблема в том, что 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.Вы можете поместить этот код в пользовательский портлет, возможно, в метод класса Renderer.

...