diff --git a/app/routers/games.py b/app/routers/games.py index c2990b5..1cdfb65 100644 --- a/app/routers/games.py +++ b/app/routers/games.py @@ -1,9 +1,14 @@ import json +from functional import seq +from typing import List, Mapping + from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import HTMLResponse from sqlalchemy.orm import Session +from app.routers.decks import list_decks +from app.sql import models from .players import list_players from ..templates import jinja_templates from ..sql import crud, schemas @@ -75,8 +80,27 @@ def game_create_html(request: Request, db=Depends(get_db)): @html_router.get("/list") def games_html(request: Request, db=Depends(get_db)): games = list_games(db=db) + decks = list_decks(db=db) + decks_by_id = {deck.id: deck for deck in decks} + game_names = {game.id: _build_game_deck_names(game, decks_by_id) for game in games} return jinja_templates.TemplateResponse( - request, "games/list.html", {"games": games} + request, + "games/list.html", + {"games": games, "decks_by_id": decks_by_id, "game_names": game_names}, + ) + + +def _build_game_deck_names( + game: models.Game, decks_by_id: Mapping[int, models.Deck] +) -> List[str]: + return ( + seq(range(6)) + .map(lambda i: i + 1) + .map(lambda i: f"deck_id_{i}") + .map(lambda key: getattr(game, key)) + .filter(lambda x: x) + .map(lambda deck_id: decks_by_id[deck_id]) + .map(lambda deck: deck.name) ) diff --git a/app/routers/seed.py b/app/routers/seed.py index 6a9ef31..6eb9972 100644 --- a/app/routers/seed.py +++ b/app/routers/seed.py @@ -1,4 +1,5 @@ import csv +import datetime import logging from fastapi import APIRouter, Depends, Request, UploadFile from fastapi.responses import HTMLResponse @@ -45,6 +46,38 @@ def seed_decks(file: UploadFile, db: Session = Depends(get_db)): return "OK!" +@api_router.post("/games") +def seed_games(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 + args = { + key: row[key] + for key in [ + "deck_id_1", + "deck_id_2", + "winning_deck_id", + "number_of_turns", + "first_player_out_turn", + "win_type_id", + "description", + ] + } + args["date"] = datetime.datetime.strptime(row["date"], "%Y-%m-%d") + + for deck_id_num in ["deck_id_3", "deck_id_4", "deck_id_5", "deck_id_6"]: + if deck_id := row[deck_id_num]: + LOGGER.error(f"{deck_id_num} is {deck_id}") + args[deck_id_num] = deck_id + crud.create_game( + db=db, + game=schemas.GameCreate(**args), + ) + return "OK!" + + @html_router.get("/") def main(request: Request, db=Depends(get_db)): return jinja_templates.TemplateResponse( diff --git a/app/sql/crud.py b/app/sql/crud.py index 3d526c3..2c916ab 100644 --- a/app/sql/crud.py +++ b/app/sql/crud.py @@ -55,7 +55,7 @@ def get_games(db: Session, skip: int = 0, limit: int = 100): def create_game(db: Session, game: schemas.GameCreate): - db_game = models.Game(**game.model_dump) + db_game = models.Game(**game.model_dump()) db.add(db_game) db.commit() db.refresh(db_game) diff --git a/app/sql/schemas.py b/app/sql/schemas.py index 3f3d3d2..c24cb58 100644 --- a/app/sql/schemas.py +++ b/app/sql/schemas.py @@ -51,10 +51,10 @@ class GameBase(BaseModel): date: datetime deck_id_1: int deck_id_2: int - deck_id_3: int - deck_id_4: int - deck_id_5: int - deck_id_6: int + deck_id_3: Optional[int] = None + deck_id_4: Optional[int] = None + deck_id_5: Optional[int] = None + deck_id_6: Optional[int] = None winning_deck_id: int number_of_turns: int first_player_out_turn: int diff --git a/app/templates/games/detail.html b/app/templates/games/detail.html index a1e4d22..968a2fa 100644 --- a/app/templates/games/detail.html +++ b/app/templates/games/detail.html @@ -6,7 +6,7 @@
The description of the game is: {{ game.description }}
{% endif %} diff --git a/app/templates/games/list.html b/app/templates/games/list.html index 57ccb4e..9b1e5a6 100644 --- a/app/templates/games/list.html +++ b/app/templates/games/list.html @@ -16,7 +16,10 @@