From 96a8f21af158b696d817d3b698325cf27c44c743 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 24 Aug 2024 18:25:52 +0200 Subject: [PATCH] Added player winrate statistic --- src/classes/statistic_classes.py | 5 ++++- src/main.py | 8 +++++++- src/modules/data_connection.py | 2 +- src/modules/statistic_creator.py | 30 +++++++++++++++++++++++++++++- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/classes/statistic_classes.py b/src/classes/statistic_classes.py index 359b4c8..797b27d 100644 --- a/src/classes/statistic_classes.py +++ b/src/classes/statistic_classes.py @@ -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] diff --git a/src/main.py b/src/main.py index 74de04c..853c014 100644 --- a/src/main.py +++ b/src/main.py @@ -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 \ No newline at end of file diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 7edd70f..109b6cd 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -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]: diff --git a/src/modules/statistic_creator.py b/src/modules/statistic_creator.py index 5eb1a16..fbe19f5 100644 --- a/src/modules/statistic_creator.py +++ b/src/modules/statistic_creator.py @@ -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 \ No newline at end of file + 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 + + \ No newline at end of file