From 259f82fa8d7a2fa6923deba63353b26d29e049ba Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Tue, 13 Aug 2024 10:35:25 +0200 Subject: [PATCH] Fixed plays not containing expanions --- src/classes/boardgame_classes.py | 8 ++++---- src/classes/play_classes.py | 4 ++-- src/filters/play_filters.py | 4 ++-- src/main.py | 10 +++++++--- src/modules/bgg_connection.py | 7 ++++++- src/modules/data_connection.py | 5 +++-- src/modules/db_connection.py | 24 ++++++++++++------------ 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index 5c65215..6d12c60 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -45,18 +45,18 @@ class BoardGame(BoardGameBase, table=True): class BoardGameNoPlays(BoardGameBase): id: int - type: BoardgameType + 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 - plays: list["Play"] = Relationship(back_populates='expansion') + plays: list["Play"] = Relationship(back_populates='boardgameexpansion') class BoardGameExpansionNoPlays(BoardGameBase): id: int expansion_for: int - type: BoardgameType + type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION class OwnedBoardGame(OwnedBoardGameBase, table=True): id: int = Field(primary_key=True) @@ -81,4 +81,4 @@ class WishlistBoardGameExpansion(WishlistBoardGameBase, table=True): from src.classes.play_classes import Play, PlayPublic BoardGame.model_rebuild() -BoardGameNoPlays.model_rebuild() \ No newline at end of file +BoardGameExpansion.model_rebuild() \ No newline at end of file diff --git a/src/classes/play_classes.py b/src/classes/play_classes.py index e967a57..7d42b00 100644 --- a/src/classes/play_classes.py +++ b/src/classes/play_classes.py @@ -38,7 +38,7 @@ class Play(PlayBase, table=True): players: list[PlayPlayer] = Relationship(back_populates="play") boardgame: Union["BoardGame", None] = Relationship(back_populates="plays") - expansion: Union["BoardGameExpansion", None] = Relationship(back_populates="plays") + boardgameexpansion: Union["BoardGameExpansion", None] = Relationship(back_populates="plays") model_config = { 'validate_assignment':True @@ -51,7 +51,7 @@ class PlayPublic(PlayBase): class PlayPublicWithPlayers(PlayPublic): players: list[PlayPlayerPublic] = [] boardgame: Union["BoardGameNoPlays", None] - expansion: Union["BoardGameExpansionNoPlays", None] + boardgameexpansion: Union["BoardGameExpansionNoPlays", None] from src.classes.boardgame_classes import BoardGame, BoardGameExpansion, BoardGameNoPlays, BoardGameExpansionNoPlays diff --git a/src/filters/play_filters.py b/src/filters/play_filters.py index 2253136..ed1f4f6 100644 --- a/src/filters/play_filters.py +++ b/src/filters/play_filters.py @@ -2,8 +2,8 @@ from src.classes import play_classes, boardgame_classes def filter_out_expansion_plays(play_list: list[play_classes.Play]): to_return_plays = [] - - to_return_plays = list(filter(lambda x: x.expansion == None, play_list)) + + to_return_plays = list(filter(lambda x: x.expansion_id == None, play_list)) return to_return_plays diff --git a/src/main.py b/src/main.py index 590fa89..9de18f0 100644 --- a/src/main.py +++ b/src/main.py @@ -55,9 +55,9 @@ class ExpansionFilteringParams(BaseModel): def read_root(): return {"Hello": "World"} -@app.get("/boardgame", response_model=boardgame_classes.BoardGame) +@app.get("/boardgame", response_model=Union[boardgame_classes.BoardGame, boardgame_classes.BoardGameExpansion]) def get_boardgame_by_id(id: int, session: Session = Depends(get_db_session)): - requested_boardgame: boardgame_classes.BoardGame = data_connection.get_boardgame(session, boardgame_classes.BoardGame, id) + requested_boardgame: Union[boardgame_classes.BoardGame, boardgame_classes.BoardGameExpansion] = data_connection.get_boardgame(session, boardgame_classes.BoardGame, id) return requested_boardgame @app.get("/owned", response_model=list[Union[boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion]]) @@ -83,7 +83,7 @@ def get_plays(boardgame_id: int = -1, session: Session = Depends(get_db_session) requested_plays = data_connection.get_plays(session) - requested_plays = play_filters.filter_out_expansion_plays(requested_plays) + #requested_plays = play_filters.filter_out_expansion_plays(requested_plays) if boardgame_id > -1: requested_plays = play_filters.filter_only_specific_boardgame(boardgame_id, requested_plays) @@ -150,6 +150,10 @@ def get_amount_of_games_played_per_year(query: ExpansionFilteringParams = Depend all_plays.sort(key= lambda x: x.play_date) + if query.filter_expansions_out: + all_plays = play_filters.filter_out_expansion_plays(all_plays) + + all_played_boardgame_ids = [] for play in all_plays: diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 05b3530..b52aad0 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -199,8 +199,13 @@ def convert_play_xml_to_play(play_xml: ET.Element) -> play_classes.Play: for play_player_xml in play_xml.find('players'): playplayer_list.append(convert_playplayer_xml_to_playplayer(play_player_xml)) + id_key = "boardgame_id" + for subtype in play_xml.find('item').find('subtypes'): + if subtype.get('value') == 'boardgameexpansion': + id_key = "expansion_id" + play_dict = { - "boardgame_id" : int(play_xml.find('item').get('objectid')), + id_key : int(play_xml.find('item').get('objectid')), "players" : playplayer_list, "play_date" : play_date, "duration" : int(play_xml.get('length')), diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 3c94bb1..7163678 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -10,7 +10,7 @@ def get_db_session(): def get_boardgame(session: Session, boardgame_type: SQLModel, boardgame_id: int) -> boardgame_classes.BoardGame: #Will check if it already exists in db, then it will get it from there - boardgame_in_db = db_connection.get_boardgame(session, boardgame_type, boardgame_id=boardgame_id) + boardgame_in_db = db_connection.get_boardgame(session, boardgame_id=boardgame_id) to_return_boardgame = None @@ -18,8 +18,9 @@ def get_boardgame(session: Session, boardgame_type: SQLModel, boardgame_id: int) to_return_boardgame = boardgame_in_db else: to_return_boardgame = bgg_connection.get_boardgame(boardgame_id) + print(type(to_return_boardgame)) db_connection.add_boardgame(session, to_return_boardgame) - to_return_boardgame = db_connection.get_boardgame(session, boardgame_type, boardgame_id) + to_return_boardgame = db_connection.get_boardgame(session, boardgame_id) return to_return_boardgame diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 9151d11..93f5acd 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -43,28 +43,28 @@ def add_multiple_boardgames(session: Session, boardgame_list: list[Union[ session.commit() -def get_boardgame(session: Session, boardgame_type: SQLModel, boardgame_id: int) -> Union[ - boardgame_classes.BoardGame, boardgame_classes.BoardGameExpansion, - boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion, - boardgame_classes.WishlistBoardGame, boardgame_classes.WishlistBoardGameExpansion]: +def get_boardgame(session: Session, boardgame_id: int) -> Union[ + boardgame_classes.BoardGame, boardgame_classes.BoardGameExpansion]: - statement = select(boardgame_type).where(boardgame_type.id == boardgame_id) - results = session.exec(statement) + statement = select(boardgame_classes.BoardGame) + + base_boardgames = session.exec(statement).all() - returned_boardgames = results.all() + statement = select(boardgame_classes.BoardGameExpansion) + + expansion_boardgames = session.exec(statement).all() + + returned_boardgames = base_boardgames + expansion_boardgames if len(returned_boardgames) == 0: boardgame = None else: - boardgame = returned_boardgames[0] + boardgame = list(filter(lambda boardgame: boardgame.id == boardgame_id, returned_boardgames))[0] - print(boardgame) return boardgame def get_multiple_boardgames(session: Session, boardgame_type: SQLModel, boardgame_ids: list[int]) -> Union[ - list[boardgame_classes.BoardGame], list[boardgame_classes.BoardGameExpansion], - list[boardgame_classes.OwnedBoardGame], list[boardgame_classes.OwnedBoardGameExpansion], - list[boardgame_classes.WishlistBoardGame], list[boardgame_classes.WishlistBoardGameExpansion]]: + list[boardgame_classes.BoardGame], list[boardgame_classes.BoardGameExpansion]]: statement = select(boardgame_type).where(boardgame_type.id.in_(boardgame_ids)) results = session.exec(statement)