Exemplo n.º 1
0
    def _lazyLoadPortlets(self, manager):
        retriever = getMultiAdapter((self.context, manager), IPortletRetriever)
        items = []
        for p in self.filter(retriever.getPortlets()):
            renderer = self._dataToPortlet(p['assignment'].data)
            info = p.copy()
            info['manager'] = self.manager.__name__
            info['renderer'] = renderer
            hashPortletInfo(info)
            # Record metadata on the renderer
            renderer.__portlet_metadata__ = info.copy()
            del renderer.__portlet_metadata__['renderer']
            try:
                isAvailable = renderer.available
            except ConflictError:
                raise
            except Exception, e:
                isAvailable = False
                logger.exception(
                    "Error while determining renderer availability of portlet "
                    "(%r %r %r): %s" % (
                    p['category'], p['key'], p['name'], str(e)))

            info['available'] = isAvailable
            items.append(info)
Exemplo n.º 2
0
    def _lazyLoadPortlets(self, manager):
        items = []
        # below assignments attribute should be assigned by parent code
        for p in self.filter(self.assignments):
            renderer = self._dataToPortlet(p['assignment'].data)
            info = p.copy()
            info['manager'] = self.manager.__name__
            info['renderer'] = renderer
            hashPortletInfo(info)
            # Record metadata on the renderer
            renderer.__portlet_metadata__ = info.copy()
            del renderer.__portlet_metadata__['renderer']
            try:
                isAvailable = renderer.available
            except ConflictError:
                raise
            except Exception, e:
                isAvailable = False
                logger.exception(
                    "Error while determining renderer availability of portlet "
                    "(%r %r %r): %s" % (
                    p['category'], p['key'], p['name'], str(e)))

            info['available'] = isAvailable
            items.append(info)
Exemplo n.º 3
0
    def _lazyLoadPortlets(self, manager):
        retriever = getMultiAdapter((self.context, manager), IPortletRetriever)
        items = []
        for p in self.filter(retriever.getPortlets()):
            renderer = self._dataToPortlet(p['assignment'].data)
            info = p.copy()
            info['manager'] = self.manager.__name__
            info['renderer'] = renderer
            hashPortletInfo(info)
            # Record metadata on the renderer
            renderer.__portlet_metadata__ = info.copy()
            del renderer.__portlet_metadata__['renderer']
            try:
                isAvailable = renderer.available
            except ConflictError:
                raise
            except Exception as e:
                isAvailable = False
                logger.exception(
                    "Error while determining renderer availability of portlet "
                    "(%r %r %r): %s" %
                    (p['category'], p['key'], p['name'], str(e)))

            info['available'] = isAvailable
            items.append(info)

        return items
Exemplo n.º 4
0
    def __call__(self):
        # The parent object is the Plone content object here; we get
        # it from the acquisition chain.
        parent = self.context.aq_inner.aq_parent.aq_parent
        panel = self.context

        portlets = []
        for assignment in panel:
            settings = IPortletAssignmentSettings(assignment)
            if not settings.get('visible', True):
                continue

            try:
                portlet = getMultiAdapter(
                    (parent, self.request, self, panel, assignment),
                    IPortletRenderer)
            except ComponentLookupError:
                logging.getLogger("panels").info(
                    "unable to look up renderer for '%s.%s'." %
                    (assignment.__class__.__module__,
                     assignment.__class__.__name__))
                continue

            info = {
                'manager': "panels",
                'category': CONTEXT_CATEGORY,
                'key': '/'.join(panel.getPhysicalPath()),
                'name': assignment.__name__,
                'renderer': portlet,
                'settings': settings,
                'assignment': assignment
            }

            hashPortletInfo(info)

            portlet.update()

            try:
                available = portlet.available
            except Exception as e:
                logging.getLogger('panels').info(
                    "available threw an exception for %s (%s %s)" %
                    (assignment.__name__, type(e), str(e)))
                continue

            if available:
                result = self.portlet(**info)
                portlets.append(result)

        return render(portlets, self.context.layout, self.request)
Exemplo n.º 5
0
    def spm_delete_portlet(self, name):
        assignments = aq_inner(self.context)
        IPortletPermissionChecker(assignments)()
        managerid = assignments.id.split('++')[-1]

        parent = aq_parent(aq_inner(self.context))
        key = '/'.join(parent.getPhysicalPath())
        portlethash = hashPortletInfo(
            dict(
                manager=managerid,
                category=CONTEXT_CATEGORY,
                key=key,
                name=name,
            ))

        portal_state = getMultiAdapter((self.context, self.context.REQUEST),
                                       name=u'plone_portal_state')
        portal = portal_state.portal()
        manager = getUtility(IPortletManager, name=managerid, context=portal)
        listhashes = manager.listAllManagedPortlets
        del assignments[name]
        listhashes.remove(portlethash)
        manager.listAllManagedPortlets = listhashes
        if not self.request.get('ajax'):
            self.request.response.redirect(self._nextUrl())
        return 'OK'
