37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
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)
|