diff --git a/app/routers/__init__.py b/app/routers/__init__.py index 8941d8c..1e34be5 100644 --- a/app/routers/__init__.py +++ b/app/routers/__init__.py @@ -1,6 +1,6 @@ from fastapi import APIRouter -from . import decks, games, players +from . import base, decks, games, players, seed api_router = APIRouter(prefix="/api") html_router = APIRouter() @@ -8,7 +8,11 @@ html_router = APIRouter() api_router.include_router(decks.api_router) api_router.include_router(players.api_router) api_router.include_router(games.api_router) +api_router.include_router(seed.api_router) html_router.include_router(decks.html_router) html_router.include_router(players.html_router) html_router.include_router(games.html_router) +html_router.include_router(seed.html_router) + +html_router.include_router(base.html_router) diff --git a/app/routers/base.py b/app/routers/base.py new file mode 100644 index 0000000..6a910a3 --- /dev/null +++ b/app/routers/base.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter, Depends, Request +from fastapi.responses import HTMLResponse + +from ..sql import crud +from ..templates import jinja_templates, _jsonify +from ..sql.database import get_db + +html_router = APIRouter(include_in_schema=False, default_response_class=HTMLResponse) + + +@html_router.get("/") +def main(request: Request, db=Depends(get_db)): + games = crud.get_games(db=db) + return jinja_templates.TemplateResponse( + request, "/main.html", {"games": _jsonify(games)} + ) diff --git a/app/routers/seed.py b/app/routers/seed.py new file mode 100644 index 0000000..6a9ef31 --- /dev/null +++ b/app/routers/seed.py @@ -0,0 +1,53 @@ +import csv +import logging +from fastapi import APIRouter, Depends, Request, UploadFile +from fastapi.responses import HTMLResponse +from sqlalchemy.orm import Session + +from ..templates import jinja_templates +from ..sql import crud, schemas +from ..sql.database import get_db + + +LOGGER = logging.getLogger(__name__) + +api_router = APIRouter(prefix="/seed", tags=["seed"]) +html_router = APIRouter( + prefix="/seed", include_in_schema=False, default_response_class=HTMLResponse +) + + +@api_router.post("/players") +def seed_players(file: UploadFile, db: Session = Depends(get_db)): + file_contents = file.file.read().decode("utf-8").split("\n") + reader = csv.reader(file_contents, delimiter=",") + for row in reader: + if not row: + continue + player_name = row[1] + crud.create_player(db=db, player=schemas.PlayerCreate(name=player_name)) + return "OK!" + + +@api_router.post("/decks") +def seed_decks(file: UploadFile, db: Session = Depends(get_db)): + file_contents = file.file.read().decode("utf-8").split("\n") + reader = csv.DictReader(file_contents, delimiter=",") + for row in reader: + if not row: + continue + crud.create_deck( + db=db, + deck=schemas.DeckCreate( + **{key: row[key] for key in ["name", "description", "owner_id"]} + ), + ) + return "OK!" + + +@html_router.get("/") +def main(request: Request, db=Depends(get_db)): + return jinja_templates.TemplateResponse( + request, + "/seed.html", + ) diff --git a/app/sql/schemas.py b/app/sql/schemas.py index b2fd237..3f3d3d2 100644 --- a/app/sql/schemas.py +++ b/app/sql/schemas.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Optional from pydantic import BaseModel @@ -47,7 +48,7 @@ class WinType(WinTypeBase): class GameBase(BaseModel): - date: int + date: datetime deck_id_1: int deck_id_2: int deck_id_3: int diff --git a/app/templates/__init__.py b/app/templates/__init__.py index 60a5a45..40bb4bd 100644 --- a/app/templates/__init__.py +++ b/app/templates/__init__.py @@ -13,5 +13,10 @@ jinja_templates = Jinja2Templates(directory="app/templates") # TODO - would this be better as a method on a class extending `db.Model` that the classes in `models.py` could then # extend? # (Probably not, as we'd still need to explicitly call it - it wouldn't be implicitly called _by_ Flask) +# +# (Assumes that this will only be passed lists or objects, not primitives) def _jsonify(o): - return {k: v for (k, v) in o.__dict__.items() if k != "_sa_instance_state"} + if hasattr(o, "__dict__"): + return {k: v for (k, v) in o.__dict__.items() if k != "_sa_instance_state"} + else: + return [_jsonify(e) for e in o] diff --git a/app/templates/games/list.html b/app/templates/games/list.html index ca05137..57ccb4e 100644 --- a/app/templates/games/list.html +++ b/app/templates/games/list.html @@ -9,11 +9,12 @@
Date | -Deck ID 1 | +Decks | +Winning Deck |
---|---|---|---|
{{ game.date }} | +{{ game.date }} | {{ game.deck_id_1 }} | diff --git a/app/templates/main.html b/app/templates/main.html new file mode 100644 index 0000000..521d08a --- /dev/null +++ b/app/templates/main.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %}EDH ELO{% endblock %} + +{% block head %} +{% endblock %} + +{% block content %} +