Exemplo n.º 6
0
    def add(self, content):
        """Add the rule to the context."""
        context = aq_inner(self.context)
        manager = aq_base(context)

        IPortletPermissionChecker(context)()

        portlet_name = INameChooser(manager).chooseName(None, content)
        manager[portlet_name] = content

        # our category is always 'context'
        # we need the key but we do not know how to get it
        # from the assignment or the manager
        content_object = aq_parent(aq_inner(self.context))
        key = '/'.join(content_object.getPhysicalPath())
        info = {
            'manager': manager.__manager__,
            'category': manager.__category__,
            'key': key,
            'name': portlet_name,
        }
        portlet_hash = hashPortletInfo(info)
        tile_url = add_tile(content_object,
                            self.request,
                            portlet_hash)
        # we need to set the referer in the request form
        # to get proper redirect
        self.request.form['referer'] = tile_url
    def spm_move_portlet_down(self, name):
        assignments = aq_inner(self.context)
        IPortletPermissionChecker(assignments)()
        managerid = assignments.id.split('++')[-1]

        parent = aq_parent(aq_inner(self.context))
        key = '/'.join(parent.getPhysicalPath())
        portlethash = hashPortletInfo(dict(manager=managerid, category=CONTEXT_CATEGORY, key=key, name=name,))

        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u'plone_portal_state')
        portal = portal_state.portal()
        manager = getUtility(IPortletManager, name=u'plone.rightcolumn', context=portal)
        listhashes = manager.listAllManagedPortlets
        retriever = getMultiAdapter((self.context, manager), ISolgemaPortletManagerRetriever)
        managedPortletsHashes = [a['hash'] for a in retriever.getManagedPortlets()]

        if portlethash in listhashes:
            hashAfter = managedPortletsHashes[managedPortletsHashes.index(portlethash)+1]
            listhashes.remove(portlethash)
            listhashes.insert(listhashes.index(hashAfter)+1, portlethash)
            manager.listAllManagedPortlets = listhashes
        else:
            manager.listAllManagedPortlets = listhashes.append(portlethash)
        
        self.request.response.redirect(self._nextUrl())
        return ''
    def spm_move_portlet_down(self, name):
        assignments = aq_inner(self.context)
        IPortletPermissionChecker(assignments)()
        managerid = assignments.id.split('++')[-1]
        content_type_portlet = False
        content_type_key = ""
        category = CONTEXT_CATEGORY
        if "+" in managerid:
            content_type_portlet = True
            content_type_key = managerid.split('+')[1]
            managerid = managerid.split('+')[0]
            category = CONTENT_TYPE_CATEGORY
        parent = aq_parent(aq_inner(self.context))
        key = '/'.join(parent.getPhysicalPath()) if not content_type_portlet else content_type_key
        portlethash = hashPortletInfo(dict(manager=managerid, category=category, key=key, name=name,))

        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u'plone_portal_state')
        portal = portal_state.portal()
        manager = getUtility(IPortletManager, name=managerid, context=portal)
        listhashes = manager.listAllManagedPortlets

        if portlethash in listhashes:
            hashAfter = listhashes.index(portlethash)
            listhashes.remove(portlethash)
            listhashes.insert(hashAfter + 1, portlethash)
            manager.listAllManagedPortlets = listhashes
        else:
            manager.listAllManagedPortlets = listhashes.append(portlethash)
        
        self.request.response.redirect(self._nextUrl())
        return 'OK'
Exemplo n.º 9
0
    def __call__(self):
        # The parent object is the Plone content object here; we get
        # it from the acquisition chain.
        parent = self.context.aq_inner.aq_parent.aq_parent
        panel = self.context

        portlets = []
        for assignment in panel:
            settings = IPortletAssignmentSettings(assignment)
            if not settings.get('visible', True):
                continue

            try:
                portlet = getMultiAdapter(
                    (parent,
                     self.request,
                     self,
                     panel,
                     assignment), IPortletRenderer)
            except ComponentLookupError:
                logging.getLogger("panels").info(
                    "unable to look up renderer for '%s.%s'." % (
                        assignment.__class__.__module__,
                        assignment.__class__.__name__
                        )
                    )
                continue

            info = {
                'manager': panel.__name__,
                'category': CONTEXT_CATEGORY,
                'key': '/'.join(parent.getPhysicalPath()),
                'name': assignment.__name__,
                'renderer': portlet,
                }

            hashPortletInfo(info)

            portlet.update()
            if portlet.available:
                result = self.portlet(**info)
                portlets.append(result)

        return render(portlets, self.context.layout, self.request)
Exemplo n.º 10
0
    def panels_for_assignments(self, assignments, manager, base_url):
        # todo: do we use a special cat for panels?
        category = self.__parent__.category
        key = self.__parent__.key

        data = []
        for idx in range(len(assignments)):
            name = assignments[idx].__name__
            if hasattr(assignments[idx], '__Broken_state__'):
                name = assignments[idx].__Broken_state__['__name__']

            # Todo: we can define an edit view for panels - for overlay etc. - IF needed...
            editview = queryMultiAdapter((assignments[idx], self.request),
                                         name='edit',
                                         default=None)

            if editview is None:
                editviewName = ''
            else:
                editviewName = '%s/%s/edit' % (base_url, name)

            panel_hash = hashPortletInfo(
                dict(
                    manager=manager.__name__,
                    category=category,
                    key=key,
                    name=name,
                ))

            try:
                settings = IPortletAssignmentSettings(assignments[idx])
                visible = settings.get('visible', True)
            except TypeError:
                visible = False

            data.append({
                'title': assignments[idx].title,
                'editview': editviewName,
                'hash': panel_hash,
                'name': name,
                'up_url': '%s/@@move-panel-up' % (base_url),
                'down_url': '%s/@@move-panel-down' % (base_url),
                'delete_url': '%s/@@delete-panel' % (base_url),
                'duplicate_url': '%s/@@duplicate-panel' % (base_url),
                'hide_url': '%s/@@toggle-visibility' % (base_url),
                'show_url': '%s/@@toggle-visibility' % (base_url),
                'visible': visible,
                'has_assignments': len(assignments[idx]),
            })
        if len(data) > 0:
            data[0]['up_url'] = data[-1]['down_url'] = None

        return data
Exemplo n.º 11
0
def portlets_for_assignments(self, assignments, manager, base_url):
    category = self.__parent__.category
    key = self.__parent__.key

    data = []
    for idx in range(len(assignments)):
        name = assignments[idx].__name__
        if hasattr(assignments[idx], '__Broken_state__'):
            name = assignments[idx].__Broken_state__['__name__']

        editview = queryMultiAdapter((assignments[idx], self.request),
                                     name='edit',
                                     default=None)

        if editview is None:
            editviewName = ''
        else:
            editviewName = '%s/%s/edit' % (base_url, name)

        settingsviewName = '%s/%s/edit-portlet-metadata' % (base_url, name)

        portlet_hash = hashPortletInfo(
            dict(
                manager=manager.__name__,
                category=category,
                key=key,
                name=name,
            ))

        try:
            settings = IPortletAssignmentSettings(assignments[idx])
            visible = settings.get('visible', True)
        except TypeError:
            visible = False

        data.append({
            'title': assignments[idx].title,
            'editview': editviewName,
            'hash': portlet_hash,
            'name': name,
            'up_url': '%s/@@move-portlet-up' % base_url,
            'down_url': '%s/@@move-portlet-down' % base_url,
            'delete_url': '%s/@@delete-portlet' % base_url,
            'metadata_url': settingsviewName,
            'hide_url': '%s/@@toggle-visibility' % base_url,
            'show_url': '%s/@@toggle-visibility' % base_url,
            'visible': visible,
        })
    if len(data) > 0:
        data[0]['up_url'] = data[-1]['down_url'] = None

    return data
