/plays fully functional

This commit is contained in:
Cal Corum 2023-07-26 13:14:30 -05:00
parent be229c3236
commit 6e299f01cb
3 changed files with 49 additions and 6 deletions

View File

@ -1852,8 +1852,10 @@ class StratPlay(BaseModel):
game = ForeignKeyField(StratGame)
play_num = IntegerField()
batter = ForeignKeyField(Player)
batter_team = ForeignKeyField(Team)
pitcher = ForeignKeyField(Player)
on_base_code = IntegerField()
pitcher_team = ForeignKeyField(Team)
on_base_code = CharField()
inning_half = CharField()
inning_num = IntegerField()
batting_order = IntegerField()
@ -1896,8 +1898,11 @@ class StratPlay(BaseModel):
# These <position> fields are only required if the play is an x-check or baserunning play
catcher = ForeignKeyField(Player, null=True)
catcher_team = ForeignKeyField(Team, null=True)
defender = ForeignKeyField(Player, null=True)
defender_team = ForeignKeyField(Team, null=True)
runner = ForeignKeyField(Player, null=True)
runner_team = ForeignKeyField(Team, null=True)
check_pos = CharField(null=True)
error = IntegerField(default=0)
@ -1935,6 +1940,6 @@ class StratPlay(BaseModel):
db.create_tables([
Current, Division, Manager, Team, Result, Player, Schedule, Transaction, BattingStat, PitchingStat, Standings,
BattingCareer, PitchingCareer, FieldingCareer, Manager, Award, DiceRoll, DraftList, Keeper, StratGame
BattingCareer, PitchingCareer, FieldingCareer, Manager, Award, DiceRoll, DraftList, Keeper, StratGame, StratPlay
])
db.close()

View File

@ -7,7 +7,7 @@ from fastapi import Depends, FastAPI, Request
# from fastapi.openapi.utils import get_openapi
from .routers_v3 import current, players, results, schedules, standings, teams, transactions, battingstats, \
pitchingstats, fieldingstats, draftpicks, draftlist, managers, awards, draftdata, keepers, stratgame
pitchingstats, fieldingstats, draftpicks, draftlist, managers, awards, draftdata, keepers, stratgame, stratplay
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'
@ -39,6 +39,7 @@ app.include_router(awards.router)
app.include_router(draftdata.router)
app.include_router(keepers.router)
app.include_router(stratgame.router)
app.include_router(stratplay.router)
# @app.get("/docs", include_in_schema=False)

View File

@ -4,7 +4,7 @@ import copy
import logging
import pydantic
from ..db_engine import db, StratPlay, StratGame, model_to_dict, chunked, fn
from ..db_engine import db, StratPlay, StratGame, Team, model_to_dict, chunked, fn
from ..dependencies import oauth2_scheme, valid_token
router = APIRouter(
@ -19,8 +19,10 @@ class PlayModel(pydantic.BaseModel):
game_id: int
play_num: int
batter_id: int
batter_team_id: int = None
pitcher_id: int
on_base_code: int
pitcher_team_id: int = None
on_base_code: str
inning_half: Literal['top', 'bot']
inning_num: int
batting_order: int
@ -61,8 +63,11 @@ class PlayModel(pydantic.BaseModel):
wpa: float = 0
catcher_id: int = None
catcher_team_id: int = None
defender_id: int = None
defender_team_id: int = None
runner_id: int = None
runner_team_id: int = None
check_pos: POS_LIST = None
error: int = 0
@ -86,6 +91,7 @@ async def get_plays(
batting_order: list = Query(default=None), starting_outs: list = Query(default=None),
batter_pos: list = Query(default=None), catcher_id: list = Query(default=None),
defender_id: list = Query(default=None), runner_id: list = Query(default=None),
offense_team_id: list = Query(default=None), defense_team_id: list = Query(default=None),
short_output: Optional[bool] = False, limit: Optional[int] = 200):
all_plays = StratPlay.select()
@ -111,6 +117,17 @@ async def get_plays(
all_plays = all_plays.where(StratPlay.defender_id << defender_id)
if runner_id is not None:
all_plays = all_plays.where(StratPlay.runner_id << runner_id)
if offense_team_id is not None:
all_teams = Team.select().where(Team.id << offense_team_id)
all_plays = all_plays.where(
(StratPlay.batter_team << all_teams) | (StratPlay.runner_team << all_teams)
)
if defense_team_id is not None:
all_teams = Team.select().where(Team.id << defense_team_id)
all_plays = all_plays.where(
(StratPlay.pitcher_team << all_teams) | (StratPlay.catcher_team << all_teams) |
(StratPlay.defender_team << all_teams)
)
if limit > 5000:
limit = 5000
@ -150,8 +167,28 @@ async def post_plays(p_list: PlayList, token: str = Depends(oauth2_scheme)):
raise HTTPException(status_code=401, detail='Unauthorized')
new_plays = []
this_game = StratGame.get_or_none(StratGame.id == p_list.plays[0].game_id)
if this_game is None:
raise HTTPException(status_code=404, detail=f'Game ID {p_list.plays[0].game_id} not found')
for play in p_list.plays:
new_plays.append(play.dict())
this_play = play
top_half = this_play.inning_half == 'top'
if this_play.batter_team_id is None:
this_play.batter_team_id = this_game.away_team.id if top_half else this_game.home_team.id
if this_play.pitcher_team_id is None:
this_play.pitcher_team_id = this_game.home_team.id if top_half else this_game.away_team.id
if this_play.catcher_id is not None:
this_play.catcher_team_id = this_game.home_team.id if top_half else this_game.away_team.id
if this_play.defender_id is not None:
this_play.defender_team_id = this_game.home_team.id if top_half else this_game.away_team.id
if this_play.runner_id is not None:
this_play.runner_team_id = this_game.away_team.id if top_half else this_game.home_team.id
logging.info(f'this_play: {this_play}')
new_plays.append(this_play.dict())
with db.atomic():
for batch in chunked(new_plays, 20):