BPMN динамический рабочий процесс для Django - PullRequest
0 голосов
/ 01 марта 2019

Я хочу создать решение Django, рабочий процесс которого можно определять и изменять на лету, надеюсь, путем обновления диаграммы BPMN без необходимости изменения исходного кода и повторного развертывания.

Несмотря на то, что такая возможность уже былав течение долгого времени в Java (то есть Камунда и Бизаги), в контексте Django, это, кажется, не вызывало такого же интереса, так как обычные места, где я искал, не давали удовлетворительных ответов.Ответы на подобный вопрос от 2011 показали, что термин «рабочий процесс» настолько широк, что может означать много вещей.Тем не менее, после некоторого изучения он, кажется, сводится к двум подходам: основанные на Django рабочие процессы и BPMN-движки.

Проблема с рабочими процессами на основе Django , перечисленными в пакетах Github и Django , заключается в том, что она наиболее популярна / стабильна (например, Viewflow или ActivFlow ) предоставляет некую платформу для упрощения реализации ваших состояний и переходов, но, в конце концов, вам нужно вручную кодировать изменения каждый раз, когда заинтересованные стороны передумают о ходе процесса.Наиболее многообещающим вариантом, найденным в потрясающем списке Django , было django-river , которое, по крайней мере, сохраняет состояния и переходы рабочего процесса как модели Django в базе данных, поэтому вы можете вносить изменения вмуха.

Другой большой подход - двигатели BPMN.После работы с несколькими Python-чистыми (не Django) вариантами мне удается заставить SpiffWorkflow работать с использованием bpmn_dmn .Теперь я могу загрузить диаграммы .bpmn и таблицы .dmn, созданные с помощью Camunda Modeler, и запустить их через движок, чтобы получить конечное событие на основе некоторых параметров.

    from bpmn_dmn.bpmn_dmn import BPMNDMNXMLWorkflowRunner
    filename = 'rates.bpmn'
    runner = BPMNDMNXMLWorkflowRunner(filename, debugLog='DEBUG', debug=False)
    data = {'size': 150, 'type': 'SH', 'country': 'US'}
    runner.start(**data)
    res = runner.getEndEventName()
    print(res)

Это достаточно просто и достаточно полезно для запуска небольших рабочих процессов.которые не требуют вмешательства человека.Однако мне все еще нужно преодолеть разрыв между рабочим процессом, загруженным из определения диаграммы .bpmn, и переходами между состояниями Views / Forms / Model, присущими решению Django.

Пока что, похоже, лучше всего перевести спецификацию рабочего процесса из SpiffWorflow в записи состояний / переходов в базе данных моделей django-river, но мне интересно, есть ли лучший вариант там.

...