From aaf0319151807627155c5bc57d790015915a3b1e Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 3 Aug 2024 15:42:19 +0200 Subject: [PATCH] Created boardgame DB classes for table creation --- db/database.db | Bin 0 -> 28672 bytes src/classes/boardgame_classes.py | 61 ++++++++++++++++--------------- src/main.py | 10 ++++- src/modules/bgg_connection.py | 9 +++-- src/modules/data_connection.py | 8 +++- src/modules/db_connection.py | 12 ++++++ tests/test_main.py | 2 - 7 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 db/database.db diff --git a/db/database.db b/db/database.db new file mode 100644 index 0000000000000000000000000000000000000000..2fe4b571c8d141baf276e855e861d4296ceb1952 GIT binary patch literal 28672 zcmeI#Z*S5-90%}r1L}wxpY@U1JurqQ>VhVFG9Os6Od^8o&}5IAgWlj0`p33p!zVr% zD!v$BitouQfo2Wu5|qTH`8FY=z3Z|2{J!nwPEXoAV&vQl92$`q(gR7BrB{SVl2j2N zMSNCAd|q0eh`;i+?|EM<(z7rAJ<(d(`6b~?y2bNljs?hdVpi+N`L$a0XIJBg9RbTbE7`C5L!y?{s4%w9Zu zib*vs@pj6*F`D{GfojhWwN#Nln63A^c}CtDXQak$EiPQMYZ|TNPJFGF8eSu&(KJk> z(=bj+lBdOeRqfm3vZ5Xx$v+2+*m)N&vy(o_FgceislerQLfS-eoPSN52-$#HJ{5Ut zw!6A`Uavi~bntn?Lmoe~mQBTy_a=S~tn~<(ZJh_6llkP{_MpxVONv^r%X4)R)b)(6 zUn!^Jx!#UsZX=nuJvdiicNO*EK>qPGdtqI@$CG@NQn6WUMryW^nicC`t)3gLja6+{ z-%(UeljjdJ*0}VlwVSGax($WjM&bY0LbhRMu5?*Z_xI)RC+X!Tc}wi1l9F6TNVXA@ zoHb>`8peBbvFXPF0SG_<0uX=z1Rwwb2tWV=5P(2|1+f1waB(p;2tWV=5P$##AOHaf zKmY;|fWT4!`+r0M0uX=z1Rwwb2tWV=5P$##AW(b(?Ei~jW6Tf&5P$##AOHafKmY;| zfB*y_fc-x*009U<00Izz00bZa0SG_<0uU&^0QUdIuQ6r_0SG_<0uX=z1Rwwb2tWV= G5cmU%h!SQ1 literal 0 HcmV?d00001 diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index b951c32..33b8048 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -1,7 +1,7 @@ -from pydantic import BaseModel, HttpUrl from datetime import date from enum import Enum -from sqlmodel import Field, SQLModel, Column, JSON +from sqlmodel import Field, SQLModel + class BoardgameType(Enum): BOARDGAME = 'boardgame' @@ -12,24 +12,7 @@ class BoardgameType(Enum): WISHLISTBOARDGAMEEXPANSION = 'wishlistboardgameexpansion' -class BoardGame(BaseModel): - id: int - name: str - description: str - image_url : HttpUrl - thumbnail_url : HttpUrl - year_published: int - min_players: int - max_players: int - min_playing_time: int - max_playing_time: int - min_age: int - all_expansion_ids: list[int] - type: BoardgameType = BoardgameType.BOARDGAME - - -class BoardGameTable(SQLModel, table=True): - id: int = Field(primary_key=True) +class BoardGameBase(SQLModel): name: str description: str image_url : str @@ -40,25 +23,43 @@ class BoardGameTable(SQLModel, table=True): min_playing_time: int max_playing_time: int min_age: int - all_expansion_ids: list[int] = Field(sa_column=Column(JSON)) - type: BoardgameType = BoardgameType.BOARDGAME + model_config = { + 'validate_assignment':True + } -class BoardGameExpansion(BoardGame): - type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION - -class OwnedBoardGame(BoardGame): +class OwnedBoardGameBase(BoardGameBase): price_paid: float acquisition_date: date acquired_from: str + +class WishlistBoardGameBase(BoardGameBase): + wishlist_priority: int + + +class BoardGame(BoardGameBase, table=True): + id: int = Field(primary_key=True) + type: BoardgameType = BoardgameType.BOARDGAME + +class BoardGameExpansion(BoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") + type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION + +class OwnedBoardGame(OwnedBoardGameBase, table=True): + id: int = Field(primary_key=True) type: BoardgameType = BoardgameType.OWNEDBOARDGAME -class OwnedBoardGameExpansion(OwnedBoardGame): +class OwnedBoardGameExpansion(OwnedBoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") type: BoardgameType = BoardgameType.OWNEDBOARDGAMEEXPANSION -class WishlistBoardGame(BoardGame): - wishlist_priority: int +class WishlistBoardGame(WishlistBoardGameBase, table=True): + id: int = Field(primary_key=True) type: BoardgameType = BoardgameType.WISHLISTBOARDGAME -class WishlistBoardGameExpansion(WishlistBoardGame): +class WishlistBoardGameExpansion(WishlistBoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") type: BoardgameType = BoardgameType.WISHLISTBOARDGAMEEXPANSION \ No newline at end of file diff --git a/src/main.py b/src/main.py index d470b01..18aed15 100644 --- a/src/main.py +++ b/src/main.py @@ -1,11 +1,17 @@ -from typing import Union from fastapi import FastAPI +from contextlib import asynccontextmanager from src.classes import boardgame_classes, play_classes from src.modules import data_connection -app = FastAPI() +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + data_connection.create_db_and_tables() + yield + # Shutdown +app = FastAPI(lifespan=lifespan) @app.get("/") def read_root(): diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 238bf59..ebb5933 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -80,14 +80,15 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa "max_players" : int(boardgame_xml.find('maxplayers').get('value')), "min_playing_time" : int(boardgame_xml.find('minplaytime').get('value')), "max_playing_time" : int(boardgame_xml.find('maxplaytime').get('value')), - "min_age" : int(boardgame_xml.find('minage').get('value')), - "all_expansion_ids" : expansion_ids + "min_age" : int(boardgame_xml.find('minage').get('value')) } match boardgame_type: case "boardgame": boardgame = boardgame_classes.BoardGame(**boardgame_dict) case "boardgameexpansion": + expansion_for = expansion_ids[0] + boardgame_dict['expansion_for'] = expansion_for boardgame = boardgame_classes.BoardGameExpansion(**boardgame_dict) @@ -132,7 +133,6 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl "min_playing_time" : boardgame_extra_info.min_playing_time, "max_playing_time" : boardgame_extra_info.max_playing_time, "min_age" : boardgame_extra_info.min_age, - "all_expansion_ids" : boardgame_extra_info.all_expansion_ids, **owned_boardgame_dict } @@ -140,6 +140,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl case "boardgame": boardgame = boardgame_classes.OwnedBoardGame(**boardgame_dict) case "boardgameexpansion": + boardgame_dict['expansion_for'] = boardgame_extra_info.expansion_for boardgame = boardgame_classes.OwnedBoardGameExpansion(**boardgame_dict) @@ -168,7 +169,6 @@ def convert_collection_xml_to_wishlist_boardgame(boardgame_extra_info: boardgame "min_playing_time" : boardgame_extra_info.min_playing_time, "max_playing_time" : boardgame_extra_info.max_playing_time, "min_age" : boardgame_extra_info.min_age, - "all_expansion_ids" : boardgame_extra_info.all_expansion_ids, **wishlist_boardgame_dict } @@ -176,6 +176,7 @@ def convert_collection_xml_to_wishlist_boardgame(boardgame_extra_info: boardgame case "boardgame": boardgame = boardgame_classes.WishlistBoardGame(**boardgame_dict) case "boardgameexpansion": + boardgame_dict['expansion_for'] = boardgame_extra_info.expansion_for boardgame = boardgame_classes.WishlistBoardGameExpansion(**boardgame_dict) diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 543d841..4b2a700 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -1,4 +1,4 @@ -from src.modules import bgg_connection +from src.modules import bgg_connection, db_connection from src.classes import boardgame_classes, play_classes @@ -19,4 +19,8 @@ def get_user_wishlist_collection() -> list[boardgame_classes.BoardGame]: return bgg_connection.get_user_wishlist_collection() def get_plays() -> list[play_classes.Play]: - return bgg_connection.get_plays() \ No newline at end of file + return bgg_connection.get_plays() + + +def create_db_and_tables(): + db_connection.create_db_and_tables() \ No newline at end of file diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index e69de29..a99a90b 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -0,0 +1,12 @@ +from sqlmodel import create_engine, SQLModel +from src.config import definitions + +sqlite_url = definitions.SQLITE_URL + + +connect_args = {"check_same_thread": False} +engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) + + +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) \ No newline at end of file diff --git a/tests/test_main.py b/tests/test_main.py index 93fd9fd..a584979 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -20,8 +20,6 @@ def default_boardgame_test(to_test_boardgame: boardgame_classes.BoardGame): assert type(to_test_boardgame.min_playing_time) == int assert type(to_test_boardgame.max_playing_time) == int assert type(to_test_boardgame.min_age) == int - assert type(to_test_boardgame.all_expansion_ids) == list - assert type(to_test_boardgame.all_expansion_ids[0]) == int assert type(to_test_boardgame.type) == boardgame_classes.BoardgameType