class ShippingWorkflow(models.Shipment): checkout = tasks.StartView(fields=["shipping_address", "email"]) ship = tasks.UpdateView(fields=["tracking_code"]) def has_email(self, task): if self.email: return [self.send_tracking_code] def send_tracking_code(self, task): send_mail( subject="Your tracking code", message=self.tracking_code, from_email=None, recipient_list=[self.email], ) def end(self, task): pass edges = [ (checkout, ship), (ship, has_email), (has_email, send_tracking_code), (has_email, end), (send_tracking_code, end), ] class Meta: proxy = True
class WelcomeWorkflow(models.WelcomeWorkflowState): start = tasks.StartView(fields=["user"]) def has_user(self): if self.user: return [self.send_welcome_email] else: return [self.end] def send_welcome_email(self): self.user.email_user( subject="Welcome", message="Hello %s!" % self.user.get_short_name(), ) def end(self): pass edges = [ (start, has_user), (has_user, end), (has_user, send_welcome_email), (send_welcome_email, end), ] class Meta: proxy = True
class SplitJoinWorkflow(models.SplitJoinWorkflowState): start = tasks.StartView(fields=[]) def split(self): return [self.batman, self.robin] def batman(self): self.parallel_task_value += 1 self.save(update_fields=["parallel_task_value"]) def robin(self): self.parallel_task_value += 1 self.save(update_fields=["parallel_task_value"]) join = tasks.Join("batman", "robin") edges = ( (start, split), (split, batman), (split, robin), (batman, join), (robin, join), ) class Meta: proxy = True
class WelcomeWorkflow(Workflow): # state user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True, ) # behavior start = tasks.StartView(fields=["user"]) def has_user(self): if self.user: return [self.send_welcome_email] else: return [self.end] def send_welcome_email(self): self.user.email_user( subject="Welcome", message="Hello %s!" % self.user.get_short_name(), ) def end(self): pass edges = [ (start, has_user), (has_user, end), (has_user, send_welcome_email), (send_welcome_email, end), ]
class SimpleWorkflow(models.SimpleWorkflowState): start_view = tasks.StartView(fields="__all__", path="custom/postfix/") start_method = tasks.Start() save_the_princess = tasks.UpdateView(fields="__all__") def end(self): pass edges = ( (start_view, save_the_princess), (start_method, save_the_princess), (save_the_princess, end), ) class Meta: proxy = True
class GatewayWorkflow(models.GatewayWorkflowState): start = tasks.StartView(fields="__all__") save_the_princess = tasks.UpdateView() def is_princess_safe(self): return [self.happy_end] happy_end = lambda s, task: s.finish() bad_end = lambda s, task: s.finish() edges = ( (start, is_princess_safe), (is_princess_safe, happy_end), (is_princess_safe, bad_end), ) class Meta: proxy = True
class LoopWorkflow(models.LoopWorkflowState): start = tasks.StartView(fields=[]) def increment_counter(self): self.counter += 1 self.save(update_fields=["counter"]) def is_counter_10(self): if self.counter == 10: return [self.end] return [self.increment_counter] def end(self): pass edges = ( (start, increment_counter), (increment_counter, is_counter_10), (is_counter_10, increment_counter), (is_counter_10, end), ) class Meta: proxy = True
class WelcomeProcess(WelcomeProcessState, Process): start = tasks.StartView(fields=['user']) def has_user(self): if self.user: return [self.send_welcome_email] else: return [self.end] def send_welcome_email(self): self.user.email_user( subject='Welcome', message='Hello %s!' % self.user.get_short_name(), ) def end(self): pass edges = ( (start, has_user), (has_user, end), (has_user, send_welcome_email), (send_welcome_email, end), )