一个简单的数据库驱动工作流引擎
项目描述
本项目旨在提供一个简单的数据库驱动工作流引擎,您可以使用它来配置和自动化复杂的操作。它基于在运行时通过管理界面定义的可配置状态机。
工作流定义
工作流由以下对象定义
- 工作流:
主对象,它必须有一个唯一的 名称
- 状态:
对象,代表图中的节点,它们是 工作流 特定的
- 转换:
转换可以是手动或自动的,自动转换在对象达到初始状态后异步执行。当然,一次只能执行一个自动转换,并且它通常会更改状态,使得为初始状态定义的其他转换无法再执行。执行哪个转换取决于 优先级 和相关条件
- 条件:
对象,根据正在进行的进程的对象属性、用户或通用查询限制转换的执行。条件是分层的,可以使用特殊布尔条件进行组合
- 函数:
对于每个类型为函数的条件 C,必须有一个具有值 C 的函数。该函数指定将用于检查条件是否满足的Python函数。
- 函数参数:
每个函数参数都以关键字参数的形式传递给其函数
- 回调函数:
回调函数定义了一个Python函数,当发生转换时应该调用该函数,通常用于必要的副作用。如果execute_async为False,则回调函数将在同一事务内和对象状态更新之前调用,或者在独立线程中状态更新后调用
- 回调参数:
每个回调参数都以关键字参数的形式传递给其回调函数
以下是一个简单的3状态工作流程示例,其中包含手动和自动转换的混合
from django.contrib.auth.models import User from django_workflow import workflow from django_workflow.models import Workflow, State, Transition, Condition, Function, FunctionParameter, Callback, CallbackParameter # create the main workflow object wf = Workflow.objects.create(name="Test_Workflow", object_type="django.contrib.auth.models.User") # create 3 states s1 = State.objects.create(name="state 1", workflow=wf, active=True, initial=True) s2 = State.objects.create(name="state 2", workflow=wf, active=True) #the final state is defined as inactive so that its skipped when scanning for automatic transitions s3 = State.objects.create(name="state 3", workflow=wf, active=False) # create the transitions, we have 2 automatic transitions from state 1 to state 2, # the first is going to be executed despite t4 having a better priority because # t1 has a lower automatic_delay t1 = Transition.objects.create(name="auto_fast", initial_state=s1, final_state=s2, automatic=True, automatic_delay=1.0/24.0/3600.0, priority=2) t4 = Transition.objects.create(name="auto_slow", initial_state=s1, final_state=s3, automatic=True, automatic_delay=1.0 / 24.0, priority=1) t2 = Transition.objects.create(initial_state=s1, final_state=s3, automatic=False) t3 = Transition.objects.create(initial_state=s2, final_state=s3, automatic=False) # we set t3 to be executed only by superusers this can be done with a object_attribute_value conditon c1 = Condition.objects.create(condition_type="function", transition=t3) f1 = Function.objects.create( function_name="object_attribute_value", function_module="django_workflow.conditions", condition=c1 ) p11 = FunctionParameter.objects.create(function=f1, name="attribute_name", value="is_superuser") p12 = FunctionParameter.objects.create(function=f1, name="attribute_value", value="True") # we want to print out if transition 1 was executed, this can be done with a callback cb1 = Callback.objects.create(transition=t1, function_name="_print", function_module="django_workflow.tests", order=1) cp11 = CallbackParameter.objects.create(callback=cb1, name="text", value="Transition 1 Executed")
状态和转换
一旦定义了工作流程,就可以向工作流程中添加对象
obj = MyModelObject.objects.get(name="MyObjectName") wf = workflow.get_workflow("Test_Workflow") wf.add_object(obj.id)
add_object方法除了在状态机中开始跟踪对象外,还触发初始状态中可用的任何自动转换
要检查对象的状态,可以使用
workflow.get_object_state("Test_Workflow", object_id)
要检查可用的转换,例如,要知道可以在UI中显示哪些按钮,您可以调用
workflow.get_available_transitions("Test_Workflow", user, object_id)
其中user应该是希望执行操作的Django用户。将user传递给每个条件和回调,因此检查授权以及执行特定任务(例如通知)很有用
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
django-wf-0.9.1.tar.gz (14.0 kB 查看散列)
构建分发
django_wf-0.9.1-py2.7.egg (32.0 kB 查看散列)