def localPortletAssignmentMappingAdapter(context, manager): """When adapting (context, manager), get an IPortletAssignmentMapping by finding one in the object's annotations. The container will be created if necessary. """ if IAnnotations.providedBy(context): annotations = context else: annotations = queryAdapter(context, IAnnotations) local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None) if local is None: local = annotations[CONTEXT_ASSIGNMENT_KEY] = OOBTree() portlets = local.get(manager.__name__, None) if portlets is None or not IMultiSearchPortletAssignmentMapping.providedBy( portlets): if portlets is not None: old_items = portlets.items() else: old_items = [] portlets = local[manager.__name__] = MultiSearchPortletAssignmentMapping( manager=manager.__name__, category=CONTEXT_CATEGORY) # Inline migration. Might be good in an upgrade step. for key, value in old_items: portlets[key] = value return portlets
def __init__(self, tile): self.tile = tile self.tileType = queryUtility(ITileType, name=tile.__name__) self.context = getMultiAdapter((tile.context, tile.request, tile), ITileDataContext) self.storage = getMultiAdapter((self.context, tile.request, tile), ITileDataStorage) if IAnnotations.providedBy(self.storage): self.key = '.'.join([ANNOTATIONS_KEY_PREFIX, str(tile.id)]) else: self.key = str(tile.id)
def __init__(self, tile): self.tile = tile self.tileType = queryUtility(ITileType, name=tile.__name__) self.context = getMultiAdapter( (tile.context, tile.request, tile), ITileDataContext) self.storage = getMultiAdapter( (self.context, tile.request, tile), ITileDataStorage) if IAnnotations.providedBy(self.storage): self.key = '.'.join([ANNOTATIONS_KEY_PREFIX, str(tile.id)]) else: self.key = str(tile.id)
def localPortletAssignmentMappingAdapter(context, manager): """When adapting (context, manager), get an IPortletAssignmentMapping by finding one in the object's annotations. The container will be created if necessary. """ if IAnnotations.providedBy(context): annotations = context else: annotations = queryAdapter(context, IAnnotations) local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None) if local is None: local = annotations[CONTEXT_ASSIGNMENT_KEY] = OOBTree() portlets = local.get(manager.__name__, None) if portlets is None: portlets = local[manager.__name__] = PortletAssignmentMapping(manager=manager.__name__, category=CONTEXT_CATEGORY) return portlets
def localPortletAssignmentMappingAdapter(context, manager): """When adapting (context, manager), get an IPortletAssignmentMapping by finding one in the object's annotations. The container will be created if necessary. """ if IAnnotations.providedBy(context): annotations = context else: annotations = queryAdapter(context, IAnnotations) local = annotations.get(CONTEXT_ASSIGNMENT_KEY, None) if local is None: local = annotations[CONTEXT_ASSIGNMENT_KEY] = OOBTree() portlets = local.get(manager.__name__, None) if portlets is None: portlets = local[manager.__name__] = PortletAssignmentMapping( manager=manager.__name__, category=CONTEXT_CATEGORY) return portlets
def _getBlacklist(self, create=False): if IAnnotations.providedBy(self.context): annotations = self.context else: annotations = queryAdapter(self.context, IAnnotations) local = annotations.get(CONTEXT_BLACKLIST_STATUS_KEY, None) if local is None: if create: local = annotations[CONTEXT_BLACKLIST_STATUS_KEY] = PersistentDict() else: return None blacklist = local.get(self.manager.__name__, None) if blacklist is None: if create: blacklist = local[self.manager.__name__] = PersistentDict() else: return None return blacklist
def _getBlacklist(self, create=False): if IAnnotations.providedBy(self.context): annotations = self.context else: annotations = queryAdapter(self.context, IAnnotations) local = annotations.get(CONTEXT_BLACKLIST_STATUS_KEY, None) if local is None: if create: local = annotations[ CONTEXT_BLACKLIST_STATUS_KEY] = PersistentDict() else: return None blacklist = local.get(self.manager.__name__, None) if blacklist is None: if create: blacklist = local[self.manager.__name__] = PersistentDict() else: return None return blacklist
def getPortlets(self): """Work out which portlets to display, returning a list of dicts describing assignments to render. """ if IPortletContext.providedBy(self.context): pcontext = self.context else: pcontext = queryAdapter(self.context, IPortletContext) if pcontext is None: return [] # Holds a list of (category, key, assignment). categories = [] # Keeps track of the blacklisting status for global categores # (user, group, content type). The status is either True (blocked) # or False (not blocked). blacklisted = {} # This is the name of the manager (column) we're rendering manager = self.storage.__name__ # 1. Fetch blacklisting status for each global category # First, find out which categories we will need to determine # blacklist status for for category, key in pcontext.globalPortletCategories(False): blacklisted[category] = None # Then walk the content hierarchy to find out what blacklist status # was assigned. Note that the blacklist is tri-state; if it's None it # means no assertion has been made (i.e. the category has neither been # whitelisted or blacklisted by this object or any parent). The first # item to give either a blacklisted (True) or whitelisted (False) # value for a given item will set the appropriate value. Parents of # this item that also set a black- or white-list value will then be # ignored. # Whilst walking the hierarchy, we also collect parent portlets, # until we hit the first block. 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()]) lpam = getMultiAdapter((assignable, self.storage), ILocalPortletAssignmentManager) if lpam.getBlacklistStatus(CONTEXT_CATEGORY): parentsBlocked = True for cat, cat_status in blacklisted.items(): local_status = lpam.getBlacklistStatus(cat) if local_status is not None: blacklistFetched.add(cat) if cat_status is None: blacklisted[cat] = local_status # We can abort if parents are blocked and we've fetched all # blacklist statuses if parentsBlocked and len(blacklistFetched) == len(blacklisted): break # Check the parent - if there is no parent, we will stop current = currentpc.getParent() if current is not None: if IPortletContext.providedBy(current): currentpc = current else: currentpc = queryAdapter(current, IPortletContext) # Get all global mappings for non-blacklisted categories 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, )) assignments = [] for category, key, assignment in categories: try: settings = IPortletAssignmentSettings(assignment) if not settings.get('visible', True): continue except TypeError: # Portlet does not exist any longer continue assignments.append({'category': category, 'key': key, 'name': str(assignment.__name__), 'assignment': assignment }) 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 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