From 9cd614e3a0672728a9e3ad2cae821733635ccd8d Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sun, 25 Aug 2024 20:19:21 +0200 Subject: [PATCH] Added artists to boardgames --- src/classes/boardgame_classes.py | 5 ++++- src/classes/many_to_many_links.py | 6 +++++- src/classes/people_classes.py | 14 +++++++++++++- src/modules/bgg_connection.py | 9 ++++++++- src/modules/db_connection.py | 24 ++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index 84e300e..40484bb 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -35,6 +35,7 @@ class BoardGame(BoardGameBase, table=True): id: int = Field(primary_key=True) type: BoardgameType = BoardgameType.BOARDGAME designers: list["Designer"] = Relationship(back_populates="designed_boardgames", link_model=many_to_many_links.DesignerBoardGameLink) + artists: list["Artist"] = Relationship(back_populates="drawn_boardgames", link_model=many_to_many_links.ArtistBoardGameLink) expansion_info: Optional["ExpansionInfo"] = Relationship(back_populates="boardgame") @@ -51,6 +52,7 @@ class BoardGame(BoardGameBase, table=True): class BoardGamePublic(BoardGameBase): id: int designers: list["DesignerPublicNoGames"] + artists: list["ArtistPublicNoGames"] expansion_info: Optional["ExpansionInfoPublicNoGame"] owned_info: Optional["OwnedInfoPublicNoGame"] wishlist_info: Optional["WishlistInfoPublicNoGame"] @@ -59,6 +61,7 @@ class BoardGamePublic(BoardGameBase): class BoardGamePublicNoPlays(BoardGameBase): id: int designers: list["DesignerPublicNoGames"] + artists: list["ArtistPublicNoGames"] expansion_info: Optional["ExpansionInfoPublicNoGame"] owned_info: Optional["OwnedInfoPublicNoGame"] wishlist_info: Optional["WishlistInfoPublicNoGame"] @@ -127,5 +130,5 @@ class WishlistInfoPublicNoGame(SQLModel): from src.classes.play_classes import Play, PlayPublicNoGame -from src.classes.people_classes import Designer, DesignerPublicNoGames +from src.classes.people_classes import Designer, DesignerPublicNoGames, Artist, ArtistPublicNoGames BoardGame.model_rebuild() \ No newline at end of file diff --git a/src/classes/many_to_many_links.py b/src/classes/many_to_many_links.py index d731458..fad4bbc 100644 --- a/src/classes/many_to_many_links.py +++ b/src/classes/many_to_many_links.py @@ -3,4 +3,8 @@ from sqlmodel import Field,SQLModel class DesignerBoardGameLink(SQLModel, table=True): boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id", primary_key=True) designer_id: int | None = Field(default=None, foreign_key="designer.id", primary_key=True) - \ No newline at end of file + + +class ArtistBoardGameLink(SQLModel, table=True): + boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id", primary_key=True) + artist_id: int | None = Field(default=None, foreign_key="artist.id", primary_key=True) \ No newline at end of file diff --git a/src/classes/people_classes.py b/src/classes/people_classes.py index daefab6..2cae55d 100644 --- a/src/classes/people_classes.py +++ b/src/classes/people_classes.py @@ -6,11 +6,23 @@ 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) class DesignerPublic(SQLModel): name: str designed_boardgames: list[boardgame_classes.BoardGamePublicNoPlays] class DesignerPublicNoGames(SQLModel): + name: str + + +class Artist(SQLModel, table=True): + id: int = Field(primary_key=True) + name: str + drawn_boardgames: list[boardgame_classes.BoardGame] | None = Relationship(back_populates="artists", link_model=many_to_many_links.ArtistBoardGameLink) + +class ArtistPublic(SQLModel): + name: str + drawn_boardgames: list[boardgame_classes.BoardGamePublicNoPlays] + +class ArtistPublicNoGames(SQLModel): name: str \ No newline at end of file diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 2285bc1..41277f0 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -81,6 +81,7 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa all_links = boardgame_xml.findall('link') designers = [] + artists = [] for link in all_links: match link.get('type'): @@ -91,6 +92,11 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa designer_name = link.get('value') designer = people_classes.Designer(id=designer_id, name=designer_name) designers.append(designer) + case 'boardgameartist': + artist_id = int(link.get('id')) + artist_name = link.get('value') + artist = people_classes.Artist(id=artist_id, name=artist_name) + artists.append(artist) boardgame_dict = { "id" : int(boardgame_xml.get('id')), @@ -105,7 +111,8 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa "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')), - "designers" : designers + "designers" : designers, + "artists" : artists } boardgame = boardgame_classes.BoardGame(**boardgame_dict) diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 56a1f8d..c82dcfe 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -30,6 +30,12 @@ def add_boardgame(session: Session, boardgame: boardgame_classes.BoardGame): if designer_in_db != None: boardgame.designers[designer_index] = designer_in_db + boardgame_artists = boardgame.artists + for artist_index in range(len(boardgame_artists)): + artist_in_db = get_artist(session, boardgame_artists[artist_index].id) + if artist_in_db != None: + boardgame.artists[artist_index] = artist_in_db + is_boardgame_present = len(session.exec( select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame.id) ).all()) != 0 @@ -81,6 +87,12 @@ def upsert_multiple_boardgames(session: Session, boardgame_list: list[boardgame_ if designer_in_db != None: boardgame.designers[designer_index] = designer_in_db + boardgame_artists = boardgame.artists + for artist_index in range(len(boardgame_artists)): + artist_in_db = get_artist(session, boardgame_artists[artist_index].id) + if artist_in_db != None: + boardgame.artists[artist_index] = artist_in_db + session.add(boardgame) altered_boardgames.append(boardgame) @@ -107,6 +119,18 @@ def get_designer(session: Session, designer_id: int) -> people_classes.Designer: return designer +def get_artist(session: Session, artist_id: int) -> people_classes.Artist: + statement = select(people_classes.Artist).where(people_classes.Artist.id == artist_id) + + artist = session.exec(statement).all() + + if len(artist) == 0: + artist = None + else: + artist = artist[0] + + return artist + def get_multiple_designers(session: Session, designer_ids: list[int]) -> list[people_classes.Designer]: statement = select(people_classes.Designer).where(people_classes.Designer.id.in_(designer_ids)) results = session.exec(statement)