概要
我正在开发一个学习Django的Web应用程序(python 3.4和Django 1.6.10).Web应用程序具有复杂且经常更新的工作流程.我决定集成Django-Viewflow库(https://github.com/viewflow/viewflow/),因为它似乎是处理工作流程的一种非常方便的方式,而不是将工作流逻辑与应用程序模型结合在一起.
在这种情况下,我创建了一个工作流程,使用Django-Viewflow库收集作者信息和版权.每次将作者添加到书籍时都应启动工作流程.
我的问题
该文档提供了逐步指导,以集成端到端的工作流解决方案(前端和后端).我的问题是我很难以编程方式控制工作流程(特别是从Book模型).
申请说明
我有一个Book模型(核心模型),与作者有很多关系.
对myApp/models.py
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
Run Code Online (Sandbox Code Playgroud)
工作流程组件是:
myFlow/models.py
from viewflow.models import Process
class AuthorInvitation(process)
consent_confirmed = models.BooleanField(default=False)
signature = models.CharField(max_length=150)
Run Code Online (Sandbox Code Playgroud)
myFlow/flows.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) \ …Run Code Online (Sandbox Code Playgroud) 我正在使用django-viewflow以编程方式创建工作流.
这是我的流程类.
class Workflow(Flow):
start = (
flow.StartFunction(function1)
.Next(this.shipment_create)
)
shipment_create = (
flow.Function(function2)
.Next(this.request_quotes)
)
request_quotes = (
flow.Handler(function3)
.Next(this.move_package)
)
move_package = (
flow.Function(function4)
.Next(this.end)
)
end = flow.End()
Run Code Online (Sandbox Code Playgroud)
我所做的是,我以编程方式启动流程,当在端点E1上发出POST请求时,我运行
WorkFLow.start.run(**some_kwargs)
Run Code Online (Sandbox Code Playgroud)
它正确启动,并在完成处理start后,将响应返回给客户端.
现在,shipment_create在端点E2上发出POST请求时运行,我再次以编程方式运行它,
activation.flow_task.run(**some_kwargs)
Run Code Online (Sandbox Code Playgroud)
它正确运行并完成流程move_package.
问题
我shipment通过端点E3上的PUT请求更新了详细信息,并且我希望在节点之后重新运行完整的流程shipment_create.我怎样才能做到这一点?
1)如何在特定节点之后重新运行流程?
2)点(1)是手动步骤,即以编程方式重新运行后节点.有没有办法,我可以shipment_update在Workflow类本身中包含节点,以便它自动重新运行后节点?如何以及在哪里提到update_shipment节点?
我在第(2)点看到的问题是,在一种情况下,我shipment_create在启动后声明节点(其余处理程序将处理),在另一种情况下,我要shipment_update在启动后提及节点(其余的处理程序将处理).工作流类将如何根据HTTP方法的类型工作?
更新
如何返回Handler(即function4)的响应?
def function1():
return 1
def function2():
return 2
def function3():
return 3
def function4():
return …Run Code Online (Sandbox Code Playgroud) 我想用ViewFlow库实现以下用例:
由用户启动的特定流程的进程必须在执行芹菜作业之前在队列中等待.每个用户都有这些进程的队列.根据计划或手动触发,允许队列中的下一个进程继续.
我的流中的节点进入命名队列.应用程序中的其他逻辑为每个队列确定何时允许下一个任务继续进行.选择队列中的下一个任务并调用其激活的done()方法.
示例流可能如下所示:
class MyFlow(Flow):
start = flow.Start(...).Next(queue_wait)
queue_wait = QueueWait("myQueue").Next(job)
job = celery.Job(...).Next(end)
end = flow.End()
Run Code Online (Sandbox Code Playgroud)
实施排队的最佳方法是什么?在上面的例子中,我不知道"QueueWait"应该是什么.
我已经阅读了文档和视图流代码,但是我还不清楚是否可以使用内置的Node和Activation类(如func.Function)来完成,或者如果我需要使用自定义类进行扩展.
我想使用ViewFlow(参见http://viewflow.io/)进行用户注册过程,我要求用户输入密码(以及密码2进行确认).我不想存储普通密码,但我想立即创建用户并分配密码,而不是将该数据存储在Process中.
There is the library Viewflow that I would like to use. I don't need the front end because I already got mine. I've been following the quickstart but I don't see how I can integrate viewflow, without using the front end because there are a lot of relations to the material app.
Any ideas?