diff --git a/db_engine.py b/db_engine.py index 2550ac7..6d97020 100644 --- a/db_engine.py +++ b/db_engine.py @@ -481,3 +481,178 @@ db.create_tables([ GauntletRun ]) db.close() + +scout_db = SqliteDatabase( + 'storage/card_creation.db', + pragmas={ + 'journal_mode': 'wal', + 'cache_size': -1 * 64000, + 'synchronous': 0 + } +) + + +class BaseModelScout(Model): + class Meta: + database = scout_db + + +class ScoutCardset(BaseModelScout): + set_title = CharField() + set_subtitle = CharField(null=True) + + +class ScoutPlayer(BaseModelScout): + sba_id = IntegerField(primary_key=True) + name = CharField() + fg_id = IntegerField() + br_id = CharField() + offense_col = IntegerField() + hand = CharField(default='R') + + +scout_db.create_tables([ScoutCardset, ScoutPlayer]) + + +class BatterRatings(BaseModelScout): + id = CharField(unique=True, primary_key=True) + player = ForeignKeyField(ScoutPlayer) + cardset = ForeignKeyField(ScoutCardset) + vs_hand = FloatField() + is_prep = BooleanField() + homerun = FloatField() + bp_homerun = FloatField() + triple = FloatField() + double_three = FloatField() + double_two = FloatField() + double_pull = FloatField() + single_two = FloatField() + single_one = FloatField() + single_center = FloatField() + bp_single = FloatField() + hbp = FloatField() + walk = FloatField() + strikeout = FloatField() + lineout = FloatField() + popout = FloatField() + flyout_a = FloatField() + flyout_bq = FloatField() + flyout_lf_b = FloatField() + flyout_rf_b = FloatField() + groundout_a = FloatField() + groundout_b = FloatField() + groundout_c = FloatField() + avg = FloatField(null=True) + obp = FloatField(null=True) + slg = FloatField(null=True) + + +class PitcherRatings(BaseModelScout): + id = CharField(unique=True, primary_key=True) + player = ForeignKeyField(ScoutPlayer) + cardset = ForeignKeyField(ScoutCardset) + vs_hand = CharField() + is_prep = BooleanField() + homerun = FloatField() + bp_homerun = FloatField() + triple = FloatField() + double_three = FloatField() + double_two = FloatField() + double_cf = FloatField() + single_two = FloatField() + single_one = FloatField() + single_center = FloatField() + bp_single = FloatField() + hbp = FloatField() + walk = FloatField() + strikeout = FloatField() + fo_slap = FloatField() + fo_center = FloatField() + groundout_a = FloatField() + groundout_b = FloatField() + xcheck_p = FloatField() + xcheck_c = FloatField() + xcheck_1b = FloatField() + xcheck_2b = FloatField() + xcheck_3b = FloatField() + xcheck_ss = FloatField() + xcheck_lf = FloatField() + xcheck_cf = FloatField() + xcheck_rf = FloatField() + avg = FloatField(null=True) + obp = FloatField(null=True) + slg = FloatField(null=True) + + +scout_db.create_tables([BatterRatings, PitcherRatings]) + + +class CardColumns(BaseModelScout): + id = CharField(unique=True, primary_key=True) + player = ForeignKeyField(ScoutPlayer) + hand = CharField() + b_ratings = ForeignKeyField(BatterRatings, null=True) + p_ratings = ForeignKeyField(PitcherRatings, null=True) + one_dice = CharField() + one_results = CharField() + one_splits = CharField() + two_dice = CharField() + two_results = CharField() + two_splits = CharField() + three_dice = CharField() + three_results = CharField() + three_splits = CharField() + + +class Position(BaseModelScout): + player = ForeignKeyField(ScoutPlayer) + cardset = ForeignKeyField(ScoutCardset) + position = CharField() + innings = IntegerField() + range = IntegerField() + error = IntegerField() + arm = CharField(null=True) + pb = IntegerField(null=True) + overthrow = IntegerField(null=True) + + +class BatterData(BaseModelScout): + player = ForeignKeyField(ScoutPlayer) + cardset = ForeignKeyField(ScoutCardset) + stealing = CharField() + st_low = IntegerField() + st_high = IntegerField() + st_auto = BooleanField() + st_jump = FloatField() + bunting = CharField(null=True) + hit_and_run = CharField(null=True) + running = CharField() + + +class PitcherData(BaseModelScout): + player = ForeignKeyField(ScoutPlayer) + cardset = ForeignKeyField(ScoutCardset) + balk = IntegerField(null=True) + wild_pitch = IntegerField(null=True) + hold = CharField() + starter_rating = IntegerField() + relief_rating = IntegerField() + closer_rating = IntegerField(null=True) + batting = CharField(null=True) + + +scout_db.create_tables([CardColumns, Position, BatterData, PitcherData]) + + +class CardOutput(BaseModelScout): + name = CharField() + hand = CharField() + positions = CharField() + stealing = CharField() + bunting = CharField() + hitandrun = CharField() + running = CharField() + + +scout_db.close() + diff --git a/main.py b/main.py index 1bec558..d94daf6 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ import logging import os from db_engine import * -from typing import Optional, List, Union +from typing import Optional, List, Union, Literal from fastapi import FastAPI, HTTPException, Depends, Response, Query from fastapi.security import OAuth2PasswordBearer import pydantic @@ -4912,3 +4912,28 @@ async def v1_stl_fix(token: str = Depends(oauth2_scheme)): return {'detail': f'Removed the period from St Louis'} + +@app.get('/api/v1/ratings/batter/{sba_id}') +async def v1_ratings_batter_get( + sba_id: int, cardset_name: Optional[str] = None, vs_hand: Literal["l", "r", "L", "R"] = None): + this_player = ScoutPlayer.get_or_none(ScoutPlayer.sba_id == sba_id) + logging.info(f'num players: {ScoutPlayer.select().count()}') + if this_player is None: + scout_db.close() + raise HTTPException(status_code=404, detail=f'SBa ID {sba_id} not found') + + r_query = BatterRatings.select().where( + (BatterRatings.player == this_player) & (BatterRatings.is_prep == 0) + ) + + if cardset_name is not None: + this_cardset = ScoutCardset.get_or_none(fn.Lower(ScoutCardset.set_title) == cardset_name.lower()) + r_query = r_query.where(BatterRatings.cardset == this_cardset) + if vs_hand is not None: + r_query = r_query.where(fn.Lower(BatterRatings.vs_hand) == f'v{vs_hand.lower()}') + + return_val = {'count': r_query.count(), 'ratings': [model_to_dict(x) for x in r_query]} + + scout_db.close() + return return_val +