from typing import Union from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped from sqlalchemy.orm import base as sa_base from sqlalchemy.orm import mapped_column, relationship from ttfrog.db.schema.inventory import Inventory, InventoryMap, InventoryType from ttfrog.db.schema.item import Item, ItemType __all__ = [ "Container", ] class Container(Item): __tablename__ = "container" __mapper_args__ = {"polymorphic_identity": ItemType.CONTAINER} id: Mapped[int] = mapped_column(ForeignKey("item.id"), primary_key=True, init=False) item_type: Mapped[ItemType] = ItemType.CONTAINER inventory: Mapped["Inventory"] = relationship( cascade="all,delete,delete-orphan", lazy="immediate", default_factory=lambda: Inventory(inventory_type=InventoryType.EQUIPMENT), ) def __contains__(self, obj: Union[InventoryMap, Item]): return obj in self.inventory def __iter__(self): yield from self.inventory def __getattr__(self, name: str): if name == sa_base.DEFAULT_STATE_ATTR: raise AttributeError() return getattr(self.inventory, name)