Exemplo n.º 12
0
    def spm_move_portlet_delta(self, name='', position=None, manager=''):
        position = self.request.get('position', position)
        managerid = self.request.get('manager', manager)
        name = self.request.get('name', name)
        assignments = aq_inner(self.context)
        parent = aq_parent(aq_inner(self.context))

        portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state')
        portal = portal_state.portal()
        basemanagerid = assignments.id.split('++')[-1]
        category = CONTEXT_CATEGORY
        content_type_portlet = False
        content_type_key = ""
        if "+" in basemanagerid:
            content_type_portlet = True
            content_type_key = basemanagerid.split('+')[1]
            basemanagerid = basemanagerid.split('+')[0]
            category = CONTENT_TYPE_CATEGORY
        manager = None
        if managerid:
            managerid = managerid.replace('portletmanager-','').replace('-','.')
            if managerid != basemanagerid:
                try:
                    manager = getUtility(IPortletManager, name=managerid, context=portal)
                except:
                    pass
                if manager:
                    newColumn = getUtility(IPortletManager, name=managerid, context=parent)
                    new = getMultiAdapter((parent, newColumn,), IPortletAssignmentMapping, context=parent)
                    new[name] = assignments[name]
                    del assignments[name]
        if not manager:
            managerid = basemanagerid
            manager = getUtility(IPortletManager, name=managerid, context=portal)
        key = '/'.join(parent.getPhysicalPath()) if not content_type_portlet else content_type_key
        portlethash = hashPortletInfo(dict(manager=managerid, category=category, key=key, name=name,))
        listhashes = manager.listAllManagedPortlets
        retriever = getMultiAdapter((self.context, manager), ISolgemaPortletManagerRetriever)
        managedPortletsHashes = [a['hash'] for a in retriever.getManagedPortlets()]
        if portlethash in listhashes:
            listhashes.remove(portlethash)
            listhashes.insert(position + 1, portlethash)
            manager.listAllManagedPortlets = listhashes
        else:
            manager.listAllManagedPortlets = listhashes.insert(position, portlethash)
        if position is None:
            self.request.response.redirect(self._nextUrl())
        return 'OK'
def portlets_for_assignments(self, assignments, manager, base_url):
    category = self.__parent__.category
    key = self.__parent__.key

    data = []
    for idx in range(len(assignments)):
        name = assignments[idx].__name__
        if hasattr(assignments[idx], '__Broken_state__'):
            name = assignments[idx].__Broken_state__['__name__']

        editview = queryMultiAdapter(
            (assignments[idx], self.request), name='edit', default=None)

        if editview is None:
            editviewName = ''
        else:
            editviewName = '%s/%s/edit' % (base_url, name)

        settingsviewName = '%s/%s/edit-portlet-metadata' % (base_url, name)

        portlet_hash = hashPortletInfo(
            dict(manager=manager.__name__, category=category,
                 key=key, name=name,))

        try:
            settings = IPortletAssignmentSettings(assignments[idx])
            visible = settings.get('visible', True)
        except TypeError:
            visible = False

        data.append({
            'title': assignments[idx].title,
            'editview': editviewName,
            'hash': portlet_hash,
            'name': name,
            'up_url': '%s/@@move-portlet-up' % (base_url),
            'down_url': '%s/@@move-portlet-down' % (base_url),
            'delete_url': '%s/@@delete-portlet' % (base_url),
            'metadata_url': settingsviewName,
            'hide_url': '%s/@@toggle-visibility' % (base_url),
            'show_url': '%s/@@toggle-visibility' % (base_url),
            'visible': visible,
        })
    if len(data) > 0:
        data[0]['up_url'] = data[-1]['down_url'] = None

    return data
    def _get_portlet_and_hash(self):
        context = self.layer['portal']
        column_manager = getUtility(IPortletManager, name='plone.dashboard1')
        membership_tool = getToolByName(context, 'portal_membership')
        userid = membership_tool.getAuthenticatedMember().getId()
        user_category = column_manager.get(USER_CATEGORY, None)
        assert user_category
        column = user_category.get(userid, None)
        assert column

        for portlet in column.values():
            if IWatcherPortlet.providedBy(portlet):
                info = {'manager': 'plone.dashboard1',
                        'category': USER_CATEGORY,
                        'key': userid,
                        'name': portlet.getId()}
                return portlet, hashPortletInfo(info)
Exemplo n.º 15
0
    def portlets_for_assignments(self, assignments, manager, base_url):
        category = self.__parent__.category
        key = self.__parent__.key
        
        portal = self.context.portal_url.getPortalObject()
        view = portal.restrictedTraverse('@@plone')
        
        data = []
        for idx in range(len(assignments)):
            name = assignments[idx].__name__
            
            editview = queryMultiAdapter(
                (assignments[idx], self.request), name='edit', default=None)
            
            if editview is None:
                editviewName = ''
            else:
                editviewName = '%s/%s/edit' % (base_url, name)
            
            portlet_hash = hashPortletInfo(
                dict(manager=manager.__name__, category=category,
                     key=key, name=name,))
            
            settings = IPortletAssignmentSettings(assignments[idx])
            renderer = getMultiAdapter(
                        (self.context, self.request, view,
                            manager, assignments[idx]),
                                IPortletRenderer)

            data.append({
                'title'      : assignments[idx].title,
                'editview'   : editviewName,
                'hash'       : portlet_hash,
                'renderer'   : renderer.__of__(self.context),
                'up_url'     : '%s/@@move-portlet-up?name=%s' % (base_url, name),
                'down_url'   : '%s/@@move-portlet-down?name=%s' % (base_url, name),
                'delete_url' : '%s/@@delete-portlet?name=%s' % (base_url, name),
                'hide_url'   : '%s/@@toggle-visibility?name=%s' % (base_url, name),
                'show_url'   : '%s/@@toggle-visibility?name=%s' % (base_url, name),
                'visible'    : settings.get('visible', True),
                })
        if len(data) > 0:
            data[0]['up_url'] = data[-1]['down_url'] = None
            
        return data
