Update with Sheets testing
Changed to /battingstats/totals Updated some parameters to queries
This commit is contained in:
parent
9bfa9c86dc
commit
fb29f8bff3
12
app/main.py
12
app/main.py
@ -1,3 +1,7 @@
|
||||
import datetime
|
||||
import logging
|
||||
import os
|
||||
|
||||
from fastapi import Depends, FastAPI, Request
|
||||
# from fastapi.openapi.docs import get_swagger_ui_html
|
||||
# from fastapi.openapi.utils import get_openapi
|
||||
@ -5,6 +9,14 @@ from fastapi import Depends, FastAPI, Request
|
||||
from .routers_v3 import current, players, results, schedules, standings, teams, transactions, battingstats, \
|
||||
pitchingstats, fieldingstats, draftpicks, draftlist
|
||||
|
||||
date = f'{datetime.datetime.now().year}-{datetime.datetime.now().month}-{datetime.datetime.now().day}'
|
||||
log_level = logging.INFO if os.environ.get('LOG_LEVEL') == 'INFO' else 'WARN'
|
||||
logging.basicConfig(
|
||||
filename=f'logs/database/{date}.log',
|
||||
format='%(asctime)s - sba-database - %(levelname)s - %(message)s',
|
||||
level=log_level
|
||||
)
|
||||
|
||||
app = FastAPI(
|
||||
responses={404: {'description': 'Not found'}}
|
||||
)
|
||||
|
||||
@ -119,19 +119,34 @@ async def get_batstats(
|
||||
|
||||
return_stats = {
|
||||
'count': all_stats.count(),
|
||||
'stats': [model_to_dict(x, recurse=not short_output) for x in all_stats]
|
||||
'stats': [model_to_dict(x, recurse=not short_output) for x in all_stats],
|
||||
# 'stats': [{'id': x.id} for x in all_stats]
|
||||
}
|
||||
|
||||
db.close()
|
||||
return return_stats
|
||||
|
||||
|
||||
@router.get('/season/{season}')
|
||||
async def get_seasonstats(
|
||||
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] = False):
|
||||
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_pa: 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, fn.SUM(BattingStat.pa).alias('sum_pa'), fn.SUM(BattingStat.ab).alias('sum_ab'),
|
||||
@ -149,18 +164,42 @@ async def get_seasonstats(
|
||||
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.roba).alias('sum_roba'), fn.SUM(BattingStat.robs).alias('sum_robs'),
|
||||
fn.SUM(BattingStat.raa).alias('sum_raa'), fn.SUM(BattingStat.rto).alias('sum_rto'))
|
||||
fn.SUM(BattingStat.raa).alias('sum_raa'), fn.SUM(BattingStat.rto).alias('sum_rto'),
|
||||
BattingStat.team)
|
||||
.where((BattingStat.week >= weeks['start']) & (BattingStat.week <= weeks['end']) &
|
||||
(BattingStat.season == season))
|
||||
.order_by(BattingStat.player)
|
||||
.group_by(BattingStat.player)
|
||||
.having(fn.SUM(BattingStat.pa) > min_pa) # TESTING THIS
|
||||
)
|
||||
|
||||
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 min_pa is not None:
|
||||
# all_stats = all_stats.having(fn.SUM(BattingStat.pa) >= min_pa)
|
||||
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.team)
|
||||
elif group_by == 'player':
|
||||
all_stats = all_stats.group_by(BattingStat.player)
|
||||
elif group_by == 'playerteam':
|
||||
all_stats = all_stats.group_by(BattingStat.team, BattingStat.player)
|
||||
|
||||
# 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 team_id is not None:
|
||||
all_teams = Team.select().where(Team.id << team_id)
|
||||
@ -180,6 +219,7 @@ async def get_seasonstats(
|
||||
'count': sum(1 for i in all_stats if i.sum_pa > 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),
|
||||
'pa': x.sum_pa,
|
||||
'ab': x.sum_ab,
|
||||
'run': x.sum_run,
|
||||
|
||||
@ -25,7 +25,12 @@ class DraftListList(pydantic.BaseModel):
|
||||
|
||||
|
||||
@router.get('')
|
||||
async def get_draftlist(season: Optional[int], team_id: list = Query(default=None)):
|
||||
async def get_draftlist(
|
||||
season: Optional[int], team_id: list = Query(default=None), token: str = Depends(oauth2_scheme)):
|
||||
if not valid_token(token):
|
||||
logging.warning(f'post_draftlist - Bad Token: {token}')
|
||||
raise HTTPException(status_code=401, detail='Unauthorized')
|
||||
|
||||
all_list = DraftList.select()
|
||||
|
||||
if season is not None:
|
||||
@ -43,7 +48,11 @@ async def get_draftlist(season: Optional[int], team_id: list = Query(default=Non
|
||||
|
||||
|
||||
@router.get('/team/{team_id}')
|
||||
async def get_team_draftlist(team_id: int):
|
||||
async def get_team_draftlist(team_id: int, token: str = Depends(oauth2_scheme)):
|
||||
if not valid_token(token):
|
||||
logging.warning(f'post_draftlist - Bad Token: {token}')
|
||||
raise HTTPException(status_code=401, detail='Unauthorized')
|
||||
|
||||
this_team = Team.get_or_none(Team.id == team_id)
|
||||
if this_team is None:
|
||||
raise HTTPException(status_code=404, detail=f'Team ID {team_id} not found')
|
||||
|
||||
@ -29,8 +29,8 @@ class ResultList(pydantic.BaseModel):
|
||||
|
||||
@router.get('')
|
||||
async def get_results(
|
||||
season: int, team_abbrev: list = Query(default=None), week_start: list = Query(default=None),
|
||||
week_end: list = Query(default=None), game_num: list = Query(default=None),
|
||||
season: int, team_abbrev: list = Query(default=None), week_start: Optional[int] = None,
|
||||
week_end: Optional[int] = None, game_num: list = Query(default=None),
|
||||
away_abbrev: list = Query(default=None), home_abbrev: list = Query(default=None)):
|
||||
all_results = Result.select_season(season)
|
||||
|
||||
|
||||
@ -34,29 +34,28 @@ class TeamList(pydantic.BaseModel):
|
||||
|
||||
@router.get('')
|
||||
async def get_teams(
|
||||
season: Optional[int] = None, owner_id: Optional[int] = None, manager_id: Optional[int] = None,
|
||||
abbrev: Optional[str] = None, active_only: Optional[bool] = False, short_output: Optional[bool] = False):
|
||||
season: Optional[int] = None, owner_id: list = Query(default=None), manager_id: list = Query(default=None),
|
||||
team_abbrev: list = Query(default=None), active_only: Optional[bool] = False,
|
||||
short_output: Optional[bool] = False):
|
||||
if season is not None:
|
||||
all_teams = Team.select_season(season)
|
||||
else:
|
||||
all_teams = Team.select()
|
||||
|
||||
if manager_id is not None:
|
||||
managers = Manager.select().where(Manager.id << manager_id)
|
||||
all_teams = all_teams.where(
|
||||
(Team.manager1_id == manager_id) | (Team.manager2_id == manager_id)
|
||||
(Team.manager1_id << managers) | (Team.manager2_id << managers)
|
||||
)
|
||||
|
||||
if owner_id:
|
||||
all_teams = all_teams.where((Team.gmid == owner_id) | (Team.gmid2 == owner_id))
|
||||
|
||||
all_teams = all_teams.where((Team.gmid << owner_id) | (Team.gmid2 << owner_id))
|
||||
if team_abbrev is not None:
|
||||
all_teams = all_teams.where(Team.abbrev << team_abbrev)
|
||||
if active_only:
|
||||
all_teams = all_teams.where(
|
||||
~(Team.abbrev.endswith('IL')) & ~(Team.abbrev.endswith('MiL'))
|
||||
)
|
||||
|
||||
if abbrev is not None:
|
||||
all_teams = all_teams.where(Team.abbrev == abbrev)
|
||||
|
||||
return_teams = {
|
||||
'count': all_teams.count(),
|
||||
'teams': [model_to_dict(x, recurse=not short_output) for x in all_teams]
|
||||
|
||||
@ -31,53 +31,34 @@ class TransactionList(pydantic.BaseModel):
|
||||
|
||||
@router.get('')
|
||||
async def get_transactions(
|
||||
season, team_abbrev: Optional[str] = None, week_start: Optional[int] = 0,
|
||||
season, team_abbrev: list = Query(default=None), week_start: Optional[int] = 0,
|
||||
week_end: Optional[int] = None, cancelled: Optional[bool] = None, frozen: Optional[bool] = None,
|
||||
player_name: Optional[str] = None, player_id: Optional[int] = None, move_id: Optional[str] = None,
|
||||
player_name: list = Query(default=None), player_id: list = Query(default=None), move_id: Optional[str] = None,
|
||||
is_trade: Optional[bool] = None, short_output: Optional[bool] = False):
|
||||
if season:
|
||||
transactions = Transaction.select_season(season)
|
||||
else:
|
||||
transactions = Transaction.select()
|
||||
|
||||
if team_abbrev:
|
||||
these_teams = Team.select().where(
|
||||
(Team.abbrev == team_abbrev.upper()) |
|
||||
(Team.abbrev == f'{team_abbrev.upper()}MiL') | (Team.abbrev == f'{team_abbrev.upper()}IL')
|
||||
)
|
||||
if these_teams.count() == 0:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'Team {team_abbrev} not found')
|
||||
|
||||
if team_abbrev is not None:
|
||||
t_list = [x.upper() for x in team_abbrev]
|
||||
these_teams = Team.select().where((Team.abbrev << t_list))
|
||||
transactions = transactions.where(
|
||||
(Transaction.newteam << these_teams) | (Transaction.oldteam << these_teams)
|
||||
)
|
||||
|
||||
if week_start is not None:
|
||||
transactions = transactions.where(Transaction.week >= week_start)
|
||||
|
||||
if week_end is not None:
|
||||
transactions = transactions.where(Transaction.week <= week_end)
|
||||
|
||||
if move_id:
|
||||
transactions = transactions.where(Transaction.moveid == move_id)
|
||||
|
||||
if player_id or player_name:
|
||||
if player_id:
|
||||
try:
|
||||
this_player = Player.get_by_id(player_id)
|
||||
except Exception as e:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'Player id {player_id} not found')
|
||||
|
||||
transactions = transactions.where(Transaction.player == this_player)
|
||||
p_list = Player.select().where(Player.id << player_id)
|
||||
transactions = transactions.where(Transaction.player << p_list)
|
||||
else:
|
||||
these_players = Player.select().where(fn.Lower(Player.name) == player_name.lower())
|
||||
print(f'these_players: {these_players}\nCount: {these_players.count()}')
|
||||
if these_players.count() == 0:
|
||||
db.close()
|
||||
raise HTTPException(status_code=404, detail=f'Player {player_name} not found')
|
||||
|
||||
p_list = [x.lower() for x in player_name]
|
||||
these_players = Player.select().where(fn.Lower(Player.name) << p_list)
|
||||
transactions = transactions.where(Transaction.player << these_players)
|
||||
|
||||
if cancelled:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user