As of transitions
0.7.1 there is no easy way to adjust the name of the model's state attribute. Overriding Transition._state_change
, Machine._trigger
and Machine.is_state
is too complex, imho. You could 'alias' your status field by either using Model.state
as a property:
class Model:
@property
def state(self):
return self.status
@state.setter
def state(self, value):
self.status = value
or maybe use SQLAlchemy's synonym:
from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import synonym, sessionmaker
from transitions import Machine
engine = create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
Base = declarative_base()
class Model(Base):
__tablename__ = 'Model'
id = Column(Integer, primary_key=True, autoincrement=True)
status = Column(String, default='initial')
state = synonym('status')
def __repr__(self):
return "<Model(id='{}', status='{}')>".format(self.id, self.status)
Base.metadata.create_all(engine)
session = Session()
m1 = Model()
m2 = Model()
session.add_all([m1, m2])
m = Machine(model=[m1, m2], states=['A', 'B'], initial='A')
print(session.query(Model).filter_by(status='A').all())
# >>> [<Model(id='1', status='A')>, <Model(id='2', status='A')>]
m1.to_B()
print(session.query(Model).filter_by(status='B').all())
# >>> [<Model(id='1', status='B')>]