From 51cd2dda07e54dbef5e975d42734459023e139dc Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 22 Aug 2024 09:55:31 +0200 Subject: [PATCH] Made plays work with refactored changes --- src/classes/boardgame_classes.py | 13 ++++++++++-- src/classes/play_classes.py | 23 ++++++++++----------- src/filters/play_filters.py | 2 +- src/main.py | 14 ++++++------- src/modules/bgg_connection.py | 34 +++++++++++++++++++------------- src/modules/data_connection.py | 5 ++--- src/modules/db_connection.py | 7 ------- 7 files changed, 51 insertions(+), 47 deletions(-) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index d48063e..fb0ac91 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -43,7 +43,6 @@ class BoardGameBase(SQLModel): class BoardGame(BoardGameBase, table=True): id: int = Field(primary_key=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") @@ -52,6 +51,8 @@ class BoardGame(BoardGameBase, table=True): wishlist_info: Optional["WishlistInfo"] = Relationship(back_populates="boardgame") + plays: list["Play"] = Relationship(back_populates='boardgame') + model_config = { 'arbitrary_types_allowed':True } @@ -62,6 +63,14 @@ class BoardGamePublic(BoardGameBase): expansion_info: Optional["ExpansionInfoPublicNoGame"] owned_info: Optional["OwnedInfoPublicNoGame"] wishlist_info: Optional["WishlistInfoPublicNoGame"] + plays: list["PlayPublicNoGame"] + +class BoardGamePublicNoPlays(BoardGameBase): + id: int + designers: list["DesignerPublicNoGames"] + expansion_info: Optional["ExpansionInfoPublicNoGame"] + owned_info: Optional["OwnedInfoPublicNoGame"] + wishlist_info: Optional["WishlistInfoPublicNoGame"] class ExpansionInfo(SQLModel, table=True): @@ -172,7 +181,7 @@ class WishlistInfoPublicNoGame(SQLModel): -from src.classes.play_classes import Play, PlayPublic +from src.classes.play_classes import Play, PlayPublicNoGame from src.classes.people_classes import Designer, DesignerPublicNoGames BoardGame.model_rebuild() # BoardGameExpansion.model_rebuild() diff --git a/src/classes/play_classes.py b/src/classes/play_classes.py index ab50aef..eec68c3 100644 --- a/src/classes/play_classes.py +++ b/src/classes/play_classes.py @@ -8,13 +8,13 @@ class PlayPlayerBase(SQLModel): score: Union[float, None] first_play : bool has_won : bool - #play_id : int = Field(default=None, foreign_key="play.id") + play_id : int = Field(default=None, foreign_key="play.id") class PlayPlayer(PlayPlayerBase, table=True): id: int | None = Field(default=None, primary_key=True) - #play: "Play" = Relationship(back_populates="players") + play: "Play" = Relationship(back_populates="players") class PlayPlayerPublic(PlayPlayerBase): id: int @@ -25,8 +25,7 @@ class PlayPlayerPublicWithPlay(PlayPlayerPublic): class PlayBase(SQLModel): - #boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id") - #expansion_id: int | None = Field(default=None, foreign_key="boardgameexpansion.id") + boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id") play_date: date duration: int #In minutes ignore_for_stats : bool @@ -36,25 +35,23 @@ class PlayBase(SQLModel): class Play(PlayBase, table=True): id: int | None = Field(default=None, primary_key=True) - #players: list[PlayPlayer] = Relationship(back_populates="play") - #boardgame: Union["BoardGame", None] = Relationship(back_populates="plays") - #boardgameexpansion: Union["BoardGameExpansion", None] = Relationship(back_populates="plays") + players: list[PlayPlayer] = Relationship(back_populates="play") + boardgame: "BoardGame" = Relationship(back_populates="plays") model_config = { 'validate_assignment':True } class PlayPublic(PlayBase): - id: int + players: list[PlayPlayerPublic] + boardgame: "BoardGamePublicNoPlays" -# class PlayPublicWithPlayers(PlayPublic): -# players: list[PlayPlayerPublic] = [] -# boardgame: Union["BoardGameNoPlays", None] -# boardgameexpansion: Union["BoardGameExpansionNoPlays", None] +class PlayPublicNoGame(PlayPublic): + players: list[PlayPlayerPublic] = [] -from src.classes.boardgame_classes import BoardGame#, BoardGameExpansion, BoardGameNoPlays, BoardGameExpansionNoPlays +from src.classes.boardgame_classes import BoardGame, BoardGamePublicNoPlays from src.classes.people_classes import Designer Play.model_rebuild() # PlayPublicWithPlayers.model_rebuild() \ No newline at end of file diff --git a/src/filters/play_filters.py b/src/filters/play_filters.py index 2791b48..858c6d2 100644 --- a/src/filters/play_filters.py +++ b/src/filters/play_filters.py @@ -16,4 +16,4 @@ def filter_non_expansions_out(play_list: list[play_classes.Play]): def filter_only_specific_boardgame(boardgame_id: int, play_list: list[play_classes.Play]): - return list(filter(lambda x: x.boardgame_id == boardgame_id or x.expansion_id == boardgame_id, play_list)) \ No newline at end of file + return list(filter(lambda x: x.boardgame_id == boardgame_id, play_list)) \ No newline at end of file diff --git a/src/main.py b/src/main.py index 3b8b93b..ed07dff 100644 --- a/src/main.py +++ b/src/main.py @@ -140,17 +140,17 @@ def get_wishlist_collection(priority: int = 0, query: BoardgameFilterParams = De return to_return_boardgames -# @app.get("/plays", response_model=list[play_classes.PlayPublicWithPlayers]) -# def get_plays(query: PlayFilterParams = Depends(), boardgame_id: int = -1, session: Session = Depends(get_session)): +@app.get("/plays", response_model=list[play_classes.PlayPublic]) +def get_plays(query: PlayFilterParams = Depends(), boardgame_id: int = -1, session: Session = Depends(get_session)): -# requested_plays = data_connection.get_plays(session) + requested_plays = data_connection.get_plays(session) -# requested_plays = query.do_filtering(requested_plays) + requested_plays = query.do_filtering(requested_plays) -# if boardgame_id > -1: -# requested_plays = play_filters.filter_only_specific_boardgame(boardgame_id, requested_plays) + if boardgame_id > -1: + requested_plays = play_filters.filter_only_specific_boardgame(boardgame_id, requested_plays) -# return requested_plays + return requested_plays @app.get('/players', response_model=list[play_classes.PlayPlayerPublic]) diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 0d9edfb..0e524fa 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -224,13 +224,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" + # id_key = "boardgame_id" + # for subtype in play_xml.find('item').find('subtypes'): + # if subtype.get('value') == 'boardgameexpansion': + # id_key = "expansion_id" play_dict = { - id_key : int(play_xml.find('item').get('objectid')), + "boardgame_id" : int(play_xml.find('item').get('objectid')), "players" : playplayer_list, "play_date" : play_date, "duration" : int(play_xml.get('length')), @@ -330,15 +330,21 @@ def get_plays() -> list[play_classes.Play]: all_plays : list[play_classes.Play] = [] - for page in tqdm( - range(amount_of_pages_needed), - desc="Getting plays from BGG", - unit="requests"): - url = 'https://boardgamegeek.com/xmlapi2/plays?username={}&page={}'.format(auth_manager.username, page + 1) - plays_page_xml_object = url_to_xml_object(url) - for play_xml in plays_page_xml_object: - new_play = convert_play_xml_to_play(play_xml) - all_plays.append(new_play) + # for page in tqdm( + # range(amount_of_pages_needed), + # desc="Getting plays from BGG", + # unit="requests"): + # url = 'https://boardgamegeek.com/xmlapi2/plays?username={}&page={}'.format(auth_manager.username, page + 1) + # plays_page_xml_object = url_to_xml_object(url) + # for play_xml in plays_page_xml_object: + # new_play = convert_play_xml_to_play(play_xml) + # all_plays.append(new_play) + + url = 'https://boardgamegeek.com/xmlapi2/plays?username={}&page=1'.format(auth_manager.username) + plays_page_xml_object = url_to_xml_object(url) + for play_xml in plays_page_xml_object: + new_play = convert_play_xml_to_play(play_xml) + all_plays.append(new_play) return all_plays diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 63d97f0..438eef1 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -96,15 +96,14 @@ def get_plays(session: Session) -> list[play_classes.Play]: #Making sure all played board games are in table 'boardgames' #list + set to remove duplicates played_boardgame_ids = list(set([play.boardgame_id for play in plays_from_db])) - played_expansion_ids = list(set([play.expansion_id for play in plays_from_db])) #Remove None's (played board games don't have expansion id and vice versa) played_boardgame_ids = list(filter(lambda x: x != None, played_boardgame_ids)) - played_expansion_ids = list(filter(lambda x: x != None, played_expansion_ids)) assert len(list(filter(lambda x: x == None, played_boardgame_ids))) == 0, plays_from_db - #get_multiple_boardgames(session, played_boardgame_ids + played_expansion_ids) + #Make sure to add all board games that are played + get_multiple_boardgames(session, played_boardgame_ids) return plays_from_db diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 19e49c1..4d759d6 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -107,13 +107,6 @@ def get_multiple_boardgames(session: Session, boardgame_ids: list[int]) -> tuple boardgames = results.all() - statement = select(boardgame_classes.BoardGameExpansion).where(boardgame_classes.BoardGameExpansion.id.in_(boardgame_ids)) - results = session.exec(statement) - - expansions = results.all() - - boardgames += expansions - missing_boardgame_ids = list(filter(lambda x: x not in [boardgame.id for boardgame in boardgames], boardgame_ids)) return boardgames, missing_boardgame_ids