From e177e2feed1bfbe29f32c3378978313d19ce1c26 Mon Sep 17 00:00:00 2001 From: ptmcg Date: Mon, 31 Dec 2018 13:10:59 -0600 Subject: Add document signoff and library book state examples; --- examples/statemachine/documentSignoffDemo.py | 68 ++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 examples/statemachine/documentSignoffDemo.py (limited to 'examples/statemachine/documentSignoffDemo.py') diff --git a/examples/statemachine/documentSignoffDemo.py b/examples/statemachine/documentSignoffDemo.py new file mode 100644 index 0000000..9378507 --- /dev/null +++ b/examples/statemachine/documentSignoffDemo.py @@ -0,0 +1,68 @@ +# +# documentSignoffDemo.py +# +# Example of a state machine modeling the state of a document in a document +# control system, using named state transitions +# +import statemachine +import documentsignoffstate + + +class Document: + def __init__(self): + # start light in Red state + self._state = documentsignoffstate.New() + + @property + def state(self): + return self._state + + # get behavior/properties from current state + def __getattr__(self, attrname): + attr = getattr(self._state, attrname) + if isinstance(getattr(documentsignoffstate, attrname, None), + documentsignoffstate.DocumentRevisionStateTransition): + return lambda : setattr(self, '_state', attr()) + return attr + + def __str__(self): + return "{}: {}".format(self.__class__.__name__, self._state) + + +def run_demo(): + import random + + doc = Document() + print(doc) + + # begin editing document + doc.create() + print(doc) + print(doc.state.description) + + while not isinstance(doc._state, documentsignoffstate.Approved): + + print('...submit') + doc.submit() + print(doc) + print(doc.state.description) + + if random.randint(1,10) > 3: + print('...reject') + doc.reject() + else: + print('...approve') + doc.approve() + + print(doc) + print(doc.state.description) + + doc.activate() + print(doc) + print(doc.state.description) + +if __name__ == '__main__': + run_demo() + +# TODO - can you pickle state or otherwise persist it? +# TODO - can you decorate state changes (for logging or permission checking)? -- cgit v1.2.1