Доступ к контексту назначения портлета Plone 4 из экземпляра Renderer - PullRequest
3 голосов
/ 23 января 2012

Я хотел бы создать контекстный портлет для Plone4, который затем будет добавлен в определенные папки и отображен в соответствующих подпапках. Однако независимо от того, где показан портлет, я хотел бы получить доступ к контексту назначения портлета (где он был помещен в первую очередь) в экземпляре рендерера.

class Assignment(base.Assignment):
    ...

class Renderer(base.Renderer):

    def base_folder(self):
         # self.context is the current context.
         # but how to access the folder, to which the portlet has been assigned?

...

Искал контекст "назначения" в self.manager и self.data, но не нашел ничего подходящего.

Могут быть некоторые обходные пути: например, поиск пути от self.context до папки с портлетом или сохранение некоторой информации в экземпляре Assignment при создании портлета, но мне интересно, есть ли какой-нибудь прямой путь?

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Я придумал следующее, потому что хотел предоставить ссылку непосредственно на диалог настроек портлета. Я думаю, что значение контекста в конце функции - это тот объект, который вы хотите:

def settingsUrl(self):
    # this is odd... should be much more straightforward?
    # also, this is pretty slow.
    manager = self.manager
    context = self.context
    assignment = self.data

    allAss = []
    while not assignment in allAss:
        pam = getMultiAdapter((context,manager), IPortletAssignmentMapping)
        allAss = pam.values()
        if assignment in allAss:
            break

        if IAcquirer.providedBy(context):
            context=aq_parent(aq_inner(context))
        else:
            context = context.__parent__

    return '%s/++contextportlets++%s/%s' % (context.absolute_url(), 
                                            manager.__name__,
                                            assignment.__name__)

Upd. 2014: похоже, что можно собрать эту информацию из свойства __portlet_metadata__ средства визуализации портлетов, которое имеет ключи key (место назначения), category (например, «context»), manager (например, «plone.rightcolumn») и name.

0 голосов
/ 02 апреля 2014
class Renderer(base.Renderer):

    def your_method(self):
        assignment_context_path = self.__portlet_metadata__['key']
        assignment_context = self.context.restrictedTraverse(assignment_context_path)    
...