如何跟踪线性工作流程中的步骤

时间:2019-09-02 12:08:24

标签: python django django-models

我有一个工作流中的任务模型。该任务具有一个ManyToMany字段,允许用户添加可以批准任务中每个步骤的批准者。

class Task(models.Model):
    approvers = models.ManyToManyField(
        get_user_model(),
        through='TaskStep'
    )

我使用OrderedModel作为中介模型来跟踪每个批准的顺序,目的是在他们签署任务时将任务从一个批准者线性传递给下一个批准者:

class TaskStep(OrderedModel):

    approver = models.ForeignKey(
        get_user_model(), null=True, on_delete=models.SET_NULL
    )
    task = models.ForeignKey(Task, null=True, on_delete=models.SET_NULL)
    order_with_respect_to = 'task'
    status = models.BooleanField()

假设每个步骤只是approvers字段中每个批准者的对/错确认,最简单的方法是跟踪任务批准在哪个TaskStep上进行?

例如是否要像Task一样向Step添加一个字段,并尝试通过approvers__init__ ManyToMany字段变成一个列表?

用例示例

  • 用户定义一个任务,并在ManyToMany字段中列出4个批准者
  • 这些批准者的订单是通过OrderedModel设置的。
    • 例如批准人1->批准人2->批准人3->批准人4
  • 然后,工作流按照定义的顺序依次将任务传递给每个审批者。每个批准人的TaskStep状态为False,直到他们确认为止,并将其设置为True

我需要一种方法来跟踪任务正在执行的步骤,以便将其定向到适当的批准人(用户)。

编辑:

具体地说,我需要一个解决方案,以便可以为给定的用户创建查询,该查询返回作为当前(活动)步骤分配给他们的所有任务。我认为最好的方法可能是在Task模型中创建一个字段,并对其进行更新以返回与该步骤相关的用户,但是我不确定如何执行此操作。

1 个答案:

答案 0 :(得分:0)

我们可以获得status=False first 任务:

next_step = TaskStep.objects.filter(task=my_task, status=False).first()

或通过 my_task 本身:

my_task.taskstep_set.filter(status=False).first()

OrderedModel有一个order字段,并按该字段排序,因此.first()将返回订单中的第一个字段。如果不存在这样的None,它将返回TaskStep

因此,此TaskStep引用了需要批准的下一个批准人。