def get_items(self): tree = self.get_tree() prev_item = next_item = None if not self.parent: if self.num is not None: if self.after: if self.reverse: tree = filter( self._tree_filter_reverse, tree) next_item = self.after._id if len(tree) > self.num: first = tree[-(self.num+1)] prev_item = first[1][-1] if first[1] else first[0] tree = tree[-self.num:] else: prev_item = self.after._id tree = filter( self._tree_filter, tree) if len(tree) > self.num: tree = tree[:self.num] last = tree[-1] next_item = last[1][-1] if last[1] else last[0] # generate the set of ids to look up and look them up message_ids = [] for root, thread in tree: message_ids.append(root) message_ids.extend(thread) if prev_item: message_ids.append(prev_item) messages = Message._byID(message_ids, data = True, return_dict = False) wrapped = {} for m in self.wrap_items(messages): if not self._viewable_message(m): g.log.warning("%r is not viewable by %s; path is %s" % (m, c.user.name, request.fullpath)) continue wrapped[m._id] = m if prev_item: prev_item = wrapped[prev_item] if next_item: next_item = wrapped[next_item] final = [] for parent, children in tree: if parent not in wrapped: continue parent = wrapped[parent] if children: # if no parent is specified, check if any of the messages are # uncollapsed, and truncate the thread children = [wrapped[child] for child in children if child in wrapped] parent.child = empty_listing() # if the parent is new, uncollapsed, or focal we don't # want it to become a moremessages wrapper. if (self.skip and not self.parent and not parent.new and parent.is_collapsed and not (self.focal and self.focal._id == parent._id)): for i, child in enumerate(children): if (child.new or not child.is_collapsed or (self.focal and self.focal._id == child._id)): break else: i = -1 parent = Wrapped(MoreMessages(parent, empty_listing())) children = children[i:] parent.child.parent_name = parent._fullname parent.child.things = [] for child in children: child.is_child = True if self.focal and child._id == self.focal._id: # focal message is never collapsed child.collapsed = False child.focal = True else: child.collapsed = child.is_collapsed parent.child.things.append(child) parent.is_parent = True # the parent might be the focal message on a permalink page if self.focal and parent._id == self.focal._id: parent.collapsed = False parent.focal = True else: parent.collapsed = parent.is_collapsed final.append(parent) return (final, prev_item, next_item, len(final), len(final))
def get_items(self): tree = self.get_tree() prev = next = None if not self.parent: if self.num is not None: if self.after: if self.reverse: tree = filter( lambda x: tree_sort_fn(x) >= self.after._id, tree) next = self.after._id if len(tree) > self.num: prev = tree[-(self.num+1)][0] tree = tree[-self.num:] else: prev = self.after._id tree = filter( lambda x: tree_sort_fn(x) < self.after._id, tree) if len(tree) > self.num: tree = tree[:self.num] next = tree[-1][0] # generate the set of ids to look up and look them up message_ids = [] for root, thread in tree: message_ids.append(root) message_ids.extend(thread) if prev: message_ids.append(prev) messages = Message._byID(message_ids, data = True, return_dict = False) wrapped = dict((m._id, m) for m in self.wrap_items(messages)) if prev: prev = wrapped[prev] if next: next = wrapped[next] final = [] for parent, children in tree: parent = wrapped[parent] if children: # if no parent is specified, check if any of the messages are # uncollapsed, and truncate the thread children = [wrapped[child] for child in children] parent.child = empty_listing() # if the parent is new, uncollapsed, or focal we don't # want it to become a moremessages wrapper. if (self.skip and not self.parent and not parent.new and parent.is_collapsed and not (self.focal and self.focal._id == parent._id)): for i, child in enumerate(children): if (child.new or not child.is_collapsed or (self.focal and self.focal._id == child._id)): break else: i = -1 parent = Wrapped(MoreMessages(parent, empty_listing())) children = children[i:] parent.child.parent_name = parent._fullname parent.child.things = [] for child in children: child.is_child = True if self.focal and child._id == self.focal._id: # focal message is never collapsed child.collapsed = False child.focal = True else: child.collapsed = child.is_collapsed parent.child.things.append(child) parent.is_parent = True # the parent might be the focal message on a permalink page if self.focal and parent._id == self.focal._id: parent.collapsed = False parent.focal = True else: parent.collapsed = parent.is_collapsed final.append(parent) return (final, prev, next, len(final), len(final))
def get_items(self): tree = self.get_tree() prev_item = next_item = None if not self.parent: if self.num is not None: if self.after: if self.reverse: tree = filter(self._tree_filter_reverse, tree) next_item = self.after._id if len(tree) > self.num: first = tree[-(self.num + 1)] prev_item = first[1][-1] if first[1] else first[0] tree = tree[-self.num:] else: prev_item = self.after._id tree = filter(self._tree_filter, tree) if len(tree) > self.num: tree = tree[:self.num] last = tree[-1] next_item = last[1][-1] if last[1] else last[0] # generate the set of ids to look up and look them up message_ids = [] for root, thread in tree: message_ids.append(root) message_ids.extend(thread) if prev_item: message_ids.append(prev_item) messages = Message._byID(message_ids, data=True, return_dict=False) wrapped = {m._id: m for m in self.wrap_items(messages)} if prev_item: prev_item = wrapped[prev_item] if next_item: next_item = wrapped[next_item] final = [] for parent, children in tree: if parent not in wrapped: continue parent = wrapped[parent] if not self._viewable_message(parent): continue if children: # if no parent is specified, check if any of the messages are # uncollapsed, and truncate the thread children = [ wrapped[child] for child in children if child in wrapped ] add_child_listing(parent) # if the parent is new, uncollapsed, or focal we don't # want it to become a moremessages wrapper. if (self.skip and not self.parent and not parent.new and parent.is_collapsed and not (self.focal and self.focal._id == parent._id)): for i, child in enumerate(children): if (child.new or not child.is_collapsed or (self.focal and self.focal._id == child._id)): break else: i = -1 parent = Wrapped(MoreMessages(parent, parent.child)) children = children[i:] parent.child.parent_name = parent._fullname parent.child.things = [] for child in children: child.is_child = True if self.focal and child._id == self.focal._id: # focal message is never collapsed child.collapsed = False child.focal = True else: child.collapsed = child.is_collapsed parent.child.things.append(child) parent.is_parent = True # the parent might be the focal message on a permalink page if self.focal and parent._id == self.focal._id: parent.collapsed = False parent.focal = True else: parent.collapsed = parent.is_collapsed final.append(parent) return (final, prev_item, next_item, len(final), len(final))
def get_items(self): tree = self.get_tree() tree, prev_item, next_item = self._apply_pagination(tree) message_ids = [] for parent_id, child_ids in tree: message_ids.append(parent_id) message_ids.extend(child_ids) if prev_item: message_ids.append(prev_item) messages = Message._byID(message_ids, data=True, return_dict=False) wrapped = {m._id: m for m in self.wrap_items(messages)} if prev_item: prev_item = wrapped[prev_item] if next_item: next_item = wrapped[next_item] final = [] for parent_id, child_ids in tree: if parent_id not in wrapped: continue parent = wrapped[parent_id] if not self._viewable_message(parent): continue children = [wrapped[child_id] for child_id in child_ids if child_id in wrapped] depth = {parent_id: 0} substitute_parents = {} if ( children and self.skip and not self.threaded and not self.parent and not parent.new and parent.is_collapsed ): for i, child in enumerate(children): if child.new or not child.is_collapsed: break else: i = -1 # in flat view replace collapsed chain with MoreMessages add_child_listing(parent) parent = Wrapped(MoreMessages(parent, parent.child)) children = children[i:] for child in sorted(children, key=lambda child: child._id): # iterate from the root outwards so we can check the depth if self.threaded: try: child_parent = wrapped[child.parent_id] except KeyError: # the stored comment tree was missing this message's # parent, treat it as a top level reply child_parent = parent else: # for flat view all messages are decendants of the # parent message child_parent = parent parent_depth = depth[child_parent._id] child_depth = parent_depth + 1 depth[child._id] = child_depth if child_depth == MAX_RECURSION: # current message is at maximum depth level, all its # children will be displayed as children of its parent substitute_parents[child._id] = child_parent._id if child_depth > MAX_RECURSION: child_parent_id = substitute_parents[child.parent_id] substitute_parents[child._id] = child_parent_id child_parent = wrapped[child_parent_id] if not hasattr(child_parent, "child"): add_child_listing(child_parent) child.is_child = True child_parent.child.things.append(child) for child in children: # look over the children again to decide whether they can be # collapsed child.threaded = self.threaded child.collapsed = self.should_collapse(child) if self.threaded and children: most_recent_child_id = max(child._id for child in children) most_recent_child = wrapped[most_recent_child_id] most_recent_child.most_recent = True parent.is_parent = True parent.threaded = self.threaded parent.collapsed = self.should_collapse(parent) final.append(parent) return (final, prev_item, next_item, len(final), len(final))