from peewee import * from src.model.BaseModel import BaseModel from src.model.Leaderboard import Leaderboard from src.model.User import User class LeaderboardUser(BaseModel): """ Leaderboard class """ leaderboard = ForeignKeyField( Leaderboard, backref="leaderboard_users", on_delete="CASCADE", on_update="CASCADE" ) user = ForeignKeyField( User, backref="leaderboard_users", on_delete="CASCADE", on_update="CASCADE" ) position = IntegerField() bounty = BigIntegerField() rank_index = SmallIntegerField() class Meta: db_table = "leaderboard_user" @staticmethod def get_appearances_as_rank(user: User, rank_index: int): """ Get the appearances of a user as a rank param user: The user param rank: The rank return: The appearances """ return ( LeaderboardUser() .select() .join(Leaderboard) .where( (LeaderboardUser.user == user) & (Leaderboard.group.is_null()) & (LeaderboardUser.rank_index == rank_index) ) .count() ) @staticmethod def get_max_rank_attained(user: User) -> "LeaderboardUser": """ Get the highest rank attained by a user param user: The user return: The highest rank attained """ return ( LeaderboardUser() .select() .join(Leaderboard) .where((LeaderboardUser.user == user) & (Leaderboard.group.is_null())) .order_by(LeaderboardUser.rank_index.asc()) .first() ) @staticmethod def get_max_bounty_attained(user: User) -> "LeaderboardUser": """ Get the highest bounty attained by a user param user: The user return: The highest bounty attained """ return ( LeaderboardUser() .select() .join(Leaderboard) .where((LeaderboardUser.user == user) & (Leaderboard.group.is_null())) .order_by(LeaderboardUser.bounty.desc()) .first() ) LeaderboardUser.create_table()