简介
我正在开发一个Web应用程序来学习Django(Python3.4和Django1.6.10)。Web应用程序具有复杂且经常更新的工作流。我决定集成Django ViewFlow库(https://github.com/viewflow/viewflow/),因为它似乎是处理工作流的非常方便的方法,而不是将工作流逻辑与应用程序模型结合起来。
在本例中,我创建了一个工作流,使用Django ViewFlow库收集作者信息和版权。每次将作者添加到书籍中时,都应启动工作流。
我的问题
文档提供了逐步指导原则,以集成端到端的WorkFow解决方案(前端和后端)。我的问题是,我很难通过编程(特别是从书本模型)来控制工作流。
应用程序说明
我有一本书的模型(核心模型),它与作者有很多对很多的关系。
myapp/型号.py
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
工作流组件包括:
myFlow/型号.py
from viewflow.models import Process
class AuthorInvitation(process)
consent_confirmed = models.BooleanField(default=False)
signature = models.CharField(max_length=150)
我的流量/流量.py
from viewflow import flow
from viewflow.base import this, Flow
from viewflow.contrib import celery
from viewflow.views import StartProcessView, ProcessView
from . import models, tasks
class AuthorInvitationFlow(Flow):
process_cls = models.AuthorInvitation
start = flow.Start(StartProcessView) \
.Permission(auto_create=True) \
.Next(this.notify)
notify = celery.Job(tasks.send_authorship_request) \
.Next(this.approve)
approve = flow.View(ProcessView, fields=["confirmed","signature"]) \
.Permission(auto_create=True) \
.Next(this.check_approve)
check_approve = flow.If(cond=lambda p: p.confirmed) \
.OnTrue(this.send) \
.OnFalse(this.end)
send = celery.Job(tasks.send_authorship) \
.Next(this.end)
end = flow.End()
问题
如何以编程方式控制工作流进程(激活、确认步骤、重做步骤、取消进程…)?我试着深入研究图书馆的代码。似乎
class activate
包含正确的方法,但不确定如何协调整个方法。事先谢谢!
最佳答案
有两个额外的启动内置任务可用于流
StartFunction-当函数在某个位置调用时启动流:
@flow_start_func
def create_flow(activation, **kwargs):
activation.prepare()
activation.done()
return activation
class FunctionFlow(Flow):
start = flow.StartFunction(create_flow) \
.Next(this.end)
# somewhere in the code
FunctionFlow.start.run(**some_kwargs)
StartSignal-在Django信号接收上启动流:
class SignalFlow(Flow):
start = flow.StartSignal(some_signal, create_flow) \
.Next(this.end)
您可以在this viewflow test suite中检查它们的用法以及内置任务的其余部分。
对于手动处理任务状态,首先应该从数据库中获取任务,激活它,并调用任何激活方法。
task = MyFlow.task_cls.objects.get(...)
activation = task.activate()
if activation.undo.can_proceed():
activation.undo()
任何激活转换都有
.can_proceed()
方法,帮助您检查,是处于允许转换状态的任务。关于python - 如何以编程方式创建django ViewFlow进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28734247/