crudkit/muck/models/dbref.py

50 lines
1.5 KiB
Python

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)