diff --git a/files/routes/comments.py b/files/routes/comments.py index 09f3586c70..ea31415734 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -76,6 +76,63 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None): post.replies=[top_comment] + if v: + votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() + + blocking = v.blocking.subquery() + + blocked = v.blocked.subquery() + + comments = g.db.query( + Comment, + votes.c.vote_type, + blocking.c.id, + blocked.c.id, + ) + if v.admin_level >=4: + comments=comments.options(joinedload(Comment.oauth_app)) + + comments=comments.filter( + Comment.parent_submission == post.id + ).join( + votes, + votes.c.comment_id == Comment.id, + isouter=True + ).join( + blocking, + blocking.c.target_id == Comment.author_id, + isouter=True + ).join( + blocked, + blocked.c.user_id == Comment.author_id, + isouter=True + ) + + if sort == "top": + comments = sorted(comments.all(), key=lambda x: x[0].score, reverse=True) + elif sort == "bottom": + comments = sorted(comments.all(), key=lambda x: x[0].score) + elif sort == "new": + comments = comments.order_by(Comment.created_utc.desc()).all() + elif sort == "old": + comments = comments.order_by(Comment.created_utc.asc()).all() + elif sort == "controversial": + comments = sorted(comments.all(), key=lambda x: x[0].score_disputed, reverse=True) + elif sort == "random": + c = comments.all() + comments = random.sample(c, k=len(c)) + else: + abort(422) + + output = [] + for c in comments: + comment = c[0] + if comment.author and comment.author.shadowbanned and not (v and v.id == comment.author_id): continue + comment.voted = c[1] or 0 + comment._is_blocking = c[2] or 0 + comment._is_blocked = c[3] or 0 + output.append(comment) + if request.headers.get("Authorization"): return top_comment.json else: return post.rendered_page(v=v, sort=sort, comment=top_comment, comment_info=comment_info)