From 817f52b359c7521794b05523c019cc322f2fa09b Mon Sep 17 00:00:00 2001 From: Jack Jackson Date: Fri, 1 Mar 2024 23:08:46 -0800 Subject: [PATCH] Game views --- app/routers/games.py | 26 +++++++++++++++++++++++++- app/routers/seed.py | 33 +++++++++++++++++++++++++++++++++ app/sql/crud.py | 2 +- app/sql/schemas.py | 8 ++++---- app/templates/games/detail.html | 2 +- app/templates/games/list.html | 5 ++++- app/templates/seed.html | 8 ++++++++ requirements.txt | 1 + seed-data/games.csv | 2 ++ 9 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 seed-data/games.csv 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 @@

This is the page for game with id {{ game.id }}, played on date {{ game.date }}

- {% if deck.description %} + {% if game.description %}

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 @@ {{ game.date }} - {{ game.deck_id_1 }} + {{ game_names[game.id] | join(", ") }} + + + {{ decks_by_id[game.winning_deck_id].name }} {% endfor %} diff --git a/app/templates/seed.html b/app/templates/seed.html index 64426fa..e5120f1 100644 --- a/app/templates/seed.html +++ b/app/templates/seed.html @@ -24,4 +24,12 @@ Upload + +
+
+ + + Upload +
+
{% endblock %} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 86e3ebd..b340c49 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ sqlalchemy uvicorn Jinja2 pyyaml +PyFunctional diff --git a/seed-data/games.csv b/seed-data/games.csv new file mode 100644 index 0000000..6e43484 --- /dev/null +++ b/seed-data/games.csv @@ -0,0 +1,2 @@ +id,date,deck_id_1,deck_id_2,deck_id_3,deck_id_4,deck_id_5,deck_id_6,winning_deck_id,number_of_turns,first_player_out_turn,win_type_id,description +1,2024-01-13,1,2,3,4,,,2,15,12,1,3-4 board wipes; Biotransference