mirror of
https://gitlab.com/tildes/tildes.git
synced 2026-04-17 06:48:36 +02:00
Compress fully-removed comment chains
When a chain of comments has been fully removed, this will display a single marker like "Removed by admin: 8 comments by 2 users" instead of individual "Comment removed by site admin" markers for each one.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
|
||||
"""Contains the CommentTree and CommentInTree classes."""
|
||||
|
||||
from collections import Counter
|
||||
from datetime import datetime
|
||||
from typing import Iterator, List, Optional, Sequence, Tuple
|
||||
|
||||
@@ -51,6 +52,8 @@ class CommentTree:
|
||||
|
||||
self.tree = self._prune_empty_branches(self.tree)
|
||||
|
||||
self._add_removed_markers()
|
||||
|
||||
self._count_children()
|
||||
|
||||
def _count_children(self) -> None:
|
||||
@@ -131,6 +134,37 @@ class CommentTree:
|
||||
|
||||
return pruned_tree
|
||||
|
||||
def _add_removed_markers(self) -> None:
|
||||
"""Add markers to chains of removed comments with more info.
|
||||
|
||||
When displaying a comment tree, these markers should be displayed to users
|
||||
that can't view the removed comment, and stop recursing down the branch.
|
||||
"""
|
||||
# work backwards so all replies are always processed first
|
||||
for comment in reversed(self.comments):
|
||||
if not comment.is_removed:
|
||||
continue
|
||||
|
||||
# we can only compress when all descendants are also removed - checking
|
||||
# for this attr works because it's only added after passing this check
|
||||
if not all(
|
||||
hasattr(reply, "removed_comments_by_user") for reply in comment.replies
|
||||
):
|
||||
continue
|
||||
|
||||
comment.removed_comments_by_user = Counter({comment.user: 1})
|
||||
|
||||
# add all the descendants' counts onto this comment's
|
||||
for reply in comment.replies:
|
||||
comment.removed_comments_by_user += reply.removed_comments_by_user
|
||||
|
||||
num_comments = sum(comment.removed_comments_by_user.values())
|
||||
num_users = len(comment.removed_comments_by_user)
|
||||
if num_comments > 1:
|
||||
comment.removed_marker = (
|
||||
f"Removed by admin: {num_comments} comments by {num_users} users"
|
||||
)
|
||||
|
||||
def __iter__(self) -> Iterator[Comment]:
|
||||
"""Iterate over the (top-level) Comments in the tree."""
|
||||
for comment in self.tree:
|
||||
|
||||
@@ -30,9 +30,10 @@
|
||||
>
|
||||
{{ render_comment_contents(comment, is_individual_comment) }}
|
||||
|
||||
{% if comment.replies is defined and comment.replies %}
|
||||
{# Recursively display reply comments, unless we hit a "removed marker" #}
|
||||
{% if comment.replies and
|
||||
(request.has_permission("view", comment) or not comment.removed_marker) %}
|
||||
<ol class="comment-tree comment-tree-replies">
|
||||
{# Recursively display reply comments #}
|
||||
{{ loop(comment.replies) }}
|
||||
</ol>
|
||||
{% endif %}
|
||||
@@ -74,7 +75,11 @@
|
||||
{% if comment.is_deleted %}
|
||||
<div class="is-comment-deleted">Comment deleted by author</div>
|
||||
{% elif comment.is_removed %}
|
||||
<div class="is-comment-removed">Comment removed by site admin</div>
|
||||
{% if comment.removed_marker %}
|
||||
<div class="is-comment-removed">{{ comment.removed_marker }}</div>
|
||||
{% else %}
|
||||
<div class="is-comment-removed">Comment removed by site admin</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user