diff --git a/app/routers_v3/teams.py b/app/routers_v3/teams.py index 443d4bd..5409362 100644 --- a/app/routers_v3/teams.py +++ b/app/routers_v3/teams.py @@ -49,6 +49,17 @@ async def get_one_team(team_id: int): return TeamService.get_team(team_id) +@router.get('/{team_id}/roster') +@handle_db_errors +@cache_result(ttl=30*60, key_prefix='team-roster') +async def get_team_roster_default( + team_id: int, + sort: Optional[str] = None +): + """Get team roster with IL lists (defaults to current season).""" + return TeamService.get_team_roster(team_id, 'current', sort=sort) + + @router.get('/{team_id}/roster/{which}') @handle_db_errors @cache_result(ttl=30*60, key_prefix='team-roster') diff --git a/app/services/player_service.py b/app/services/player_service.py index 0101d3a..ef9f063 100644 --- a/app/services/player_service.py +++ b/app/services/player_service.py @@ -182,6 +182,13 @@ class PlayerService(BaseService): if pos: p_list = [x.upper() for x in pos] + + # Expand generic "P" to match all pitcher positions + pitcher_positions = ['SP', 'RP', 'CP'] + if 'P' in p_list: + p_list.remove('P') + p_list.extend(pitcher_positions) + pos_conditions = ( (Player.pos_1 << p_list) | (Player.pos_2 << p_list) @@ -216,6 +223,13 @@ class PlayerService(BaseService): return False if pos: p_list = [p.upper() for p in pos] + + # Expand generic "P" to match all pitcher positions + pitcher_positions = ['SP', 'RP', 'CP'] + if 'P' in p_list: + p_list.remove('P') + p_list.extend(pitcher_positions) + player_pos = [ player.get(f"pos_{i}") for i in range(1, 9) @@ -547,13 +561,27 @@ class PlayerService(BaseService): if not players: return "" - # Build CSV from dict data (works with mocks) + # Flatten nested objects for CSV export + flattened_players = [] + for player in players: + flat_player = player.copy() + # Flatten team object to just abbreviation + if isinstance(flat_player.get('team'), dict): + flat_player['team'] = flat_player['team'].get('abbrev', '') + + # Flatten sbaplayer object to just ID + if isinstance(flat_player.get('sbaplayer'), dict): + flat_player['sbaplayer'] = flat_player['sbaplayer'].get('id', '') + + flattened_players.append(flat_player) + + # Build CSV from flattened data output = io.StringIO() - if players: - writer = csv.DictWriter(output, fieldnames=players[0].keys()) + if flattened_players: + writer = csv.DictWriter(output, fieldnames=flattened_players[0].keys()) writer.writeheader() - writer.writerows(players) + writer.writerows(flattened_players) return output.getvalue() @@ -595,7 +623,9 @@ class RealPlayerRepository: self._model = model_class def select_season(self, season: int): - """Return query for season.""" + """Return query for season. Season=0 or None returns all seasons.""" + if season == 0 or season is None: + return self._model.select() return self._model.select().where(self._model.season == season) def get_by_id(self, player_id: int):