bgg_api/src/classes/boardgame_classes.py
2024-08-22 09:25:19 +02:00

180 lines
No EOL
5.3 KiB
Python

from datetime import date
from enum import Enum
from typing import Optional
from sqlmodel import Field, SQLModel, Relationship
from src.classes import many_to_many_links
class BoardgameType(Enum):
BOARDGAME = 'boardgame'
BOARDGAMEEXPANSION = 'boardgameexpansion'
OWNEDBOARDGAME = 'ownedboardgame'
OWNEDBOARDGAMEEXPANSION = 'ownedboardgameexpansion'
WISHLISTBOARDGAME = 'wishlistboardgame'
WISHLISTBOARDGAMEEXPANSION = 'wishlistboardgameexpansion'
class BoardGameBase(SQLModel):
name: str
description: str
weight: float
image_url : str
thumbnail_url : str
year_published: int
min_players: int
max_players: int
min_playing_time: int
max_playing_time: int
min_age: int
model_config = {
'validate_assignment':True
}
# class OwnedBoardGameBase(BoardGameBase):
# price_paid: float
# acquisition_date: date
# acquired_from: str
# class WishlistBoardGameBase(BoardGameBase):
# wishlist_priority: int
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")
owned_info: Optional["OwnedInfo"] = Relationship(back_populates="boardgame")
wishlist_info: Optional["WishlistInfo"] = Relationship(back_populates="boardgame")
model_config = {
'arbitrary_types_allowed':True
}
class BoardGamePublic(BoardGameBase):
id: int
designers: list["DesignerPublicNoGames"]
expansion_info: Optional["ExpansionInfoPublicNoGame"]
owned_info: Optional["OwnedInfoPublicNoGame"]
wishlist_info: Optional["WishlistInfoPublicNoGame"]
class ExpansionInfo(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
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},
back_populates="expansion_info"
)
class ExpansionInfoPublic(SQLModel):
expansion_for: int
boardgame: BoardGame
class ExpansionInfoPublicNoGame(SQLModel):
expansion_for: int
class OwnedInfo(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
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"
)
class OwnedInfoPublic(SQLModel):
price_paid: float
acquisition_date: date
acquired_from: str
boardgame: BoardGame
class OwnedInfoPublicNoGame(SQLModel):
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"
)
class WishlistInfoPublic(SQLModel):
wishlist_priority: int
boardgame: BoardGame
class WishlistInfoPublicNoGame(SQLModel):
wishlist_priority: int
# class BoardGamePublic(BoardGameBase):
# id: int
# type: BoardgameType
# plays: list["Play"]
# designers: list["Designer"]
# class BoardGameNoPlays(BoardGameBase):
# id: int
# designers: list["Designer"]
# type: BoardgameType = BoardgameType.BOARDGAME
# class BoardGameExpansionPublic(BoardGameBase):
# id: int
# expansion_for: int
# type: BoardgameType
# plays: list["Play"]
# designers: list["Designer"]
# class BoardGameExpansionNoPlays(BoardGameBase):
# id: int
# expansion_for: int
# designers: list["Designer"]
# type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION
# class OwnedBoardGame(OwnedBoardGameBase, table=True):
# id: int = Field(primary_key=True)
# type: BoardgameType = BoardgameType.OWNEDBOARDGAME
# class OwnedBoardGameExpansion(OwnedBoardGameBase, table=True):
# id: int = Field(primary_key=True)
# expansion_for: int = Field(default=None, foreign_key="boardgame.id")
# type: BoardgameType = BoardgameType.OWNEDBOARDGAMEEXPANSION
# class WishlistBoardGame(WishlistBoardGameBase, table=True):
# id: int = Field(primary_key=True)
# type: BoardgameType = BoardgameType.WISHLISTBOARDGAME
# class WishlistBoardGameExpansion(WishlistBoardGameBase, table=True):
# id: int = Field(primary_key=True)
# expansion_for: int = Field(default=None, foreign_key="boardgame.id")
# type: BoardgameType = BoardgameType.WISHLISTBOARDGAMEEXPANSION
from src.classes.play_classes import Play, PlayPublic
from src.classes.people_classes import Designer, DesignerPublicNoGames
BoardGame.model_rebuild()
# BoardGameExpansion.model_rebuild()
# BoardGameNoPlays.model_rebuild()
# BoardGameExpansionNoPlays.model_rebuild()