/plays fully functional
This commit is contained in:
parent
be229c3236
commit
6e299f01cb
@ -1852,8 +1852,10 @@ class StratPlay(BaseModel):
|
|||||||
game = ForeignKeyField(StratGame)
|
game = ForeignKeyField(StratGame)
|
||||||
play_num = IntegerField()
|
play_num = IntegerField()
|
||||||
batter = ForeignKeyField(Player)
|
batter = ForeignKeyField(Player)
|
||||||
|
batter_team = ForeignKeyField(Team)
|
||||||
pitcher = ForeignKeyField(Player)
|
pitcher = ForeignKeyField(Player)
|
||||||
on_base_code = IntegerField()
|
pitcher_team = ForeignKeyField(Team)
|
||||||
|
on_base_code = CharField()
|
||||||
inning_half = CharField()
|
inning_half = CharField()
|
||||||
inning_num = IntegerField()
|
inning_num = IntegerField()
|
||||||
batting_order = 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
|
# These <position> fields are only required if the play is an x-check or baserunning play
|
||||||
catcher = ForeignKeyField(Player, null=True)
|
catcher = ForeignKeyField(Player, null=True)
|
||||||
|
catcher_team = ForeignKeyField(Team, null=True)
|
||||||
defender = ForeignKeyField(Player, null=True)
|
defender = ForeignKeyField(Player, null=True)
|
||||||
|
defender_team = ForeignKeyField(Team, null=True)
|
||||||
runner = ForeignKeyField(Player, null=True)
|
runner = ForeignKeyField(Player, null=True)
|
||||||
|
runner_team = ForeignKeyField(Team, null=True)
|
||||||
|
|
||||||
check_pos = CharField(null=True)
|
check_pos = CharField(null=True)
|
||||||
error = IntegerField(default=0)
|
error = IntegerField(default=0)
|
||||||
@ -1935,6 +1940,6 @@ class StratPlay(BaseModel):
|
|||||||
|
|
||||||
db.create_tables([
|
db.create_tables([
|
||||||
Current, Division, Manager, Team, Result, Player, Schedule, Transaction, BattingStat, PitchingStat, Standings,
|
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()
|
db.close()
|
||||||
|
|||||||
@ -7,7 +7,7 @@ from fastapi import Depends, FastAPI, Request
|
|||||||
# from fastapi.openapi.utils import get_openapi
|
# from fastapi.openapi.utils import get_openapi
|
||||||
|
|
||||||
from .routers_v3 import current, players, results, schedules, standings, teams, transactions, battingstats, \
|
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}'
|
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'
|
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(draftdata.router)
|
||||||
app.include_router(keepers.router)
|
app.include_router(keepers.router)
|
||||||
app.include_router(stratgame.router)
|
app.include_router(stratgame.router)
|
||||||
|
app.include_router(stratplay.router)
|
||||||
|
|
||||||
|
|
||||||
# @app.get("/docs", include_in_schema=False)
|
# @app.get("/docs", include_in_schema=False)
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import copy
|
|||||||
import logging
|
import logging
|
||||||
import pydantic
|
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
|
from ..dependencies import oauth2_scheme, valid_token
|
||||||
|
|
||||||
router = APIRouter(
|
router = APIRouter(
|
||||||
@ -19,8 +19,10 @@ class PlayModel(pydantic.BaseModel):
|
|||||||
game_id: int
|
game_id: int
|
||||||
play_num: int
|
play_num: int
|
||||||
batter_id: int
|
batter_id: int
|
||||||
|
batter_team_id: int = None
|
||||||
pitcher_id: int
|
pitcher_id: int
|
||||||
on_base_code: int
|
pitcher_team_id: int = None
|
||||||
|
on_base_code: str
|
||||||
inning_half: Literal['top', 'bot']
|
inning_half: Literal['top', 'bot']
|
||||||
inning_num: int
|
inning_num: int
|
||||||
batting_order: int
|
batting_order: int
|
||||||
@ -61,8 +63,11 @@ class PlayModel(pydantic.BaseModel):
|
|||||||
wpa: float = 0
|
wpa: float = 0
|
||||||
|
|
||||||
catcher_id: int = None
|
catcher_id: int = None
|
||||||
|
catcher_team_id: int = None
|
||||||
defender_id: int = None
|
defender_id: int = None
|
||||||
|
defender_team_id: int = None
|
||||||
runner_id: int = None
|
runner_id: int = None
|
||||||
|
runner_team_id: int = None
|
||||||
|
|
||||||
check_pos: POS_LIST = None
|
check_pos: POS_LIST = None
|
||||||
error: int = 0
|
error: int = 0
|
||||||
@ -86,6 +91,7 @@ async def get_plays(
|
|||||||
batting_order: list = Query(default=None), starting_outs: list = Query(default=None),
|
batting_order: list = Query(default=None), starting_outs: list = Query(default=None),
|
||||||
batter_pos: list = Query(default=None), catcher_id: 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),
|
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):
|
short_output: Optional[bool] = False, limit: Optional[int] = 200):
|
||||||
all_plays = StratPlay.select()
|
all_plays = StratPlay.select()
|
||||||
|
|
||||||
@ -111,6 +117,17 @@ async def get_plays(
|
|||||||
all_plays = all_plays.where(StratPlay.defender_id << defender_id)
|
all_plays = all_plays.where(StratPlay.defender_id << defender_id)
|
||||||
if runner_id is not None:
|
if runner_id is not None:
|
||||||
all_plays = all_plays.where(StratPlay.runner_id << runner_id)
|
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:
|
if limit > 5000:
|
||||||
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')
|
raise HTTPException(status_code=401, detail='Unauthorized')
|
||||||
|
|
||||||
new_plays = []
|
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:
|
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():
|
with db.atomic():
|
||||||
for batch in chunked(new_plays, 20):
|
for batch in chunked(new_plays, 20):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user