from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Enum as SQLEnum from sqlalchemy.orm import relationship from crudkit.core.base import CRUDMixin, Base from enum import Enum class ObjectType(str, Enum): ROOM = "room" THING = "thing" EXIT = "exit" PLAYER = "player" PROGRAM = "program" class Dbref(Base, CRUDMixin): __tablename__ = "dbref" type = Column(SQLEnum(ObjectType, name="object_type_enum"), nullable=False) name = Column(String, nullable=False) is_deleted = Column(Boolean, nullable=False, default=False) owner_id = Column(Integer, ForeignKey("dbref.id")) location_id = Column(Integer, ForeignKey("dbref.id")) owner = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[owner_id]) location = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[location_id]) __mapper_args__ = { "polymorphic_on": type, "polymorphic_identity": "dbref" } def __str__(self): return f"#{self.id} ({self.type}): {self.name}" def is_type(self, *types: ObjectType) -> bool: return self.type in types @property def is_room(self): return self.is_type(ObjectType.ROOM) @property def is_thing(self): return self.is_type(ObjectType.THING) @property def is_exit(self): return self.is_type(ObjectType.EXIT) @property def is_player(self): return self.is_type(ObjectType.PLAYER) @property def is_program(self): return self.is_type(ObjectType.PROGRAM)