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() NEWEST = enum.auto()
POSTED = enum.auto() POSTED = enum.auto()
RELEVANCE = enum.auto() RELEVANCE = enum.auto()
NEWEST_REPLY = enum.auto()
@property @property
def description(self) -> str: def description(self) -> str:
@ -55,6 +56,8 @@ class CommentTreeSortOption(enum.Enum):
return "order posted" return "order posted"
elif self.name == "RELEVANCE": elif self.name == "RELEVANCE":
return "relevance" return "relevance"
elif self.name == "NEWEST_REPLY":
return "newest reply"
return "most {}".format(self.name.lower()) 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 compare equal on the sorting method will be the same as the order that they were
originally in when passed to this function. 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: if sort == CommentTreeSortOption.NEWEST:
tree = sorted(tree, key=lambda c: c.created_time, reverse=True) tree = sorted(tree, key=lambda c: c.created_time, reverse=True)
elif sort == CommentTreeSortOption.POSTED: elif sort == CommentTreeSortOption.POSTED:
@ -108,13 +117,15 @@ class CommentTree:
tree = sorted(tree, key=lambda c: c.num_votes, reverse=True) tree = sorted(tree, key=lambda c: c.num_votes, reverse=True)
elif sort == CommentTreeSortOption.RELEVANCE: elif sort == CommentTreeSortOption.RELEVANCE:
tree = sorted(tree, key=lambda c: c.relevance_sorting_value, reverse=True) 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 return tree

11
tildes/tildes/views/topic.py

@ -184,10 +184,13 @@ def get_group_topics( # noqa
groups = [request.context] groups = [request.context]
if request.user: 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 include_subgroups = all_subgroups
else: else:

Loading…
Cancel
Save