Added player winrate statistic

This commit is contained in:
Yarne Coppens 2024-08-24 18:25:52 +02:00
parent 7bb210ba83
commit 96a8f21af1
4 changed files with 41 additions and 4 deletions

View file

@ -2,7 +2,7 @@ from pydantic import BaseModel
from typing import Union, Dict
from datetime import date
from src.classes import boardgame_classes
from src.classes import boardgame_classes, player_classes
class StatisticBase(BaseModel):
name: str
@ -10,6 +10,9 @@ class StatisticBase(BaseModel):
class NumberStatistic(StatisticBase):
result: float
class PlayerStatistic(StatisticBase):
result: Dict[str, float]
class GamesStatistic(StatisticBase):
result: list[boardgame_classes.BoardGamePublic]

View file

@ -160,7 +160,7 @@ def get_players(session: Session = Depends(get_session)):
@app.get('/player', response_model=player_classes.PlayerPublic)
def get_player(player_name: str, session: Session = Depends(get_session)):
requested_players = data_connection.get_player(player_name.title(), session)
requested_players = data_connection.get_player(player_name, session)
return requested_players
@ -211,4 +211,10 @@ def get_shelf_of_shame(query: BoardgameFilterParams = Depends(), session: Sessio
statistic_to_return = statistic_creator.get_shelf_of_shame(session, query)
return statistic_to_return
@app.get('/statistics/winrate', response_model=statistic_classes.PlayerStatistic)
def get_winrate(player_name: str | None = None, session: Session = Depends(get_session)):
statistic_to_return = statistic_creator.get_winrate(session, player_name)
return statistic_to_return

View file

@ -132,7 +132,7 @@ def get_all_players(session: Session) -> list[player_classes.Player]:
return players_from_db
def get_player(player_name: str, session: Session) -> player_classes.Player:
player_from_db = db_connection.get_player(player_name, session)
player_from_db = db_connection.get_player(player_name.title(), session)
return player_from_db
def get_designers(session: Session) -> list[people_classes.Designer]:

View file

@ -151,4 +151,32 @@ def get_shelf_of_shame(session: Session, filtering_query: BoardgameFilterParams
statistic_to_return = statistic_classes.GamesStatistic.model_validate(statistic_dict)
return statistic_to_return
return statistic_to_return
def get_winrate(session: Session, player_name: str | None = None):
if player_name == None:
players_to_calculate = data_connection.get_all_players(session)
else:
players_to_calculate = [data_connection.get_player(player_name.title(), session)]
statistic_dict = {
'name': 'Player winrate',
'result': {}
}
for player in players_to_calculate:
total_games_played = len(player.playplayers)
total_games_won = 0
for playplayer in player.playplayers:
if playplayer.has_won:
total_games_won += 1
statistic_dict['result'][player.name] = total_games_won / total_games_played
statistic_to_return = statistic_classes.PlayerStatistic.model_validate(statistic_dict)
return statistic_to_return