Как соединить два потока в django-viewflow - PullRequest
0 голосов
/ 08 февраля 2019

Я использую 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()

Второе редактирование: работает после того, как я добавил декоратор к методу create_flow SecondFlow.

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

...

1 Ответ

0 голосов
/ 11 февраля 2019

flow.Start - это задача для начального представления, которое вызывается пользователем и создает процесс.Представление может иметь некоторую логику, и обычно эта логика ретранслирует данные request.Таким образом, вы не можете вызывать flow.StartView и flow.View в другом месте, кроме как путем обращения к URL-адресу из браузера.

Для программной активации какого-либо процесса существует поток. Функция запуска - http://docs.viewflow.io/viewflow_core_node.html#viewflow.nodes.StartFunction

А для выполнения его из другого потока можно использовать поток. Хандлер - http://docs.viewflow.io/viewflow_core_node.html#viewflow.nodes.Handler

...