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)
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)
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
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)
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'
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'
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)
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
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 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)
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
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)
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'
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)
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)
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
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
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
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 )
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
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
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'