+ def validate_state_change
+ if self.state_changed?
+ if self.state_was.in? [Complete, Failed, Cancelled]
+ # Once in a finished state, don't permit any changes
+ errors.add :state, "invalid change from #{self.state_was} to #{self.state}"
+ return false
+ elsif self.state_was == Running and not self.state.in? [Complete, Failed, Cancelled]
+ # From running, can only transition to a finished state
+ errors.add :state, "invalid change from #{self.state_was} to #{self.state}"
+ return false
+ end
+ end
+ true
+ end