跳转到主要内容

django模型的有限状态机

项目描述

Build Status

描述

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绑定:pygraphvizyapgvb

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django-states2-1.6.10.tar.gz (19.4 kB 查看散列)

上传时间

构建分布

django_states2-1.6.10-py2-none-any.whl (26.6 kB 查看散列)

上传时间 Python 2

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面