django模型的有限状态机
项目描述
描述
django模型的有限状态机。为模型定义状态图并记住每个对象的状态。可以记录对象的转换状态。
安装
pip install django-states2
使用示例
要使用状态机,您应该在模型中添加一个状态字段
from django_states.fields import StateField
from django_states.machine import StateMachine, StateDefinition, StateTransition
class PurchaseStateMachine(StateMachine):
log_transitions = True
# possible states
class initiated(StateDefinition):
description = _('Purchase initiated')
initial = True
class paid(StateDefinition):
description = _('Purchase paid')
def handler(self, instance):
code_to_execute_when_arriving_in_this_state()
class shipped(StateDefinition):
description = _('Purchase shipped')
# state transitions
class mark_paid(StateTransition):
from_state = 'initiated'
to_state = 'paid'
description = 'Mark this purchase as paid'
class ship(StateTransition):
from_state = 'paid'
to_state = 'shipped'
description = 'Ship purchase'
def handler(transition, instance, user):
code_to_execute_during_this_transition()
def has_permission(transition, instance, user):
return true_when_user_can_make_this_transition()
class Purchase(StateModel):
purchase_state = StateField(machine=PurchaseStateMachine, default='initiated')
... (other fields for a purchase)
如果启用了log_transitions,则创建另一个模型。所有内容都应该与South_迁移兼容。
注意:如果您在South中创建DataMigration,请记住使用obj.save(no_state_validation=True)
使用示例
p = Purchase()
# Will automatically create state object for this purchase, in the
# initial state.
p.save()
p.get_purchase_state_info().make_transition('mark_paid', request.user) # User parameter is optional
p.state # Will return 'paid'
p.get_purchase_state_info().description # Will return 'Purchase paid'
# Returns an iterator of possible transitions for this purchase.
p.get_purchase_state_info().possible_transitions()
# Which can be used like this..
[x.get_name() for x in p.possible_transitions]
为了更好的转换控制,覆盖
has_permission(self, instance, user): 检查此用户是否允许进行此转换。
handler(self, instance, user): 此转换期间要运行的代码。如果在其中抛出异常,则不会进行转换。
获取处于特定状态的所有对象
Purchase.objects.filter(state='initiated')
验证
您可以在执行状态转换之前需要通过测试。嗯,您可以添加2个:一个是基于当前用户(has_permission)的一个通用(validate)。
因此,在StateTransition-对象上,您需要指定一个额外的validate函数(签名是validate(cls, instance))。这应该产生TransitionValidationError,这样您就可以返回需要通过转换之前发生多个错误。
“has_permission”函数(签名:has_permission(transition, instance, user))应检查给定用户是否有权进行转换。例如,超级用户可以管理所有评论,而其他用户只能管理他们自己的博客文章中的评论。
组
有时您希望将几个状态组合在一起,因为对于某个视图(或其他内容)来说,它处于哪个状态并不重要。我们支持两种不同的状态组:包含(只有这些)或排除(除了这些)
class is_paid(StateGroup):
states = ['paid', 'shipped']
class is_paid(StateGroup):
exclude_states = ['initiated']
状态图
您可以通过运行graph_states管理命令来获取状态图。
python manage.py graph_states myapp.Purchase.state
这需要graphviz以及graphviz的python绑定:pygraphviz和yapgvb。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
django-states2-1.6.10.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 367127203870c90dcc613b52b7a3a7ffabec86cabb2945ff941b11ff7eae22e9 |
|
MD5 | 9d7f5408f1c59ebe041c67d3d625324e |
|
BLAKE2b-256 | 83872668af768ad68f9b9791d1c1c984d291d60da236364ebb27af13d11d0bcc |
django-states2-1.6.10-py2-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 866473e62ebbb0c1848adf4b1563b82a9ee75bde14c94f293807502156d37854 |
|
MD5 | ff2a8f17404bacc59642c637b916bab9 |
|
BLAKE2b-256 | 08270a75a4ff7afd34434664c1eba36522c594161b9f44d07784ada4725e09e4 |