Exemplo n.º 16
0
 def testTraversalRendererWithHash(self):
     context = self.folder
     request = self.folder.REQUEST
     manager = getUtility(
         IPortletManager, name='plone.leftcolumn', context=self.folder)
     assignment = news.Assignment(state=('private', ))
     mapping = getMultiAdapter(
         (context, manager), IPortletAssignmentMapping)
     mapping['newsportlet'] = assignment
     portlet_hash = hashPortletInfo(
         dict(manager=manager.__name__, category=CONTEXT_CATEGORY,
              key='/'.join(context.getPhysicalPath()),
              name='newsportlet'))
     render_portlet_view = PortletUtilities(context, request)
     rendered_portlet = render_portlet_view.render_portlet(
         safe_unicode(portlet_hash))
     self.assertIn(u'portletNews', rendered_portlet)
     self.assertIn(u'Test News', rendered_portlet)
Exemplo n.º 17
0
    def spm_delete_portlet(self, name):
        assignments = aq_inner(self.context)
        IPortletPermissionChecker(assignments)()
        managerid = assignments.id.split('++')[-1]

        parent = aq_parent(aq_inner(self.context))
        key = '/'.join(parent.getPhysicalPath())
        portlethash = hashPortletInfo(dict(manager=managerid, category=CONTEXT_CATEGORY, key=key, name=name,))
        
        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u'plone_portal_state')
        portal = portal_state.portal()
        manager = getUtility(IPortletManager, name=managerid, context=portal)
        listhashes = manager.listAllManagedPortlets
        del assignments[name]
        listhashes.remove(portlethash)
        manager.listAllManagedPortlets = listhashes
        if not self.request.get('ajax'):
            self.request.response.redirect(self._nextUrl())
        return 'OK'
Exemplo n.º 18
0
    def portlets_for_assignments(self, assignments, manager, base_url):
        category = self.__parent__.category
        key = self.__parent__.key

        data = []
        for idx in range(len(assignments)):
            name = assignments[idx].__name__
            if hasattr(assignments[idx], "__Broken_state__"):
                name = assignments[idx].__Broken_state__["__name__"]

            editview = queryMultiAdapter((assignments[idx], self.request), name="edit", default=None)

            if editview is None:
                editviewName = ""
            else:
                editviewName = "%s/%s/edit" % (base_url, name)

            portlet_hash = hashPortletInfo(dict(manager=manager.__name__, category=category, key=key, name=name))

            try:
                settings = IPortletAssignmentSettings(assignments[idx])
                visible = settings.get("visible", True)
            except TypeError:
                visible = False

            data.append(
                {
                    "title": assignments[idx].title,
                    "editview": editviewName,
                    "hash": portlet_hash,
                    "name": name,
                    "up_url": "%s/@@move-portlet-up" % (base_url),
                    "down_url": "%s/@@move-portlet-down" % (base_url),
                    "delete_url": "%s/@@delete-portlet" % (base_url),
                    "hide_url": "%s/@@toggle-visibility" % (base_url),
                    "show_url": "%s/@@toggle-visibility" % (base_url),
                    "visible": visible,
                }
            )
        if len(data) > 0:
            data[0]["up_url"] = data[-1]["down_url"] = None

        return data
    def _get_portlet_and_hash(self):
        context = self.layer['portal']
        column_manager = getUtility(IPortletManager, name='plone.dashboard1')
        membership_tool = getToolByName(context, 'portal_membership')
        userid = membership_tool.getAuthenticatedMember().getId()
        user_category = column_manager.get(USER_CATEGORY, None)
        assert user_category
        column = user_category.get(userid, None)
        assert column

        for portlet in column.values():
            if IWatcherPortlet.providedBy(portlet):
                info = {
                    'manager': 'plone.dashboard1',
                    'category': USER_CATEGORY,
                    'key': userid,
                    'name': portlet.getId()
                }
                return portlet, hashPortletInfo(info)
 def move_portlet_to_column(self, portlet_info, new_column):
     prev_column, portlet = self.get_column_and_portlet(portlet_info)
     prev_column = aq_base(prev_column)
     new_column = aq_base(new_column)
     portlet = aq_base(portlet)
     # check ids
     oldid = portlet.id
     newid = portlet.id
     if oldid in new_column.keys():
         index = 1
         _sum = new_column.keys() + prev_column.keys()
         while '%s%i' % (newid, index) in _sum:
             index += 1
         newid = '%s%i' % (newid, index)
     # remove from current column
     del prev_column[oldid]
     # add to new column
     new_column[newid] = portlet
     portlet_info['name'] = newid
     portlet_info['manager'] = new_column.__manager__
     return hashPortletInfo(portlet_info)
Exemplo n.º 21
0
    def spm_move_portlet_down(self, name):
        assignments = aq_inner(self.context)
        IPortletPermissionChecker(assignments)()
        managerid = assignments.id.split('++')[-1]

        parent = aq_parent(aq_inner(self.context))
        key = '/'.join(parent.getPhysicalPath())
        portlethash = hashPortletInfo(
            dict(
                manager=managerid,
                category=CONTEXT_CATEGORY,
                key=key,
                name=name,
            ))

        portal_state = getMultiAdapter((self.context, self.context.REQUEST),
                                       name=u'plone_portal_state')
        portal = portal_state.portal()
        manager = getUtility(IPortletManager, name=managerid, context=portal)
        listhashes = manager.listAllManagedPortlets
        retriever = getMultiAdapter((self.context, manager),
                                    ISolgemaPortletManagerRetriever)
        managedPortletsHashes = [
            a['hash'] for a in retriever.getManagedPortlets()
        ]

        if portlethash in listhashes:
            hashAfter = managedPortletsHashes[
                managedPortletsHashes.index(portlethash) + 1]
            listhashes.remove(portlethash)
            listhashes.insert(listhashes.index(hashAfter) + 1, portlethash)
            manager.listAllManagedPortlets = listhashes
        else:
            manager.listAllManagedPortlets = listhashes.append(portlethash)

        self.request.response.redirect(self._nextUrl())
        return 'OK'
    def portlets(self):
        mapping = getMultiAdapter((self.context, self.manager), IPortletAssignmentMapping)
        # only include hidden portlets
        visible_portlets = {}
        [
            visible_portlets.__setitem__(x, y)
            for x, y in mapping.items()
            if IPortletAssignmentSettings(y).get("visible", True)
        ]

        for portlet in self.data.portlets:
            if portlet not in visible_portlets:
                renderer = getMultiAdapter(
                    (self.context, self.request, self.view, self.manager, mapping[portlet]), IPortletRenderer
                )
                hash = hashPortletInfo(
                    dict(
                        manager=self.manager.__name__,
                        category=mapping.__category__,
                        key="/".join(self.context.getPhysicalPath()),
                        name=mapping[portlet].__name__,
                    )
                )
                yield dict(id=mapping[portlet].title, renderer=renderer, hash=hash)
