Browse Source

Add a newest reply/newest leaf sorting method for comments

Implements #111
merge-requests/150/head
blankie 2 years ago
parent
commit
cde7a4e01f
No known key found for this signature in database GPG Key ID: CC15FC822C7F61F5
  1. 3
      tildes/tildes/enums.py
  2. 25
      tildes/tildes/models/comment/comment_tree.py
  3. 11
      tildes/tildes/views/topic.py

3
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())

25
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

11
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:

Loading…
Cancel
Save