diff --git a/app/routers_v3/battingstats.py b/app/routers_v3/battingstats.py index fc2c870..d1452ea 100644 --- a/app/routers_v3/battingstats.py +++ b/app/routers_v3/battingstats.py @@ -168,7 +168,7 @@ async def get_totalstats( BattingStat.team) .where((BattingStat.week >= weeks['start']) & (BattingStat.week <= weeks['end']) & (BattingStat.season == season)) - .having(fn.SUM(BattingStat.pa) > min_pa) # TESTING THIS + .having(fn.SUM(BattingStat.pa) >= min_pa) ) # if min_pa is not None: diff --git a/app/routers_v3/fieldingstats.py b/app/routers_v3/fieldingstats.py index 16eef00..490edcd 100644 --- a/app/routers_v3/fieldingstats.py +++ b/app/routers_v3/fieldingstats.py @@ -97,30 +97,58 @@ async def get_fieldingstats( return return_stats -@router.get('/season/{season}') -async def get_stasonstats( - season: int, s_type: Literal['regular', 'post', 'total'] = 'regular', team_abbrev: list = Query(default=None), +@router.get('/totals') +async def get_totalstats( + season: int, s_type: Literal['regular', 'post', 'total', None] = None, team_abbrev: list = Query(default=None), team_id: list = Query(default=None), player_name: list = Query(default=None), - player_id: list = Query(default=None), short_output: Optional[bool] = True): - weeks = per_season_weeks(season, s_type) + week_start: Optional[int] = None, week_end: Optional[int] = None, game_num: list = Query(default=None), + position: list = Query(default=None), sort: Optional[str] = None, player_id: list = Query(default=None), + group_by: Literal['team', 'player', 'playerteam'] = 'player', short_output: Optional[bool] = False, + min_ch: Optional[int] = 1): + if s_type is not None: + weeks = per_season_weeks(season, s_type) + else: + weeks = {'start': 1, 'end': 99} + if week_start is not None: + weeks['start'] = week_start + if week_end is not None: + if week_end < weeks['start']: + raise HTTPException(status_code=400, detail='week_end must be greater than or equal to week_start') + else: + weeks['end'] = week_end + all_stats = ( BattingStat .select(BattingStat.player, BattingStat.pos, fn.SUM(BattingStat.xch).alias('sum_xch'), fn.SUM(BattingStat.xhit).alias('sum_xhit'), fn.SUM(BattingStat.error).alias('sum_error'), fn.SUM(BattingStat.pb).alias('sum_pb'), fn.SUM(BattingStat.sbc).alias('sum_sbc'), - fn.SUM(BattingStat.csc).alias('sum_csc')) + fn.SUM(BattingStat.csc).alias('sum_csc'), BattingStat.team) .where((BattingStat.week >= weeks['start']) & (BattingStat.week <= weeks['end']) & (BattingStat.season == season)) - .order_by(BattingStat.player) - .group_by(BattingStat.player, BattingStat.pos) + .having(fn.SUM(BattingStat.xch) >= min_ch) ) - if team_abbrev is None and team_id is None and player_name is None and player_id is None: - raise HTTPException( - status_code=400, - detail=f'Must include team_id/team_abbrev and/or player_name/player_id' + if game_num is not None: + all_stats = all_stats.where(BattingStat.game << game_num) + if position is not None: + p_list = [x.upper() for x in position] + all_players = Player.select().where( + (Player.pos_1 << p_list) | (Player.pos_2 << p_list) | (Player.pos_3 << p_list) | (Player.pos_4 << p_list) | + (Player.pos_5 << p_list) | (Player.pos_6 << p_list) | (Player.pos_7 << p_list) | (Player.pos_8 << p_list) ) - + all_stats = all_stats.where(BattingStat.player << all_players) + if sort is not None: + if sort == 'player': + all_stats = all_stats.order_by(BattingStat.player) + elif sort == 'team': + all_stats = all_stats.order_by(BattingStat.team) + if group_by is not None: + if group_by == 'team': + all_stats = all_stats.group_by(BattingStat.pos, BattingStat.team) + elif group_by == 'player': + all_stats = all_stats.group_by(BattingStat.pos, BattingStat.player) + elif group_by == 'playerteam': + all_stats = all_stats.group_by(BattingStat.pos, BattingStat.team, BattingStat.player) if team_id is not None: all_teams = Team.select().where(Team.id << team_id) all_stats = all_stats.where(BattingStat.team << all_teams) @@ -139,6 +167,7 @@ async def get_stasonstats( 'count': sum(1 for i in all_stats if i.sum_xch + i.sum_sbc > 0), 'stats': [{ 'player': x.player_id if short_output else model_to_dict(x.player, recurse=False), + 'team': x.team_id if short_output else model_to_dict(x.team, recurse=False), 'pos': x.pos, 'xch': x.sum_xch, 'xhit': x.sum_xhit,