我正在使用django-viewflow来跟踪复杂的业务流程。为了避免使用冗长的Flow类和flows.py文件,我希望将一个流提供给另一个流。这可能吗?
我尝试了以下代码,但是Python引发了NotImplemented异常。
class SecondFlow(Flow):
process_class = SecondProcess
start = (...)
class FirstFlow(Flow):
process_class = FirstProcess
start = (
flow.Start(
CreateProcessView,
fields=['foo']
).Next(SecondFlow.start)
)
如果将FirstFlow路由到SecondFlow的开头,那就太好了。
编辑:我尝试使用提供的建议和文档,但是出现以下错误:'StartFunction'对象没有属性'prepare'
下面是我的新代码。
from viewflow import flow, frontend
from viewflow.base import this, Flow
from viewflow.flow.views import CreateProcessView, UpdateProcessView
from .models import FirstProcess, SecondProcess
@frontend.register
class SecondFlow(Flow):
process_class = SecondProcess
start = flow.StartFunction(this.create_flow
).Next(this.enter_text)
def create_flow(self, activation, **kwargs):
activation.prepare()
activation.done()
enter_text = (
flow.View(
UpdateProcessView,
fields=['text']
).Next(this.end)
)
end = flow.End()
@frontend.register
class FirstFlow(Flow):
process_class = FirstProcess
start = (
flow.Start(
CreateProcessView,
fields=['text']
).Next(this.initiate_second_flow)
)
initiate_second_flow = (
flow.Handler(this.start_second_flow
).Next(this.end)
)
def start_second_flow(self, activation):
SecondFlow.start.run()
end = flow.End()
第二次修改:在将装饰器添加到SecondFlow的create_flow
方法中后,此方法才起作用。
from django.utils.decorators import method_decorator
...
@frontend.register
class SecondFlow(Flow):
process_class = SecondProcess
start = flow.StartFunction(this.create_flow
).Next(this.enter_text)
@method_decorator(flow.flow_start_func)
def create_flow(self, activation, **kwargs):
activation.prepare()
activation.done()
...
答案 0 :(得分:1)
flow.Start
是用于由用户调用并创建过程的“开始”视图的任务。 View可能具有某些逻辑,通常,该逻辑依赖于request
数据。因此,除了通过浏览器访问URL之外,您无法在其他地方调用flow.StartView和flow.View。
要以编程方式激活某些流程,请使用以下流程。StartFunction-http://docs.viewflow.io/viewflow_core_node.html#viewflow.nodes.StartFunction
要从其他流执行它,可以使用flow.Handler-http://docs.viewflow.io/viewflow_core_node.html#viewflow.nodes.Handler