First pass of real card gen

This commit is contained in:
Cal Corum 2023-10-11 00:58:30 -05:00
parent 1776df7173
commit 485a046855
5 changed files with 812 additions and 65 deletions

File diff suppressed because one or more lines are too long

View File

@ -577,6 +577,9 @@ BattingCard.add_index(bc_index)
class BattingCardRatings(BaseModel):
battingcard = ForeignKeyField(BattingCard)
vs_hand = CharField(default='R')
pull_rate: FloatField()
center_rate: FloatField()
slap_rate: FloatField()
homerun = FloatField()
bp_homerun = FloatField()
triple = FloatField()

View File

@ -1,7 +1,8 @@
import os
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
# from fastapi.staticfiles import StaticFiles
# from fastapi.templating import Jinja2Templates
from .routers_v2 import (
current, teams, rarity, cardsets, players, packtypes, packs, cards, events, results, rewards,
@ -12,6 +13,7 @@ app = FastAPI(
responses={404: {'description': 'Not found'}}
)
# app.mount("/static", StaticFiles(directory="storage/static"), name="static")
# templates = Jinja2Templates(directory=os.path.dirname(os.path.abspath(__file__)))
app.include_router(current.router)

View File

@ -4,7 +4,7 @@ import logging
import pydantic
from pydantic import root_validator
from ..db_engine import db, CardPosition, model_to_dict, chunked, Player
from ..db_engine import db, CardPosition, model_to_dict, chunked, Player, fn
from ..dependencies import oauth2_scheme, valid_token, LOG_DATA
logging.basicConfig(
@ -22,7 +22,7 @@ router = APIRouter(
class CardPositionModel(pydantic.BaseModel):
player_id: int
variant: int = 0
position: Literal['P', 'C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF']
position: Literal['P', 'C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF', 'DH']
innings: int = 1
range: int = 5
error: int = 0
@ -45,10 +45,10 @@ class PositionList(pydantic.BaseModel):
@router.get('')
async def get_card_positions(
player_id: Optional[int] = None, position: list = Query(default=None), min_innings: Optional[int] = 1,
player_id: list = Query(default=None), position: list = Query(default=None), min_innings: Optional[int] = 1,
r: list = Query(default=None), e: list = Query(default=None), arm: list = Query(default=None),
pb: list = Query(default=None), overthrow: list = Query(default=None), cardset_id: list = Query(default=None),
short_output: Optional[bool] = False):
short_output: Optional[bool] = False, sort: Optional[str] = 'innings-desc'):
all_pos = CardPosition.select().where(CardPosition.innings >= min_innings).order_by(
CardPosition.player, CardPosition.position, CardPosition.variant
)
@ -56,7 +56,8 @@ async def get_card_positions(
if player_id is not None:
all_pos = all_pos.where(CardPosition.player_id << player_id)
if position is not None:
all_pos = all_pos.where(CardPosition.position << position)
p_list = [x.lower() for x in position]
all_pos = all_pos.where(fn.Lower(CardPosition.position) << p_list)
if r is not None:
all_pos = all_pos.where(CardPosition.range << r)
if e is not None:
@ -67,10 +68,19 @@ async def get_card_positions(
all_pos = all_pos.where(CardPosition.pb << pb)
if overthrow is not None:
all_pos = all_pos.where(CardPosition.overthrow << overthrow)
if position is not None:
if cardset_id is not None:
all_players = Player.select().where(Player.cardset_id << cardset_id)
all_pos = all_pos.where(CardPosition.player << all_players)
if sort == 'innings-desc':
all_pos = all_pos.order_by(CardPosition.innings.desc())
elif sort == 'innings-asc':
all_pos = all_pos.order_by(CardPosition.innings)
elif sort == 'range-desc':
all_pos = all_pos.order_by(CardPosition.range.desc())
elif sort == 'range-asc':
all_pos = all_pos.order_by(CardPosition.range)
return_val = {'count': all_pos.count(), 'positions': [
model_to_dict(x, recurse=not short_output) for x in all_pos
]}

View File

@ -1,17 +1,18 @@
import os.path
import base64
from fastapi import APIRouter, Depends, HTTPException, Request, Response, Query
from fastapi.responses import FileResponse
from fastapi.templating import Jinja2Templates
from html2image import Html2Image
from typing import Optional, List
from typing import Optional, List, Literal
import logging
import pydantic
from pandas import DataFrame
from ..card_creation import get_batter_card_html, get_batter_card_data
from ..card_creation import get_batter_card_data, get_pitcher_card_data
from ..db_engine import db, Player, model_to_dict, fn, chunked, Paperdex, Cardset, Rarity, BattingCard, \
BattingCardRatings
BattingCardRatings, PitchingCard, PitchingCardRatings, CardPosition
from ..dependencies import oauth2_scheme, valid_token, LOG_DATA
logging.basicConfig(
@ -329,22 +330,26 @@ async def get_one_player(player_id, csv: Optional[bool] = False):
return return_val
@router.get('/{player_id}/battingcard')
async def get_player_card(
request: Request, player_id: int, variant: int = 0, d: str = None, html: Optional[bool] = False):
if os.path.isfile(f'storage/cards/{player_id}-{d}-v{variant}.png') and html is False:
db.close()
return FileResponse(
path=f'storage/cards/{player_id}-{d}-v{variant}.png',
media_type='image/png'
)
@router.get('/{player_id}/{card_type}card')
async def get_batter_card(
request: Request, player_id: int, card_type: Literal['batting', 'pitching'], variant: int = 0, d: str = None,
html: Optional[bool] = False):
try:
this_player = Player.get_by_id(player_id)
except Exception:
db.close()
raise HTTPException(status_code=404, detail=f'No player found with id {player_id}')
if os.path.isfile(f'storage/cards/cardset-{this_player.cardset.id}/{player_id}-{d}-v{variant}.png') and html is False:
db.close()
return FileResponse(
path=f'storage/cards/cardset-{this_player.cardset.id}/{player_id}-{d}-v{variant}.png',
media_type='image/png'
)
all_pos = CardPosition.select().where(CardPosition.player == this_player).order_by(CardPosition.innings.desc())
if card_type == 'batting':
this_bc = BattingCard.get_or_none(BattingCard.player == this_player, BattingCard.variant == variant)
if this_bc is None:
raise HTTPException(status_code=404, detail=f'Batting card not found for id {player_id}, variant {variant}')
@ -356,30 +361,39 @@ async def get_player_card(
if None in [rating_vr, rating_vl]:
raise HTTPException(status_code=404, detail=f'Ratings not found for batting card {this_bc.id}')
hti = Html2Image(
browser='chromium',
size=(1200, 600),
output_path=f'storage/cards',
custom_flags=['--no-sandbox', '--disable-remote-debugging', '--headless', '--disable-gpu',
'--disable-software-rasterizer', '--disable-dev-shm-usage']
)
card_data = {
'player': this_player,
'card_type': 'batter',
'results_vl_one': 'Big Dongs',
'results_vl_two': 'Lesser Dongs',
'results_vl_three': 'Sad Dongs',
'results_vr_one': 'Light Dongs',
'results_vr_two': 'Hefty Dongs',
'results_vr_three': 'Obese Dongs',
'request': request
}
card_data = get_batter_card_data(this_player, this_bc, rating_vl, rating_vr, all_pos)
card_data['request'] = request
html_response = templates.TemplateResponse("player_card.html", card_data)
else:
this_pc = PitchingCard.get_or_none(PitchingCard.player == this_player, PitchingCard.variant == variant)
if this_pc is None:
raise HTTPException(
status_code=404, detail=f'Pitching card not found for id {player_id}, variant {variant}')
rating_vl = PitchingCardRatings.get_or_none(
PitchingCardRatings.pitchingcard == this_pc, PitchingCardRatings.vs_hand == 'L')
rating_vr = PitchingCardRatings.get_or_none(
PitchingCardRatings.pitchingcard == this_pc, PitchingCardRatings.vs_hand == 'R')
if None in [rating_vr, rating_vl]:
raise HTTPException(status_code=404, detail=f'Ratings not found for pitching card {this_pc.id}')
card_data = get_pitcher_card_data(this_player, this_pc, rating_vl, rating_vr, all_pos)
card_data['request'] = request
html_response = templates.TemplateResponse("player_card.html", card_data)
if html:
db.close()
return html_response
hti = Html2Image(
browser='chromium',
size=(1200, 600),
output_path=f'storage/cards/cardset-{this_player.cardset.id}/',
custom_flags=['--no-sandbox', '--disable-remote-debugging', '--headless', '--disable-gpu',
'--disable-software-rasterizer', '--disable-dev-shm-usage']
)
logging.debug(f'body:\n{html_response.body.decode("UTF-8")}')
x = hti.screenshot(
html_str=str(html_response.body.decode("UTF-8")),
@ -390,6 +404,11 @@ async def get_player_card(
return FileResponse(path=x[0], media_type='image/png')
# @router.get('/{player_id}/pitchingcard')
# async def get_pitcher_card(
# request: Request, player_id: int, variant: int = 0, d: str = None, html: Optional[bool] = False)
@router.patch('/{player_id}')
async def v1_players_patch(
player_id, name: Optional[str] = None, image: Optional[str] = None, image2: Optional[str] = None,
@ -444,42 +463,42 @@ async def v1_players_patch(
raise HTTPException(status_code=404, detail=f'No rarity found with id {rarity_id}')
this_player.rarity = this_rarity
if pos_1 is not None:
if pos_1 == 'False':
if pos_1 in ['None', 'False', '']:
this_player.pos_1 = None
else:
this_player.pos_1 = pos_1
if pos_2 is not None:
if pos_2 == 'False':
if pos_2 in ['None', 'False', '']:
this_player.pos_2 = None
else:
this_player.pos_2 = pos_2
if pos_3 is not None:
if pos_3 == 'False':
if pos_3 in ['None', 'False', '']:
this_player.pos_3 = None
else:
this_player.pos_3 = pos_3
if pos_4 is not None:
if pos_4 == 'False':
if pos_4 in ['None', 'False', '']:
this_player.pos_4 = None
else:
this_player.pos_4 = pos_4
if pos_5 is not None:
if pos_5 == 'False':
if pos_5 in ['None', 'False', '']:
this_player.pos_5 = None
else:
this_player.pos_5 = pos_5
if pos_6 is not None:
if pos_6 == 'False':
if pos_6 in ['None', 'False', '']:
this_player.pos_6 = None
else:
this_player.pos_6 = pos_6
if pos_7 is not None:
if pos_7 == 'False':
if pos_7 in ['None', 'False', '']:
this_player.pos_7 = None
else:
this_player.pos_7 = pos_7
if pos_8 is not None:
if pos_8 == 'False':
if pos_8 in ['None', 'False', '']:
this_player.pos_8 = None
else:
this_player.pos_8 = pos_8