Exemplo n.º 23
0
    def getManagedPortlets(self):
        """Work out which portlets to display, returning a list of dicts
        describing assignments to render.
        Bypass blacklist tests
        """
        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u"plone_portal_state")
        portal = portal_state.portal()
        pcontext = IPortletContext(self.context, None)
        if pcontext is None:
            return []

        categories = []

        blacklisted = {}

        manager = self.storage.__name__

        current = self.context
        currentpc = pcontext
        blacklistFetched = set()
        parentsBlocked = False

        while current is not None and currentpc is not None:
            assignable = ILocalPortletAssignable(current, None)
            if assignable is not None:
                annotations = IAnnotations(assignable)
                local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None)
                if local is not None:
                    localManager = local.get(manager, None)
                    if localManager is not None:
                        categories.extend([(CONTEXT_CATEGORY, currentpc.uid, a) for a in localManager.values()])

            # Check the parent - if there is no parent, we will stop
            current = currentpc.getParent()
            if current is not None:
                currentpc = IPortletContext(current, None)

        # Get all global mappings for non-blacklisted categories

        for category, key in pcontext.globalPortletCategories(False):
            mapping = self.storage.get(category, None)
            if mapping is not None:
                for a in mapping.get(key, {}).values():
                    categories.append((category, key, a))

        managerUtility = getUtility(IPortletManager, manager, portal)

        if not getattr(managerUtility, "listAllManagedPortlets", []):
            managerUtility.listAllManagedPortlets = []

        hashlist = getattr(managerUtility, "listAllManagedPortlets", [])
        assignments = []
        for category, key, assignment in categories:
            portletHash = hashPortletInfo(dict(manager=manager, category=category, key=key, name=assignment.__name__))
            if portletHash not in hashlist:
                hashlist.append(portletHash)
            try:
                assignments.append(
                    {
                        "category": category,
                        "key": key,
                        "name": assignment.__name__,
                        "assignment": assignment,
                        "hash": portletHash,
                        "stopUrls": ISolgemaPortletAssignment(assignment).stopUrls,
                        "manager": manager,
                    }
                )
            except TypeError:
                LOG.info(
                    u'Error while retrieving portlet assignment settings.\n\
                           Context: "%s", Category: "%s", Key: "%s", Assignment\n\
                           Class: "%s", Assignment ID: "%s"'
                    % (
                        "/".join(self.context.getPhysicalPath()),
                        category,
                        key,
                        str(assignment.__class__),
                        assignment.__name__,
                    ),
                    context=self.context,
                )

        managerUtility.listAllManagedPortlets = hashlist

        # order the portlets
        assignments.sort(lambda a, b: cmp(hashlist.index(a["hash"]), hashlist.index(b["hash"])))

        li = []
        here_url = "/".join(aq_inner(self.context).getPhysicalPath())
        for assigndict in assignments:
            stopped = False
            if (
                assigndict.has_key("stopUrls")
                and hasattr(assigndict["stopUrls"], "sort")
                and len(assigndict["stopUrls"]) > 0
            ):
                for stopUrl in assigndict["stopUrls"]:
                    if stopUrl in here_url:
                        stopped = True
            assigndict["stopped"] = stopped
            assigndict["here_url"] = here_url

        return assignments
    def getManagedPortlets(self):
        """Work out which portlets to display, returning a list of dicts
        describing assignments to render.
        Bypass blacklist tests
        """
        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u'plone_portal_state')
        portal = portal_state.portal()
        pcontext = IPortletContext(self.context, None)
        if pcontext is None:
            return []

        categories = [] 

        blacklisted = {}

        manager = self.storage.__name__

        current = self.context
        currentpc = pcontext
        blacklistFetched = set()
        parentsBlocked = False

        while current is not None and currentpc is not None:
            assignable = ILocalPortletAssignable(current, None)
            if assignable is not None:
                annotations = IAnnotations(assignable)
                local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None)
                if local is not None:
                    localManager = local.get(manager, None)
                    if localManager is not None:
                        categories.extend([(CONTEXT_CATEGORY, currentpc.uid, a) for a in localManager.values()])
                    
            # Check the parent - if there is no parent, we will stop
            current = currentpc.getParent()
            if current is not None:
                currentpc = IPortletContext(current, None)
        
        # Get all global mappings for non-blacklisted categories
        
        for category, key in pcontext.globalPortletCategories(False):
            mapping = self.storage.get(category, None)
            if mapping is not None:
                for a in mapping.get(key, {}).values():
                    categories.append((category, key, a,))

        managerUtility = getUtility(IPortletManager, manager, portal)
        
        if not getattr(managerUtility, 'listAllManagedPortlets', []):
            managerUtility.listAllManagedPortlets = []

        hashlist = getattr(managerUtility, 'listAllManagedPortlets', [])
        assignments = []
        for category, key, assignment in categories:
            portletHash = hashPortletInfo(dict(manager=manager, category=category, key=key, name =assignment.__name__,))
            if portletHash not in hashlist:
                hashlist.append(portletHash)
            assignments.append({'category'    : category,
                                'key'         : key,
                                'name'        : assignment.__name__,
                                'assignment'  : assignment,
                                'hash'        : portletHash,
                                'stopUrls'    : ISolgemaPortletAssignment(assignment).stopUrls,
                                'manager'     : manager,
                                })

        managerUtility.listAllManagedPortlets = hashlist

        #order the portlets
        assignments.sort(lambda a,b:cmp(hashlist.index(a['hash']), hashlist.index(b['hash'])))

        li = []
        here_url = '/'.join(aq_inner(self.context).getPhysicalPath())
        for assigndict in assignments:
            stopped = False
            if assigndict.has_key('stopUrls') and hasattr(assigndict['stopUrls'], 'sort') and len(assigndict['stopUrls'])>0:
                for stopUrl in assigndict['stopUrls']:
                    if stopUrl in here_url:
                        stopped = True
            assigndict['stopped'] = stopped
            assigndict['here_url'] = here_url

        return assignments
