From 8241635e692f5ebd2255d9cf2cabf5ce8e4e8534 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 22 Aug 2024 09:18:18 +0200 Subject: [PATCH] Made Owned collection work with refactoring --- src/classes/boardgame_classes.py | 25 ++++++++++++-------- src/classes/people_classes.py | 9 +++++++- src/main.py | 13 +++++++---- src/modules/bgg_connection.py | 39 ++++++++++++++++++-------------- src/modules/data_connection.py | 19 ++++++++-------- src/modules/db_connection.py | 19 ++++++++++++++-- 6 files changed, 82 insertions(+), 42 deletions(-) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index c574f08..83493bf 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -45,8 +45,11 @@ class BoardGame(BoardGameBase, table=True): type: BoardgameType = BoardgameType.BOARDGAME #plays: list["Play"] = Relationship(back_populates='boardgame') designers: list["Designer"] = Relationship(back_populates="designed_boardgames", link_model=many_to_many_links.DesignerBoardGameLink) + expansion_info: Optional["ExpansionInfo"] = Relationship(back_populates="boardgame") + owned_info: Optional["OwnedInfo"] = Relationship(back_populates="boardgame") + wishlist_info: Optional["WishlistInfo"] = Relationship(back_populates="boardgame") model_config = { @@ -55,15 +58,17 @@ class BoardGame(BoardGameBase, table=True): class BoardGamePublic(BoardGameBase): id: int - designers: list["Designer"] + designers: list["DesignerPublicNoGames"] expansion_info: Optional["ExpansionInfo"] owned_info: Optional["OwnedInfo"] wishlist_info: Optional["WishlistInfo"] -class ExpansionInfo(BoardGameBase, table=True): +class ExpansionInfo(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) - boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id") + expansion_for: int + + boardgame_id: int = Field(default=None, foreign_key="boardgame.id") boardgame: BoardGame = Relationship( #for one-on-one relationship sa_relationship_kwargs={'uselist': False}, @@ -73,25 +78,27 @@ class ExpansionInfo(BoardGameBase, table=True): class OwnedInfo(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) - boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id") + price_paid: float + acquisition_date: date + acquired_from: str + + boardgame_id: int = Field(default=None, foreign_key="boardgame.id") boardgame: BoardGame = Relationship( #for one-on-one relationship sa_relationship_kwargs={'uselist': False}, back_populates="owned_info" ) - price_paid: float - acquisition_date: date - acquired_from: str class WishlistInfo(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) + wishlist_priority: int + boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id") boardgame: BoardGame = Relationship( #for one-on-one relationship sa_relationship_kwargs={'uselist': False}, back_populates="wishlist_info" ) - wishlist_priority: int # class BoardGamePublic(BoardGameBase): @@ -141,7 +148,7 @@ class WishlistInfo(SQLModel, table=True): from src.classes.play_classes import Play, PlayPublic -from src.classes.people_classes import Designer +from src.classes.people_classes import Designer, DesignerPublicNoGames BoardGame.model_rebuild() # BoardGameExpansion.model_rebuild() # BoardGameNoPlays.model_rebuild() diff --git a/src/classes/people_classes.py b/src/classes/people_classes.py index db53dc0..f5450fd 100644 --- a/src/classes/people_classes.py +++ b/src/classes/people_classes.py @@ -6,4 +6,11 @@ class Designer(SQLModel, table=True): id: int = Field(primary_key=True) name: str designed_boardgames: list[boardgame_classes.BoardGame] | None = Relationship(back_populates="designers", link_model=many_to_many_links.DesignerBoardGameLink) - # designed_expansions: list[boardgame_classes.BoardGameExpansion] | None = Relationship(back_populates="designers", link_model=many_to_many_links.DesignerBoardGameExpansionLink) \ No newline at end of file + # designed_expansions: list[boardgame_classes.BoardGameExpansion] | None = Relationship(back_populates="designers", link_model=many_to_many_links.DesignerBoardGameExpansionLink) + +class DesignerPublic(SQLModel): + name: str + designed_boardgames: list[boardgame_classes.BoardGamePublic] + +class DesignerPublicNoGames(SQLModel): + name: str \ No newline at end of file diff --git a/src/main.py b/src/main.py index 8ff937a..3b8b93b 100644 --- a/src/main.py +++ b/src/main.py @@ -8,7 +8,7 @@ from fastapi import FastAPI, Depends from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager -from src.classes import boardgame_classes, play_classes, statistic_classes +from src.classes import boardgame_classes, play_classes, statistic_classes, people_classes from src.modules import data_connection, statistic_creator from src.filters import boardgame_filters, play_filters @@ -103,7 +103,7 @@ def get_boardgame_by_id(id: int, session: Session = Depends(get_session)): requested_boardgame = data_connection.get_boardgame(session, id) return requested_boardgame -@app.get("/owned", response_model=list[boardgame_classes.BoardGame]) +@app.get("/owned", response_model=list[boardgame_classes.BoardGamePublic]) def get_owned_collection(query: BoardgameFilterParams = Depends(), session: Session = Depends(get_session)): to_return_boardgames = data_connection.get_user_owned_collection(session) @@ -113,7 +113,7 @@ def get_owned_collection(query: BoardgameFilterParams = Depends(), session: Sess return to_return_boardgames -@app.get('/collection', response_model=list[boardgame_classes.BoardGame]) +@app.get('/collection', response_model=list[boardgame_classes.BoardGamePublic]) def get_collection(query: BoardgameFilterParams = Depends(), session: Session = Depends(get_session)): to_return_boardgames = data_connection.get_user_collection(session) @@ -123,7 +123,12 @@ def get_collection(query: BoardgameFilterParams = Depends(), session: Session = return to_return_boardgames -@app.get("/wishlist", response_model=list[boardgame_classes.BoardGame]) +@app.get('/designers', response_model=list[people_classes.DesignerPublic]) +def get_designers(session: Session = Depends(get_session)): + to_return_designers = data_connection.get_designers(session) + return to_return_designers + +@app.get("/wishlist", response_model=list[boardgame_classes.BoardGamePublic]) def get_wishlist_collection(priority: int = 0, query: BoardgameFilterParams = Depends(), session: Session = Depends(get_session)): to_return_boardgames = data_connection.get_user_wishlist_collection(session, priority) diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 16c467b..07a53ef 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -9,10 +9,8 @@ from typing import Union import html from tqdm import tqdm -from sqlmodel import Session, select - from src.classes import boardgame_classes, play_classes, people_classes -from src.modules import auth_manager, data_connection +from src.modules import auth_manager from src.config import definitions @@ -110,14 +108,15 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa "designers" : designers } - 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) + boardgame = boardgame_classes.BoardGame(**boardgame_dict) + if boardgame_type == "boardgameexpansion": + expansion_boardgame_dict = { + "boardgame_id" : boardgame_dict['id'], + "expansion_for" : expansion_ids[0] + } + expansion_info = boardgame_classes.ExpansionInfo.model_validate(expansion_boardgame_dict) + boardgame.expansion_info = expansion_info return boardgame @@ -143,6 +142,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl acquired_from = collection_boardgame_xml.find('privateinfo').get('acquiredfrom') owned_boardgame_dict = { + "boardgame_id" : boardgame_extra_info.id, "price_paid" : price_paid, "acquisition_date" : acquisition_date, "acquired_from" : acquired_from @@ -153,14 +153,19 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl **owned_boardgame_dict } - match boardgame_type: - 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) + owned_info = boardgame_classes.OwnedInfo.model_validate(owned_boardgame_dict) - + boardgame_extra_info.owned_info = owned_info + + # if boardgame_type == "boardgameexpansion": + # expansion_boardgame_dict = { + # "boardgame_id" : boardgame_extra_info.id, + # "expansion_for" : boardgame_extra_info.expansion_for + # } + # expansion_info = boardgame_classes.ExpansionInfo.model_validate(expansion_boardgame_dict) + # boardgame_extra_info.expansion_info = expansion_info + + boardgame = boardgame_extra_info return boardgame diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index c1943df..9c1c0f3 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -5,7 +5,7 @@ from threading import Lock critical_function_lock = Lock() from src.modules import bgg_connection, db_connection -from src.classes import boardgame_classes, play_classes +from src.classes import boardgame_classes, play_classes, people_classes def get_db_engine(): return db_connection.get_engine() @@ -53,20 +53,17 @@ def get_user_collection(session: Session) -> list[boardgame_classes.BoardGame]: return boardgames_from_db # + boardgame_expansions_from_db -def get_user_owned_collection(session: Session, ) -> list[boardgame_classes.BoardGame]: +def get_user_owned_collection(session: Session) -> list[boardgame_classes.BoardGame]: - owned_boardgames_from_db: list[boardgame_classes.BoardGame] = db_connection.get_all_boardgames(session, boardgame_classes.OwnedBoardGame) - owned_boardgame_expanions_from_db: list[boardgame_classes.BoardGame] = db_connection.get_all_boardgames(session, boardgame_classes.BoardGame) + owned_boardgames_from_db = db_connection.get_owned_boardgames(session) - if len(owned_boardgames_from_db) == 0 and len(owned_boardgame_expanions_from_db) == 0: + if len(owned_boardgames_from_db) == 0: owned_boardgames = bgg_connection.get_user_owned_collection() db_connection.add_multiple_boardgames(session, owned_boardgames) - owned_boardgames_from_db: list[boardgame_classes.OwnedBoardGame] = db_connection.get_all_boardgames(session, boardgame_classes.OwnedBoardGame) - owned_boardgame_expanions_from_db: list[boardgame_classes.BoardGame] = db_connection.get_all_boardgames(session, boardgame_classes.BoardGame) + owned_boardgames_from_db: list[boardgame_classes.BoardGame] = db_connection.get_owned_boardgames(session) - - return owned_boardgames_from_db + owned_boardgame_expanions_from_db + return owned_boardgames_from_db @@ -126,6 +123,10 @@ def get_players_from_play(session: Session, play_id: int) -> list[play_classes.P return players_from_db +def get_designers(session: Session) -> list[people_classes.Designer]: + designers_from_db = db_connection.get_all_designers(session) + return designers_from_db + def delete_database(): db_connection.delete_database() diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index ecee1ab..48c8c5e 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -11,7 +11,7 @@ sqlite_url = definitions.SQLITE_URL connect_args = {"check_same_thread": False} -engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) +engine = create_engine(sqlite_url, echo=False, connect_args=connect_args) def get_engine(): return engine @@ -45,7 +45,7 @@ def add_multiple_boardgames(session: Session, boardgame_list: list[boardgame_cla if designer_in_db != None: boardgame_list[boardgame_index].designers[designer_index] = designer_in_db - statement = select(boardgame_list[boardgame_index].__class__).where(boardgame_list[boardgame_index].__class__.id == boardgame_list[boardgame_index].id) + statement = select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame_list[boardgame_index].id) is_boardgame_present = len(session.exec(statement).all()) != 0 if not is_boardgame_present: @@ -79,6 +79,12 @@ def get_multiple_designers(session: Session, designer_ids: list[int]) -> list[pe return designers, missing_designer_ids +def get_all_designers(session: Session) -> list[people_classes.Designer]: + statement = statement = select(people_classes.Designer) + results = session.exec(statement) + designers = results.all() + return designers + def get_boardgame(session: Session, boardgame_id: int) -> boardgame_classes.BoardGame: statement = select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame_id) @@ -99,6 +105,7 @@ def get_boardgame(session: Session, boardgame_id: int) -> boardgame_classes.Boar return boardgame def get_multiple_boardgames(session: Session, boardgame_ids: list[int]) -> tuple[list[boardgame_classes.BoardGame], list[int]]: + statement = select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id.in_(boardgame_ids)) results = session.exec(statement) @@ -115,6 +122,14 @@ def get_multiple_boardgames(session: Session, boardgame_ids: list[int]) -> tuple return boardgames, missing_boardgame_ids +def get_owned_boardgames(session: Session) -> list[boardgame_classes.BoardGame]: + statement = select(boardgame_classes.OwnedInfo) + results = session.exec(statement) + + owned_boardgames = [owned_info.boardgame for owned_info in results.all()] + + return owned_boardgames + def get_all_boardgames(session: Session, boardgame_type: SQLModel) -> list[boardgame_classes.BoardGame]: statement = select(boardgame_type)