Added artists to boardgames

This commit is contained in:
Yarne Coppens 2024-08-25 20:19:21 +02:00
parent 1234579701
commit 9cd614e3a0
5 changed files with 54 additions and 4 deletions

View file

@ -35,6 +35,7 @@ class BoardGame(BoardGameBase, table=True):
id: int = Field(primary_key=True) id: int = Field(primary_key=True)
type: BoardgameType = BoardgameType.BOARDGAME type: BoardgameType = BoardgameType.BOARDGAME
designers: list["Designer"] = Relationship(back_populates="designed_boardgames", link_model=many_to_many_links.DesignerBoardGameLink) 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") expansion_info: Optional["ExpansionInfo"] = Relationship(back_populates="boardgame")
@ -51,6 +52,7 @@ class BoardGame(BoardGameBase, table=True):
class BoardGamePublic(BoardGameBase): class BoardGamePublic(BoardGameBase):
id: int id: int
designers: list["DesignerPublicNoGames"] designers: list["DesignerPublicNoGames"]
artists: list["ArtistPublicNoGames"]
expansion_info: Optional["ExpansionInfoPublicNoGame"] expansion_info: Optional["ExpansionInfoPublicNoGame"]
owned_info: Optional["OwnedInfoPublicNoGame"] owned_info: Optional["OwnedInfoPublicNoGame"]
wishlist_info: Optional["WishlistInfoPublicNoGame"] wishlist_info: Optional["WishlistInfoPublicNoGame"]
@ -59,6 +61,7 @@ class BoardGamePublic(BoardGameBase):
class BoardGamePublicNoPlays(BoardGameBase): class BoardGamePublicNoPlays(BoardGameBase):
id: int id: int
designers: list["DesignerPublicNoGames"] designers: list["DesignerPublicNoGames"]
artists: list["ArtistPublicNoGames"]
expansion_info: Optional["ExpansionInfoPublicNoGame"] expansion_info: Optional["ExpansionInfoPublicNoGame"]
owned_info: Optional["OwnedInfoPublicNoGame"] owned_info: Optional["OwnedInfoPublicNoGame"]
wishlist_info: Optional["WishlistInfoPublicNoGame"] wishlist_info: Optional["WishlistInfoPublicNoGame"]
@ -127,5 +130,5 @@ class WishlistInfoPublicNoGame(SQLModel):
from src.classes.play_classes import Play, PlayPublicNoGame 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() BoardGame.model_rebuild()

View file

@ -3,4 +3,8 @@ from sqlmodel import Field,SQLModel
class DesignerBoardGameLink(SQLModel, table=True): class DesignerBoardGameLink(SQLModel, table=True):
boardgame_id: int | None = Field(default=None, foreign_key="boardgame.id", primary_key=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) designer_id: int | None = Field(default=None, foreign_key="designer.id", primary_key=True)
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)

View file

@ -6,11 +6,23 @@ class Designer(SQLModel, table=True):
id: int = Field(primary_key=True) id: int = Field(primary_key=True)
name: str name: str
designed_boardgames: list[boardgame_classes.BoardGame] | None = Relationship(back_populates="designers", link_model=many_to_many_links.DesignerBoardGameLink) 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): class DesignerPublic(SQLModel):
name: str name: str
designed_boardgames: list[boardgame_classes.BoardGamePublicNoPlays] designed_boardgames: list[boardgame_classes.BoardGamePublicNoPlays]
class DesignerPublicNoGames(SQLModel): 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 name: str

View file

@ -81,6 +81,7 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa
all_links = boardgame_xml.findall('link') all_links = boardgame_xml.findall('link')
designers = [] designers = []
artists = []
for link in all_links: for link in all_links:
match link.get('type'): 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_name = link.get('value')
designer = people_classes.Designer(id=designer_id, name=designer_name) designer = people_classes.Designer(id=designer_id, name=designer_name)
designers.append(designer) 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 = { boardgame_dict = {
"id" : int(boardgame_xml.get('id')), "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')), "min_playing_time" : int(boardgame_xml.find('minplaytime').get('value')),
"max_playing_time" : int(boardgame_xml.find('maxplaytime').get('value')), "max_playing_time" : int(boardgame_xml.find('maxplaytime').get('value')),
"min_age" : int(boardgame_xml.find('minage').get('value')), "min_age" : int(boardgame_xml.find('minage').get('value')),
"designers" : designers "designers" : designers,
"artists" : artists
} }
boardgame = boardgame_classes.BoardGame(**boardgame_dict) boardgame = boardgame_classes.BoardGame(**boardgame_dict)

View file

@ -30,6 +30,12 @@ def add_boardgame(session: Session, boardgame: boardgame_classes.BoardGame):
if designer_in_db != None: if designer_in_db != None:
boardgame.designers[designer_index] = designer_in_db 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( is_boardgame_present = len(session.exec(
select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame.id) select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame.id)
).all()) != 0 ).all()) != 0
@ -81,6 +87,12 @@ def upsert_multiple_boardgames(session: Session, boardgame_list: list[boardgame_
if designer_in_db != None: if designer_in_db != None:
boardgame.designers[designer_index] = designer_in_db 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) session.add(boardgame)
altered_boardgames.append(boardgame) altered_boardgames.append(boardgame)
@ -107,6 +119,18 @@ def get_designer(session: Session, designer_id: int) -> people_classes.Designer:
return 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]: 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)) statement = select(people_classes.Designer).where(people_classes.Designer.id.in_(designer_ids))
results = session.exec(statement) results = session.exec(statement)