From cde7a4e01fa2e0f98b6af2ac5c607ed2f5711d6a Mon Sep 17 00:00:00 2001 From: blankie Date: Thu, 7 Sep 2023 09:59:03 +1000 Subject: [PATCH] Add a newest reply/newest leaf sorting method for comments Implements #111 --- tildes/tildes/enums.py | 3 +++ tildes/tildes/models/comment/comment_tree.py | 25 ++++++++++++++------ tildes/tildes/views/topic.py | 11 +++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/tildes/tildes/enums.py b/tildes/tildes/enums.py index cb5792a..46b9ec6 100644 --- a/tildes/tildes/enums.py +++ b/tildes/tildes/enums.py @@ -45,6 +45,7 @@ class CommentTreeSortOption(enum.Enum): NEWEST = enum.auto() POSTED = enum.auto() RELEVANCE = enum.auto() + NEWEST_REPLY = enum.auto() @property def description(self) -> str: @@ -55,6 +56,8 @@ class CommentTreeSortOption(enum.Enum): return "order posted" elif self.name == "RELEVANCE": return "relevance" + elif self.name == "NEWEST_REPLY": + return "newest reply" return "most {}".format(self.name.lower()) diff --git a/tildes/tildes/models/comment/comment_tree.py b/tildes/tildes/models/comment/comment_tree.py index 0fc4a25..85a6d2f 100644 --- a/tildes/tildes/models/comment/comment_tree.py +++ b/tildes/tildes/models/comment/comment_tree.py @@ -100,6 +100,15 @@ class CommentTree: compare equal on the sorting method will be the same as the order that they were originally in when passed to this function. """ + # sort the tree's comments first, this will be important when sorting by newest + # reply + for comment in tree: + if not comment.has_visible_descendant: + # no need to bother sorting replies if none will be visible + continue + + comment.replies = CommentTree._sort_tree(comment.replies, sort) + if sort == CommentTreeSortOption.NEWEST: tree = sorted(tree, key=lambda c: c.created_time, reverse=True) elif sort == CommentTreeSortOption.POSTED: @@ -108,13 +117,15 @@ class CommentTree: tree = sorted(tree, key=lambda c: c.num_votes, reverse=True) elif sort == CommentTreeSortOption.RELEVANCE: tree = sorted(tree, key=lambda c: c.relevance_sorting_value, reverse=True) - - for comment in tree: - if not comment.has_visible_descendant: - # no need to bother sorting replies if none will be visible - continue - - comment.replies = CommentTree._sort_tree(comment.replies, sort) + elif sort == CommentTreeSortOption.NEWEST_REPLY: + # sort by the creation time of the most recent reply in the entire tree, or + # the comment itself if it has no children. the comment's first reply is + # the newest reply since it has been sorted above + tree = sorted( + tree, + key=lambda c: (c.replies[0] if c.replies else c).created_time, + reverse=True, + ) return tree diff --git a/tildes/tildes/views/topic.py b/tildes/tildes/views/topic.py index cba2c7f..376cd8e 100644 --- a/tildes/tildes/views/topic.py +++ b/tildes/tildes/views/topic.py @@ -184,10 +184,13 @@ def get_group_topics( # noqa groups = [request.context] if request.user: - groups.extend([ - sub.group for sub in request.user.subscriptions - if sub.group.is_subgroup_of(request.context) - ]) + groups.extend( + [ + sub.group + for sub in request.user.subscriptions + if sub.group.is_subgroup_of(request.context) + ] + ) include_subgroups = all_subgroups else: