ワークフローアプリ「Viewflow」を動かしてみる

「Viewflow」とは、ワークフローを作成することのできるdjangoアプリです。サンプルワークフローを導入する手順を記載しています。

導入手順

  1. Git bashを管理者として実行し、仮想環境を任意のフォルダに作成し、仮想環境を起動します。
python -m venv env
source env/Scripts/activate
  1. 必要なパッケージを仮想環境にインストールします。
pip install django==3.2.10
pip install django-viewflow==1.10.1
pip install django-material==1.10.0
  1. Djangoプロジェクトを作成し、プロジェクトのディレクトリに移動します。
django-admin startproject demo
cd demo
  1. helloworldというサンプルアプリを作成します。
python manage.py startapp helloworld
  1. demo/settings.pyをエディタで開き、INSTALLED_APPSmaterial以下の5つを追加します。
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'material',
    'material.frontend',
    'viewflow',
    'viewflow.frontend',
    'helloworld',                    
]
  1. demo/urls.pyをエディタで開き、WebアプリのURLを定義します。
from django.urls import include, path
from django.views import generic
from material.frontend import urls as frontend_urls

urlpatterns = [
    path(r'', generic.RedirectView.as_view(url='/workflow/', permanent=False)),
    path(r'', include(frontend_urls)),
]
  1. helloworld/models.pyをエディタで開き、textapprovedという2つの項目を含むモデルを作成します。
from django.db import models
from viewflow.models import Process

# Create your models here.
class HelloWorldProcess(Process):
    text = models.CharField(max_length=150)
    approved = models.BooleanField(default=False)
  1. helloworld/flows.pyをエディタで開き、フローを定義します。
from viewflow import flow, frontend
from viewflow.base import this, Flow
from viewflow.flow.views import CreateProcessView, UpdateProcessView

from .models import HelloWorldProcess

@frontend.register
class HelloWorldFlow(Flow):
    process_class = HelloWorldProcess

    start = (
        flow.Start(
            CreateProcessView,
            fields=["text"]
        ).Permission(
            auto_create=True
        ).Next(this.approve)
    )

    approve = (
        flow.View(
            UpdateProcessView,
            fields=["approved"]
        ).Permission(
            auto_create=True
        ).Next(this.check_approve)
    )

    check_approve = (
        flow.If(lambda activation: activation.process.approved)
        .Then(this.send)
        .Else(this.end)
    )

    send = (
        flow.Handler(
            this.send_hello_world_request
        ).Next(this.end)
    )

    end = flow.End()

    def send_hello_world_request(self, activation):
        print(activation.process.text)
  1. helloworldアプリのマイグレーションをします。
python manage.py makemigrations helloworld
python manage.py migrate
  1. アドミンユーザーを作成します。
winpty python manage.py createsuperuser
  1. サーバーを起動します。
python manage.py runserver
  1. 以下のURLをブラウザで開き、ワークフローのアプリが起動されていることを確認します。
http://127.0.0.1:8000