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["Designer"] expansion_info: Optional["ExpansionInfo"] owned_info: Optional["OwnedInfo"] wishlist_info: Optional["WishlistInfo"] class ExpansionInfo(BoardGameBase, table=True): id: Optional[int] = Field(default=None, primary_key=True) 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="expansion_info" ) class OwnedInfo(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) 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="owned_info" ) price_paid: float acquisition_date: date acquired_from: str class WishlistInfo(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) 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" ) 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 BoardGame.model_rebuild() # BoardGameExpansion.model_rebuild() # BoardGameNoPlays.model_rebuild() # BoardGameExpansionNoPlays.model_rebuild()