Holy moley is it hard to do MUCK stuff relationally.

This commit is contained in:
Yaro Kasear 2025-09-04 14:36:00 -05:00
parent c72417e5e4
commit d9ed6d5cd7
8 changed files with 89 additions and 24 deletions

5
muck/models/__init__.py Normal file
View file

@ -0,0 +1,5 @@
from muck.models.dbref import Dbref
from muck.models.exit import Exit
from sqlalchemy.orm import relationship
Dbref.exits = relationship("Exit", back_populates="source", foreign_keys=[Exit.location_id])

View file

@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, DateTime, JSON, Enum as SQLEnum, func
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, foreign, remote
from crudkit.core.base import CRUDMixin, Base
from enum import Enum
@ -29,23 +29,22 @@ class Dbref(Base, CRUDMixin):
last_used = Column(DateTime, nullable=False, default=func.now())
use_count = Column(Integer, nullable=False, default=0)
location_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
location = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[location_id], back_populates="contents")
location_id = Column(Integer, ForeignKey("dbref.id"), nullable=True, default=0)
location = relationship("Dbref", foreign_keys=[location_id], back_populates="contents", primaryjoin=lambda: foreign(Dbref.location_id) == remote(Dbref.id), remote_side=lambda: Dbref.id)
contents = relationship("Dbref", backref="location", foreign_keys=location_id)
exits = relationship("Exit", backref="source", foreign_keys=location_id)
contents = relationship("Dbref", foreign_keys=[location_id], back_populates="location")
owner_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
owner = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[owner_id])
owner_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
owner = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[owner_id], primaryjoin=lambda: Dbref.owner_id == remote(Dbref.id), post_update=True)
creator_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
creator = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[creator_id])
creator_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
creator = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[creator_id], primaryjoin=lambda: Dbref.creator_id == remote(Dbref.id), post_update=True)
modifier_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
modifier = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[modifier_id])
modifier_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
modifier = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[modifier_id], primaryjoin=lambda: Dbref.modifier_id == remote(Dbref.id), post_update=True)
last_user_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
last_user = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[last_user_id])
last_user_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
last_user = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[last_user_id], primaryjoin=lambda: Dbref.last_user_id == remote(Dbref.id), post_update=True)
__mapper_args__ = {
"polymorphic_on": type,

View file

@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, foreign, remote
from crudkit.core.base import CRUDMixin
@ -11,8 +11,11 @@ class Exit(Dbref):
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
destination_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
destination = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[destination_id])
destination = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[destination_id], primaryjoin=lambda: foreign(Exit.destination_id) == remote(Dbref.id))
source = relationship("Dbref", back_populates="exits", foreign_keys=[Dbref.location_id], remote_side=[Dbref.id])
__mapper_args__ = {
"polymorphic_identity": ObjectType.EXIT
"polymorphic_identity": ObjectType.EXIT,
"inherit_condition": id == Dbref.id
}

View file

@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, Boolean, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, foreign, remote
from crudkit.core.base import CRUDMixin
@ -15,12 +15,13 @@ class Player(Dbref):
block = Column(Integer, nullable=True)
password = Column(String, nullable=False)
home_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id])
home_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id], primaryjoin=lambda: foreign(Player.home_id) == remote(Dbref.id))
current_program_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
current_program = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[current_program_id])
current_program = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[current_program_id], primaryjoin=lambda: foreign(Player.current_program_id) == remote(Dbref.id))
__mapper_args__ = {
"polymorphic_identity": ObjectType.PLAYER
"polymorphic_identity": ObjectType.PLAYER,
"inherit_condition": id == Dbref.id
}

View file

@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import relationship, foreign, remote
from crudkit.core.base import CRUDMixin
@ -11,8 +11,9 @@ class Room(Dbref):
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
dropto_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
dropto = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[dropto_id])
dropto = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[dropto_id], primaryjoin=lambda: foreign(Room.dropto_id) == remote(Dbref.id))
__mapper_args__ = {
"polymorphic_identity": ObjectType.ROOM
"polymorphic_identity": ObjectType.ROOM,
"inherit_condition": id == Dbref.id
}