一尘不染

如何以编程方式创建Django ViewFlow流程

django

概要

我正在开发一个Web应用程序以学习Django(python 3.4和Django 1.6.10)。该Web应用程序具有复杂且经常更新的工作流程。我决定集成Django-Viewflow库(https://github.com/viewflow/viewflow/),因为这似乎是处理工作流且不将工作流逻辑与应用程序模型合并的一种非常方便的方法。

在这种情况下,我创建了一个工作流以使用Django-Viewflow库收集作者信息和版权。每次将作者添加到书中时,都应启动工作流程。

我的问题

该文档提供了逐步指南,以集成端到端工作流解决方案(前端和后端)。我的问题是我很难以编程方式(特别是从Book模型)控制工作流。

应用说明

我有一个Book模型(核心模型),它与Authors有很多关系。

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()

工作流组件包括:

myFlow / models.py

from viewflow.models import Process

class AuthorInvitation(process)     
    consent_confirmed = models.BooleanField(default=False)
    signature = models.CharField(max_length=150)

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) \
        .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包含正确的方法,但不确定如何组织整体。


阅读 2122

收藏
2020-04-01

共1个答案

一尘不染

有两个附加的Start内置任务可用于Flows

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)

您可以在此viewflow测试套件中检查它们的用法以及其余的内置任务。

要手动处理任务状态,首先应该从数据库中获取任务,将其激活,然后调用任何激活方法。

task  = MyFlow.task_cls.objects.get(...)
activation = task.activate()
if  activation.undo.can_proceed():
    activation.undo()

任何激活过渡都有.can_proceed()方法,可以帮助您检查,是处于允许过渡状态的任务。

2020-04-01