forked from MarseyWorld/MarseyWorld
leaderboards: annotate the db param, fix posts and comments, and move const to const file, etc
parent
d6f1f3c070
commit
cfeafea0d4
|
@ -1,5 +1,8 @@
|
|||
from typing import Any, Callable, Optional, Tuple
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import scoped_session
|
||||
|
||||
from files.helpers.const import LEADERBOARD_LIMIT
|
||||
|
||||
from .badges import Badge
|
||||
from .marsey import Marsey
|
||||
|
@ -7,8 +10,9 @@ from .user import User
|
|||
from .userblock import UserBlock
|
||||
|
||||
class Leaderboard:
|
||||
"""Represents an request-context leaderboard. None of this is persisted yet,
|
||||
although this is probably a good idea to do at some point.
|
||||
"""
|
||||
Represents an request-context leaderboard. None of this is persisted yet,
|
||||
although this is probably a good idea to do at some point.
|
||||
"""
|
||||
all_users = None
|
||||
v_position = 0
|
||||
|
@ -17,7 +21,7 @@ class Leaderboard:
|
|||
|
||||
def __init__(self, header_name:str, table_header_name:str, html_id:str, table_column_name:str,
|
||||
user_relative_url:Optional[str], query_function:Callable[..., Tuple[Any, Any, Any]],
|
||||
criteria, v:User, value_func:Optional[Callable[[User], int]], db, users, limit=25):
|
||||
criteria, v:User, value_func:Optional[Callable[[User], int]], db:scoped_session, users, limit=LEADERBOARD_LIMIT):
|
||||
self.header_name = header_name
|
||||
self.table_header_name = table_header_name
|
||||
self.html_id = html_id
|
||||
|
@ -36,7 +40,7 @@ class Leaderboard:
|
|||
self.value_func = lambda u: u[1]
|
||||
|
||||
@classmethod
|
||||
def get_simple_lb(cls, order_by, v:User, db, users, limit):
|
||||
def get_simple_lb(cls, order_by, v:User, db:scoped_session, users, limit:int):
|
||||
leaderboard = users.order_by(order_by.desc()).limit(limit).all()
|
||||
position = None
|
||||
if v not in leaderboard:
|
||||
|
@ -53,7 +57,7 @@ class Leaderboard:
|
|||
return func.rank().over(order_by=func.count(criteria).desc()).label("rank")
|
||||
|
||||
@classmethod
|
||||
def get_badge_marsey_lb(cls, lb_criteria, v:User, db, users:Any, limit):
|
||||
def get_badge_marsey_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit):
|
||||
sq = db.query(lb_criteria, cls.count_and_label(lb_criteria), cls.rank_filtered_rank_label_by_desc(lb_criteria)).group_by(lb_criteria).subquery()
|
||||
sq_criteria = None
|
||||
if lb_criteria == Badge.user_id:
|
||||
|
@ -71,7 +75,7 @@ class Leaderboard:
|
|||
return (leaderboard, position[0], position[1])
|
||||
|
||||
@classmethod
|
||||
def get_blockers_lb(cls, lb_criteria, v:User, db, users:Any, limit):
|
||||
def get_blockers_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit):
|
||||
if lb_criteria != UserBlock.target_id:
|
||||
raise ValueError("This leaderboard function only supports UserBlock.target_id")
|
||||
sq = db.query(lb_criteria, cls.count_and_label(lb_criteria)).group_by(lb_criteria).subquery()
|
||||
|
@ -84,7 +88,7 @@ class Leaderboard:
|
|||
return (leaderboard, position[0], position[1])
|
||||
|
||||
@classmethod
|
||||
def get_hat_lb(cls, lb_criteria, v:User, db, users:Any, limit):
|
||||
def get_hat_lb(cls, lb_criteria, v:User, db:scoped_session, users:Any, limit):
|
||||
leaderboard = db.query(User.id, func.count(lb_criteria)).join(lb_criteria).group_by(User).order_by(func.count(lb_criteria).desc())
|
||||
sq = db.query(User.id, cls.count_and_label(lb_criteria), cls.rank_filtered_rank_label_by_desc(lb_criteria)).join(lb_criteria).group_by(User).subquery()
|
||||
position = db.query(sq.c.rank, sq.c.count).filter(sq.c.id == v.id).limit(1).one_or_none()
|
||||
|
|
|
@ -152,6 +152,8 @@ DISCORD_CHANGELOG_CHANNEL_IDS = [1022232469606498324]
|
|||
WPD_CHANNEL_ID = 1013990963846332456
|
||||
PIN_AWARD_TEXT = " (pin award)"
|
||||
|
||||
LEADERBOARD_LIMIT = 25
|
||||
|
||||
################################################################################
|
||||
### SITE SPECIFIC CONSTANTS
|
||||
################################################################################
|
||||
|
|
|
@ -345,24 +345,23 @@ def transfer_bux(v, username):
|
|||
@app.get("/leaderboard")
|
||||
@auth_required
|
||||
def leaderboard(v):
|
||||
LEADERBOARD_LIMIT = 25
|
||||
users = g.db.query(User)
|
||||
|
||||
coins = Leaderboard("Coins", "coins", "coins", "Coins", None, Leaderboard.get_simple_lb, User.coins, v, v.coins, g.db, users, LEADERBOARD_LIMIT)
|
||||
subscribers = Leaderboard("Followers", "followers", "followers", "Followers", None, Leaderboard.get_simple_lb, User.stored_subscriber_count, v, v.stored_subscriber_count, g.db, users, LEADERBOARD_LIMIT)
|
||||
posts = Leaderboard("Posts", "post count", "posts", "Posts", None, Leaderboard.get_simple_lb, User.post_count, v, v.post_count, users, LEADERBOARD_LIMIT)
|
||||
comments = Leaderboard("Comments", "comment count", "comments", "Comments", None, Leaderboard.get_simple_lb, User.post_count, v, v.post_count, users, LEADERBOARD_LIMIT)
|
||||
received_awards = Leaderboard("Awards", "received awards", "awards", "Awards", None, Leaderboard.get_simple_lb, User.received_award_count, v, v.received_award_count, db, users, LEADERBOARD_LIMIT)
|
||||
coins_spent = Leaderboard("Spent in shop", "coins spent in shop", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, v.coins_spent, db, users, LEADERBOARD_LIMIT)
|
||||
truecoins = Leaderboard("Truescore", "truescore", "truescore", "Truescore", None, Leaderboard.get_simple_lb, User.truecoins, v, v.truecoins, db, users, LEADERBOARD_LIMIT)
|
||||
coins = Leaderboard("Coins", "coins", "coins", "Coins", None, Leaderboard.get_simple_lb, User.coins, v, v.coins, g.db, users)
|
||||
subscribers = Leaderboard("Followers", "followers", "followers", "Followers", None, Leaderboard.get_simple_lb, User.stored_subscriber_count, v, v.stored_subscriber_count, g.db, users)
|
||||
posts = Leaderboard("Posts", "post count", "posts", "Posts", None, Leaderboard.get_simple_lb, User.post_count, v, v.post_count, g.db, users)
|
||||
comments = Leaderboard("Comments", "comment count", "comments", "Comments", None, Leaderboard.get_simple_lb, User.comment_count, v, v.comment_count, g.db, users)
|
||||
received_awards = Leaderboard("Awards", "received awards", "awards", "Awards", None, Leaderboard.get_simple_lb, User.received_award_count, v, v.received_award_count, g.db, users)
|
||||
coins_spent = Leaderboard("Spent in shop", "coins spent in shop", "spent", "Coins", None, Leaderboard.get_simple_lb, User.coins_spent, v, v.coins_spent, g.db, users)
|
||||
truecoins = Leaderboard("Truescore", "truescore", "truescore", "Truescore", None, Leaderboard.get_simple_lb, User.truecoins, v, v.truecoins, g.db, users)
|
||||
|
||||
badges = Leaderboard("Badges", "badges", "badges", "Badges", None, Leaderboard.get_badge_marsey_lb, Badge.user_id, v, None, db, None, LEADERBOARD_LIMIT)
|
||||
marseys = Leaderboard("Marseys", "Marseys made", "marseys", "Marseys", None, Leaderboard.get_badge_marsey_lb, Marsey.author_id, v, None, db, None, LEADERBOARD_LIMIT) if SITE_NAME == 'rDrama' else None
|
||||
badges = Leaderboard("Badges", "badges", "badges", "Badges", None, Leaderboard.get_badge_marsey_lb, Badge.user_id, v, None, g.db, None)
|
||||
marseys = Leaderboard("Marseys", "Marseys made", "marseys", "Marseys", None, Leaderboard.get_badge_marsey_lb, Marsey.author_id, v, None, g.db, None) if SITE_NAME == 'rDrama' else None
|
||||
|
||||
blocks = Leaderboard("Blocked", "most blocked", "blocked", "Blocked By", "blockers", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, db, None, LEADERBOARD_LIMIT)
|
||||
blocks = Leaderboard("Blocked", "most blocked", "blocked", "Blocked By", "blockers", Leaderboard.get_blockers_lb, UserBlock.target_id, v, None, g.db, None)
|
||||
|
||||
owned_hats = Leaderboard("Owned hats", "owned hats", "owned-hats", "Owned Hats", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, db, None, LEADERBOARD_LIMIT)
|
||||
designed_hats = Leaderboard("Designed hats", "designed hats", "designed-hats", "Designed Hats", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, db, None, LEADERBOARD_LIMIT)
|
||||
owned_hats = Leaderboard("Owned hats", "owned hats", "owned-hats", "Owned Hats", None, Leaderboard.get_hat_lb, User.owned_hats, v, None, g.db, None)
|
||||
designed_hats = Leaderboard("Designed hats", "designed hats", "designed-hats", "Designed Hats", None, Leaderboard.get_hat_lb, User.designed_hats, v, None, g.db, None)
|
||||
|
||||
leaderboards = [coins, coins_spent, truecoins, subscribers, posts, comments, received_awards, badges, marseys, blocks, owned_hats, designed_hats]
|
||||
|
||||
|
|
Loading…
Reference in New Issue