From b952de3cee8c8be0a231b7792f0477fe7dc04d47 Mon Sep 17 00:00:00 2001 From: Aevann Date: Tue, 25 Apr 2023 11:50:47 +0200 Subject: [PATCH] restore "downvotes received" leaderboard --- files/classes/leaderboard.py | 16 ++++++++++++++++ files/helpers/cron.py | 17 ++++++++++++++++- files/routes/users.py | 2 ++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/files/classes/leaderboard.py b/files/classes/leaderboard.py index 592997555..4a0f68067 100644 --- a/files/classes/leaderboard.py +++ b/files/classes/leaderboard.py @@ -119,3 +119,19 @@ class Leaderboard: except: pos13 = (len(users13)+1, 0) return (users13_accs, pos13[0], pos13[1]) + + @classmethod + def get_downvotes_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit): + users9 = cache.get("users9") or [] + users9_1 = cache.get("users9_1") or [] + users9_2 = cache.get("users9_2") or [] + + users9_accs = db.query(User).filter(User.id.in_(users9_1)).all() + users9_accs = sorted(users9_accs, key=lambda x: users9_1.index(x.id)) + users9_accs = tuple(zip(users9_accs, users9_2)) + try: + pos9 = [x[0] for x in users9].index(v.id) + pos9 = (pos9+1, users9[pos9][1]) + except: pos9 = (len(users9)+1, 0) + + return (users9_accs, pos9[0], pos9[1]) diff --git a/files/helpers/cron.py b/files/helpers/cron.py index 7948b3e0e..9844ea2f2 100644 --- a/files/helpers/cron.py +++ b/files/helpers/cron.py @@ -130,7 +130,7 @@ def _generate_emojis_zip(): cache.set('emojis_size', size) -def _leaderboard_task(): +def _leaderboard_task(): votes1 = g.db.query(Vote.user_id, func.count(Vote.user_id)).filter(Vote.vote_type==1).group_by(Vote.user_id).order_by(func.count(Vote.user_id).desc()).all() votes2 = g.db.query(CommentVote.user_id, func.count(CommentVote.user_id)).filter(CommentVote.vote_type==1).group_by(CommentVote.user_id).order_by(func.count(CommentVote.user_id).desc()).all() votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) @@ -145,3 +145,18 @@ def _leaderboard_task(): cache.set("user13", list(users13)) cache.set("users13_1", list(users13_1)) cache.set("users13_2", list(users13_2)) + + votes1 = g.db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() + votes2 = g.db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() + votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) + users8 = g.db.query(User.id).filter(User.id.in_(votes3.keys())).all() + users9 = [] + for user in users8: + users9.append((user.id, votes3[user.id])) + if not users9: users9 = [(None,None)] + users9 = sorted(users9, key=lambda x: x[1], reverse=True) + users9_1, users9_2 = zip(*users9[:25]) + + cache.set("users9", list(users9)) + cache.set("users9_1", list(users9_1)) + cache.set("users9_2", list(users9_2)) diff --git a/files/routes/users.py b/files/routes/users.py index 926b8c3b8..5b3c71dbc 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -419,6 +419,8 @@ def leaderboard(v:User): leaderboards.append(Leaderboard("Upvotes given", "upvotes given", "upvotes-given", "Upvotes Given", "upvoting", Leaderboard.get_upvotes_lb, None, v, None, g.db, None)) + leaderboards.append(Leaderboard("Downvotes received", "downvotes received", "downvotes-received", "Downvotes Received", "downvoters", Leaderboard.get_downvotes_lb, None, v, None, g.db, None)) + return render_template("leaderboard.html", v=v, leaderboards=leaderboards) @app.get("//css")