Exemplo n.º 25
0
    def __call__(self):
        result = {}

        manager_id = self.manager.__name__

        content_url = self.context.absolute_url()
        url = '{0}/{1}/{2}'.format(content_url, SERVICE_ID, manager_id)

        result = {
            '@id': url,
            'manager': manager_id,
            'portlets': [],
        }

        retriever = getMultiAdapter((self.context, self.manager),
                                    IPortletRetriever)
        # The retriever only returns portlets that are visible.
        # Still need to check available.

        # Based on
        # plone.portlets.manager.PortletManagerRenderer._lazyLoadPortlets

        for portlet in self.filter(retriever.getPortlets()):
            assignment = portlet['assignment']

            info = portlet.copy()
            info['manager'] = manager_id
            hashPortletInfo(info)

            assignment.__portlet_metadata__ = {
                'key': portlet['key'],
                'category': portlet['category'],
                'name': portlet['name'],
                'manager': manager_id,
                'hash': info['hash'],
            }

            # To be able to customize serializers per portlet type, we try to
            # lookup for a named adapter first. The name is the portlet type

            # TODO: the serializer should ideally have the same discriminators
            # as the portlet renderer: context, request, view=service, manager,
            # data.
            type_, schema = get_portlet_info(assignment)
            serializer = queryMultiAdapter(
                (assignment, self.context, self.request),
                ISerializeToJson,
                name=type_)

            if not serializer:
                serializer = queryMultiAdapter(
                    (assignment, self.context, self.request), ISerializeToJson)

            if not serializer:
                logger.warn(
                    'No serializer for portlet (%r %r %r)' %
                    (portlet['category'], portlet['key'], portlet['name']))

                continue

            portlet_json = serializer()

            if portlet_json:
                result['portlets'].append(portlet_json)
        return result
    def getPortlets(self):

        portal_state = getMultiAdapter((self.context, self.context.REQUEST),
                                       name=u'plone_portal_state')
        portal = portal_state.portal()
        pcontext = IPortletContext(self.context, None)
        if pcontext is None:
            return []

        categories = []

        blacklisted = {}

        manager = self.storage.__name__

        for category, key in pcontext.globalPortletCategories(False):
            blacklisted[category] = None

        current = self.context
        currentpc = pcontext
        blacklistFetched = set()
        parentsBlocked = False

        while current is not None and currentpc is not None:
            if ILocalPortletAssignable.providedBy(current):
                assignable = current
            else:
                assignable = queryAdapter(current, ILocalPortletAssignable)

            if assignable is not None:
                if IAnnotations.providedBy(assignable):
                    annotations = assignable
                else:
                    annotations = queryAdapter(assignable, IAnnotations)

                if not parentsBlocked:
                    local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None)
                    if local is not None:
                        localManager = local.get(manager, None)
                        if localManager is not None:
                            categories.extend([(CONTEXT_CATEGORY,
                                                currentpc.uid, a)
                                               for a in localManager.values()])

                blacklistStatus = annotations.get(CONTEXT_BLACKLIST_STATUS_KEY,
                                                  {}).get(manager, None)
                if blacklistStatus is not None:
                    for cat, status in blacklistStatus.items():
                        if cat == CONTEXT_CATEGORY:
                            if not parentsBlocked and status == True:
                                parentsBlocked = True
                        else:  # global portlet categories
                            if blacklisted.get(cat, False) is None:
                                blacklisted[cat] = status
                            if status is not None:
                                blacklistFetched.add(cat)

            if parentsBlocked and len(blacklistFetched) == len(blacklisted):
                break
            current = currentpc.getParent()
            if current is not None:
                if IPortletContext.providedBy(current):
                    currentpc = current
                else:
                    currentpc = queryAdapter(current, IPortletContext)

        for category, key in pcontext.globalPortletCategories(False):
            if not blacklisted[category]:
                mapping = self.storage.get(category, None)
                if mapping is not None:
                    for a in mapping.get(key, {}).values():
                        categories.append((
                            category,
                            key,
                            a,
                        ))

        managerUtility = getUtility(IPortletManager, manager, portal)

        here_url = '/'.join(aq_inner(self.context).getPhysicalPath())

        assignments = []
        for category, key, assignment in categories:
            assigned = ISolgemaPortletAssignment(assignment)
            portletHash = hashPortletInfo(
                dict(
                    manager=manager,
                    category=category,
                    key=key,
                    name=assignment.__name__,
                ))
            if not getattr(assigned, 'stopUrls', False) or len([
                    stopUrl for stopUrl in getattr(assigned, 'stopUrls', [])
                    if stopUrl in here_url
            ]) == 0:
                assignments.append({
                    'category':
                    category,
                    'key':
                    key,
                    'name':
                    assignment.__name__,
                    'assignment':
                    assignment,
                    'hash':
                    hashPortletInfo(
                        dict(
                            manager=manager,
                            category=category,
                            key=key,
                            name=assignment.__name__,
                        )),
                    'stopUrls':
                    ISolgemaPortletAssignment(assignment).stopUrls,
                })

        if hasattr(managerUtility, 'listAllManagedPortlets'):
            hashlist = managerUtility.listAllManagedPortlets
            assignments.sort(lambda a, b: cmp(
                hashlist.count(a['hash']) > 0 and hashlist.index(a['hash']
                                                                 ) or 0,
                hashlist.count(b['hash']) > 0 and hashlist.index(b['hash']) or
                0))

        return assignments
