bgg_api/src/classes/boardgame_classes.py

155 lines
4.7 KiB
Python
Raw Normal View History

2024-08-01 11:48:29 +02:00
from datetime import date
2024-08-01 12:05:51 +02:00
from enum import Enum
2024-08-21 21:03:49 +02:00
from typing import Optional
from sqlmodel import Field, SQLModel, Relationship
from src.classes import many_to_many_links
2024-08-01 12:05:51 +02:00
class BoardgameType(Enum):
2024-08-01 12:16:50 +02:00
BOARDGAME = 'boardgame'
BOARDGAMEEXPANSION = 'boardgameexpansion'
OWNEDBOARDGAME = 'ownedboardgame'
OWNEDBOARDGAMEEXPANSION = 'ownedboardgameexpansion'
2024-08-01 12:16:50 +02:00
WISHLISTBOARDGAME = 'wishlistboardgame'
WISHLISTBOARDGAMEEXPANSION = 'wishlistboardgameexpansion'
2024-08-01 12:05:51 +02:00
class BoardGameBase(SQLModel):
2024-08-03 14:18:54 +02:00
name: str
description: str
2024-08-08 16:50:42 +02:00
weight: float
2024-08-03 14:18:54 +02:00
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
}
2024-08-03 14:18:54 +02:00
2024-08-21 21:03:49 +02:00
# class OwnedBoardGameBase(BoardGameBase):
# price_paid: float
# acquisition_date: date
# acquired_from: str
2024-08-21 21:03:49 +02:00
# class WishlistBoardGameBase(BoardGameBase):
# wishlist_priority: int
class BoardGame(BoardGameBase, table=True):
id: int = Field(primary_key=True)
type: BoardgameType = BoardgameType.BOARDGAME
2024-08-21 21:03:49 +02:00
#plays: list["Play"] = Relationship(back_populates='boardgame')
designers: list["Designer"] = Relationship(back_populates="designed_boardgames", link_model=many_to_many_links.DesignerBoardGameLink)
2024-08-21 21:03:49 +02:00
expansion_info: Optional["ExpansionInfo"] = Relationship(back_populates="boardgame")
2024-08-21 21:03:49 +02:00
owned_info: Optional["OwnedInfo"] = Relationship(back_populates="boardgame")
2024-08-21 21:03:49 +02:00
wishlist_info: Optional["WishlistInfo"] = Relationship(back_populates="boardgame")
model_config = {
'arbitrary_types_allowed':True
}
class BoardGamePublic(BoardGameBase):
id: int
designers: list["DesignerPublicNoGames"]
2024-08-21 21:03:49 +02:00
expansion_info: Optional["ExpansionInfo"]
owned_info: Optional["OwnedInfo"]
wishlist_info: Optional["WishlistInfo"]
class ExpansionInfo(SQLModel, table=True):
2024-08-21 21:03:49 +02:00
id: Optional[int] = Field(default=None, primary_key=True)
expansion_for: int
boardgame_id: int = Field(default=None, foreign_key="boardgame.id")
2024-08-21 21:03:49 +02:00
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)
price_paid: float
acquisition_date: date
acquired_from: str
boardgame_id: int = Field(default=None, foreign_key="boardgame.id")
2024-08-21 21:03:49 +02:00
boardgame: BoardGame = Relationship(
#for one-on-one relationship
sa_relationship_kwargs={'uselist': False},
back_populates="owned_info"
)
2024-08-21 21:03:49 +02:00
class WishlistInfo(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
wishlist_priority: int
2024-08-21 21:03:49 +02:00
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"
)
2024-08-21 21:03:49 +02:00
# class BoardGamePublic(BoardGameBase):
# id: int
# type: BoardgameType
# plays: list["Play"]
# designers: list["Designer"]
2024-08-21 21:03:49 +02:00
# class BoardGameNoPlays(BoardGameBase):
# id: int
# designers: list["Designer"]
# type: BoardgameType = BoardgameType.BOARDGAME
2024-08-01 11:48:29 +02:00
2024-08-21 21:03:49 +02:00
# class BoardGameExpansionPublic(BoardGameBase):
# id: int
# expansion_for: int
# type: BoardgameType
# plays: list["Play"]
# designers: list["Designer"]
2024-08-01 11:48:29 +02:00
2024-08-21 21:03:49 +02:00
# class BoardGameExpansionNoPlays(BoardGameBase):
# id: int
# expansion_for: int
# designers: list["Designer"]
# type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION
2024-08-21 21:03:49 +02:00
# 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()
2024-08-21 21:03:49 +02:00
# BoardGameExpansion.model_rebuild()
# BoardGameNoPlays.model_rebuild()
# BoardGameExpansionNoPlays.model_rebuild()