Exemplo n.º 27
0
    def __init__(self, context, request):
        super(DisplayPanelView, self).__init__(context, request)

        # todo: move away from init

        # The parent object is the Plone content object here; we get
        # it from the acquisition chain.

        # The panel can be rendered in different contexts, where the length of
        # the chain to the Plone content object is not obvious;
        # on portlet edit forms for instance, where we have a panel of
        # portlets below the edit form.
        # So to get the content object we go up in the aq chain, until we are
        # out of the chain of portlet assignments, panels etc.
        parent = self.context.aq_inner
        while True:
            parent = parent.aq_parent
            if not (IPanel.providedBy(parent)
                    or IPortletAssignment.providedBy(parent)
                    or IPortletAssignmentMapping.providedBy(parent)):
                break

        panel = self.context

        portlets = []
        for assignment in panel:
            settings = IPortletAssignmentSettings(assignment)
            if not settings.get('visible', True):
                continue

            try:
                portlet = getMultiAdapter((parent, self.request, self, panel,
                                           assignment.__of__(panel)),
                                          IPortletRenderer)
            except ComponentLookupError:
                logging.getLogger("panels").info(
                    "unable to look up renderer for '%s.%s'." %
                    (assignment.__class__.__module__,
                     assignment.__class__.__name__))
                continue

            info = {
                'manager': "panels",
                'category': CONTEXT_CATEGORY,
                'key': str('/'.join(parent.getPhysicalPath())),
                'name': assignment.__name__,
                'renderer': portlet,
                'settings': settings,
                'assignment': assignment
            }

            # todo: check new impl. of portlet rendering
            hashPortletInfo(info)

            portlet.__portlet_metadata__ = info.copy()
            del portlet.__portlet_metadata__['renderer']

            portlet.update()

            try:
                available = portlet.available
            except ConflictError:
                raise
            except Exception as err:
                logging.getLogger('panels').info(
                    "available threw an exception for %s (%s %s)" %
                    (assignment.__name__, type(err), str(err)))
                continue

            info['available'] = available
            portlets.append(info)

        self.portlets = portlets
Exemplo n.º 28
0
    def __call__(self):
        # The parent object is the Plone content object here; we get
        # it from the acquisition chain.

        # The panel can be rendered in different contexts, where the length of
        # the chain to the Plone content object is not obvious;
        # on portlet edit forms for instance, where we have a panel of
        # portlets below the edit form.
        # So to get the content object we go up in the aq chain, until we are
        # out of the chain of portlet assignments, panels etc.
        parent = self.context.aq_inner
        while True:
            parent = parent.aq_parent
            if not (IPanel.providedBy(parent)
                or IPortletAssignment.providedBy(parent)
                or IPortletAssignmentMapping.providedBy(parent)):
                break

        panel = self.context

        portlets = []
        for assignment in panel:
            settings = IPortletAssignmentSettings(assignment)
            if not settings.get('visible', True):
                continue

            try:
                portlet = getMultiAdapter(
                    (parent,
                     self.request,
                     self,
                     panel,
                     assignment), IPortletRenderer)
            except ComponentLookupError:
                logging.getLogger("panels").info(
                    "unable to look up renderer for '%s.%s'." % (
                        assignment.__class__.__module__,
                        assignment.__class__.__name__
                    )
                )
                continue

            info = {
                'manager': "panels",
                'category': CONTEXT_CATEGORY,
                'key': str('/'.join(parent.getPhysicalPath())),
                'name': assignment.__name__,
                'renderer': portlet,
                'settings': settings,
                'assignment': assignment
            }

            hashPortletInfo(info)

            portlet.__portlet_metadata__ = info.copy()
            del portlet.__portlet_metadata__['renderer']

            portlet.update()

            try:
                available = portlet.available
            except ConflictError:
                raise
            except Exception as e:
                logging.getLogger('panels').info(
                    "available threw an exception for %s (%s %s)" % (
                        assignment.__name__,
                        type(e),
                        str(e)
                    )
                )
                continue

            if available:
                result = self.portlet(**info)
                portlets.append(result)

        return render(
            portlets, self.context.layout, self.request
        )
Exemplo n.º 29
0
    def getManagedPortlets(self):
        """Work out which portlets to display, returning a list of dicts
        describing assignments to render.
        Bypass blacklist tests
        """
        portal_state = getMultiAdapter((self.context, self.context.REQUEST),
                                       name=u'plone_portal_state')
        portal = portal_state.portal()
        pcontext = IPortletContext(self.context, None)
        if pcontext is None:
            return []

        categories = []

        blacklisted = {}

        manager = self.storage.__name__

        current = self.context
        currentpc = pcontext
        blacklistFetched = set()
        parentsBlocked = False

        while current is not None and currentpc is not None:
            assignable = ILocalPortletAssignable(current, None)
            if assignable is not None:
                annotations = IAnnotations(assignable)
                local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None)
                if local is not None:
                    localManager = local.get(manager, None)
                    if localManager is not None:
                        categories.extend([(CONTEXT_CATEGORY, currentpc.uid, a)
                                           for a in localManager.values()])

            # Check the parent - if there is no parent, we will stop
            current = currentpc.getParent()
            if current is not None:
                currentpc = IPortletContext(current, None)

        # Get all global mappings for non-blacklisted categories

        for category, key in pcontext.globalPortletCategories(False):
            mapping = self.storage.get(category, None)
            if mapping is not None:
                for a in mapping.get(key, {}).values():
                    categories.append((
                        category,
                        key,
                        a,
                    ))

        managerUtility = getUtility(IPortletManager, manager, portal)

        if not getattr(managerUtility, 'listAllManagedPortlets', []):
            managerUtility.listAllManagedPortlets = []

        hashlist = getattr(managerUtility, 'listAllManagedPortlets', [])
        assignments = []
        for category, key, assignment in categories:
            portletHash = hashPortletInfo(
                dict(
                    manager=manager,
                    category=category,
                    key=key,
                    name=assignment.__name__,
                ))
            if portletHash not in hashlist:
                hashlist.append(portletHash)
            assignments.append({
                'category':
                category,
                'key':
                key,
                'name':
                assignment.__name__,
                'assignment':
                assignment,
                'hash':
                portletHash,
                'stopUrls':
                ISolgemaPortletAssignment(assignment).stopUrls,
                'manager':
                manager,
            })

        managerUtility.listAllManagedPortlets = hashlist

        #order the portlets
        assignments.sort(lambda a, b: cmp(hashlist.index(a['hash']),
                                          hashlist.index(b['hash'])))

        li = []
        here_url = '/'.join(aq_inner(self.context).getPhysicalPath())
        for assigndict in assignments:
            stopped = False
            if assigndict.has_key('stopUrls') and hasattr(
                    assigndict['stopUrls'],
                    'sort') and len(assigndict['stopUrls']) > 0:
                for stopUrl in assigndict['stopUrls']:
                    if stopUrl in here_url:
                        stopped = True
            assigndict['stopped'] = stopped
            assigndict['here_url'] = here_url

        return assignments
Exemplo n.º 30
0
    def getPortlets(self):

        portal_state = getMultiAdapter((self.context, self.context.REQUEST), name=u'plone_portal_state')
        portal = portal_state.portal()
        pcontext = IPortletContext(self.context, None)
        if pcontext is None:
            return []

        categories = [] 

        blacklisted = {}

        manager = self.storage.__name__

        for category, key in pcontext.globalPortletCategories(False):
            blacklisted[category] = None

        current = self.context
        currentpc = pcontext
        blacklistFetched = set()
        parentsBlocked = False
        
        while current is not None and currentpc is not None:
            if ILocalPortletAssignable.providedBy(current):
                assignable = current
            else:
                assignable = queryAdapter(current, ILocalPortletAssignable)

            if assignable is not None:
                if IAnnotations.providedBy(assignable):
                    annotations = assignable
                else:
                    annotations = queryAdapter(assignable, IAnnotations)
                
                if not parentsBlocked:
                    local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None)
                    if local is not None:
                        localManager = local.get(manager, None)
                        if localManager is not None:
                            categories.extend([(CONTEXT_CATEGORY, currentpc.uid, a) for a in localManager.values()])

                blacklistStatus = annotations.get(CONTEXT_BLACKLIST_STATUS_KEY, {}).get(manager, None)
                if blacklistStatus is not None:
                    for cat, status in blacklistStatus.items():
                        if cat == CONTEXT_CATEGORY:
                            if not parentsBlocked and status == True:
                                parentsBlocked = True
                        else: # global portlet categories
                            if blacklisted.get(cat, False) is None:
                                blacklisted[cat] = status
                            if status is not None:
                                blacklistFetched.add(cat)

            if parentsBlocked and len(blacklistFetched) == len(blacklisted):
                break
            current = currentpc.getParent()
            if current is not None:
                if IPortletContext.providedBy(current):
                    currentpc = current
                else:
                    currentpc = queryAdapter(current, IPortletContext)

        for category, key in pcontext.globalPortletCategories(False):
            if not blacklisted[category]:
                mapping = self.storage.get(category, None)
                if mapping is not None:
                    for a in mapping.get(key, {}).values():
                        categories.append((category, key, a,))

        managerUtility = getUtility(IPortletManager, manager, portal)

        here_url = '/'.join(aq_inner(self.context).getPhysicalPath())

        assignments = []
        for category, key, assignment in categories:
            assigned = ISolgemaPortletAssignment(assignment)
            portletHash = hashPortletInfo(dict(manager=manager, category=category, key=key, name =assignment.__name__,))
            if not getattr(assigned, 'stopUrls', False) or len([stopUrl for stopUrl in getattr(assigned, 'stopUrls', []) if stopUrl in here_url])==0:
                assignments.append({'category'    : category,
                                    'key'         : key,
                                    'name'        : assignment.__name__,
                                    'assignment'  : assignment,
                                    'hash'        : hashPortletInfo(dict(manager=manager, category=category, key=key, name =assignment.__name__,)),
                                    'stopUrls'    : ISolgemaPortletAssignment(assignment).stopUrls,
                                    })
        
        if hasattr(managerUtility, 'listAllManagedPortlets'):
            hashlist = managerUtility.listAllManagedPortlets
            assignments.sort(lambda a,b:cmp(hashlist.count(a['hash'])>0 and hashlist.index(a['hash']) or 0, hashlist.count(b['hash'])>0 and hashlist.index(b['hash']) or 0))

        return assignments
Exemplo n.º 31
0
    def spm_move_portlet_delta(self, name='', position=None, manager=''):
        position = self.request.get('position', position)
        managerid = self.request.get('manager', manager)
        name = self.request.get('name', name)
        assignments = aq_inner(self.context)
        parent = aq_parent(aq_inner(self.context))

        portal_state = getMultiAdapter((self.context, self.request),
                                       name=u'plone_portal_state')
        portal = portal_state.portal()
        basemanagerid = assignments.id.split('++')[-1]
        manager = None
        if managerid:
            managerid = managerid.replace('portletmanager-',
                                          '').replace('-', '.')
            if managerid != basemanagerid:
                try:
                    manager = getUtility(IPortletManager,
                                         name=managerid,
                                         context=portal)
                except:
                    pass
                if manager:
                    newColumn = getUtility(IPortletManager,
                                           name=managerid,
                                           context=parent)
                    new = getMultiAdapter((
                        parent,
                        newColumn,
                    ),
                                          IPortletAssignmentMapping,
                                          context=parent)
                    new[name] = assignments[name]
                    del assignments[name]
        if not manager:
            managerid = basemanagerid
            manager = getUtility(IPortletManager,
                                 name=managerid,
                                 context=portal)
        key = '/'.join(parent.getPhysicalPath())
        portlethash = hashPortletInfo(
            dict(
                manager=managerid,
                category=CONTEXT_CATEGORY,
                key=key,
                name=name,
            ))
        listhashes = manager.listAllManagedPortlets
        retriever = getMultiAdapter((self.context, manager),
                                    ISolgemaPortletManagerRetriever)
        managedPortletsHashes = [
            a['hash'] for a in retriever.getManagedPortlets()
        ]
        if portlethash in listhashes:
            listhashes.remove(portlethash)
            listhashes.insert(position, portlethash)
            manager.listAllManagedPortlets = listhashes
        else:
            manager.listAllManagedPortlets = listhashes.insert(
                position, portlethash)
        if position == None:
            self.request.response.redirect(self._nextUrl())
        return 'OK'