允许用户选择要回滚到django viewflow的流

允许用户选择要回滚到django viewflow的流,django,django-views,workflow,django-viewflow,Django,Django Views,Workflow,Django Viewflow,嘿,我一直在django项目中使用viewflow作为工作流引擎。我想知道,如果批准被拒绝,是否可以允许用户“选择”他们希望回滚到的流 在这里,主管选择“拒绝”,但是在这里结束流程没有意义,相反,它应该是一个可选择的“回滚”,这样,下线的人员就不需要再次重新启动整个流程 以下是我迄今为止所做的工作: 流.py #主管将批准或不批准 由\u主管批准\u=flow.View( UpdateProcessView, form_class=董事批准表格, 任务标题=“董事批准” ).许可(“现金.董事

嘿,我一直在django项目中使用viewflow作为工作流引擎。我想知道,如果批准被拒绝,是否可以允许用户“选择”他们希望回滚到的流

在这里,主管选择“拒绝”,但是在这里结束流程没有意义,相反,它应该是一个可选择的“回滚”,这样,下线的人员就不需要再次重新启动整个流程

以下是我迄今为止所做的工作:

流.py
#主管将批准或不批准
由\u主管批准\u=flow.View(
UpdateProcessView,
form_class=董事批准表格,
任务标题=“董事批准”
).许可(“现金.董事”
).下一步(此.检查\u主管)
检查\u director=flow.If(
cond=lambda act:act.process.director,
任务标题=“处理”
).Then(this.send).Else(this.justification)
#回滚的理由。
对齐=flow.View(
辩护意见,
任务标题=“回滚的理由”
).Assign(lambda act:self.request.user
).Permission(自动创建=True
).下一步(此.回滚)
回滚=flow.Handler(this.roll_back_调用)。下一步(this.approve_by_preparer)##0:
对于esig中的sig:
sig.void=True
sig.save()
如果len(docu)>0:
对于docu中的文档:
doc.void=True
文件保存()
activation.process.preparer=False
activation.process.verifier=False
activation.process.treasury=False
activation.process.director=False
这里的问题是,由于.next()节点,我硬编码了我希望回滚到的阶段,但是这并不理想,因为用户能够“选择”将其发送回的阶段是最佳的

因此,我有两个问题: 1.我的回滚方法正确吗?(也许有更好的方法进行回滚,而不是调用流程和硬代码刷新字段) 2.有没有办法选择用户希望回滚到流的哪一部分


谢谢,我非常感谢任何人的建议

事实上,良好的BPMN实践模式是尽快完成流程,并且不涉及复杂的循环。这使得代码简单、干净、易于支持。简化报告并将所有数据修订保留在不同的流程实例中

使用Viewflow,流重新启动决策可以实现为记录用户决策的flow.View和使用附加flow.StartFunction之一启动新流实例的flow.Handler

另一个选项是使用flow.View记录用户决策和流程。切换到另一个任务


通常,BPMN将用户任务和网关分离,这导致在使用之前记录所有决策。

实际上,良好的BPMN实践模式是尽快完成流程,并且不涉及复杂的周期。这使得代码简单、干净、易于支持。简化报告并将所有数据修订保留在不同的流程实例中

使用Viewflow,流重新启动决策可以实现为记录用户决策的flow.View和使用附加flow.StartFunction之一启动新流实例的flow.Handler

另一个选项是使用flow.View记录用户决策和流程。切换到另一个任务


通常,BPMN将用户任务和网关分开,这导致所有决策在使用前都被记录下来。

嘿,非常感谢您抽出时间回答我的问题。关于第一个选项,它将被记录为一个全新的过程,对吗?我担心用户会感到困惑,因为想到1个流程=1个项目和一个集中的地方(流程详细信息页面)更直观,在那里他们可以看到处理阶段做出的所有决定。在这里,我非常感谢您抽出时间回答我的问题。关于第一个选项,它将被记录为一个全新的过程,对吗?我担心用户会感到困惑,因为它更直观地考虑1个流程=1个项目和一个集中的位置(流程详细信息页面),在那里他们可以看到在处理阶段做出的所有决策
#director will approve or dont approve
approve_by_director = flow.View(
    UpdateProcessView,
    form_class=DirectorApproveForm,
    task_title="Approval By Director"
).Permission("cash.director"
).Next(this.check_director)

check_director = flow.If(
    cond=lambda act: act.process.director,
    task_title="Processing"
).Then(this.send).Else(this.justification)

#justifications for the roll back.
justification = flow.View(
    JustificationView,
    task_title="Justifications for Roll Back"
).Assign(lambda act: self.request.user
).Permission(auto_create=True
).Next(this.roll_back)

roll_back = flow.Handler(this.roll_back_call).Next(this.approve_by_preparer)  ##<---- here , i am just sending it back to the 'preparer' , however it would be great if this could be dynamic!

end = flow.End()

def roll_back_call(self, activation):
    esig = ESignatures.objects.filter(paymentVoucherProcess = activation.process).filter(voided = False)
    docu = Attachment.objects.filter(paymentVoucherProcess = activation.process).filter(voided = False)
    if len(esig) > 0 :
        for sig in esig:
            sig.voided = True
            sig.save()
    if len(docu) > 0 :
        for doc in docu:
            doc.voided = True
            doc.save()
    activation.process.preparer = False
    activation.process.verifier = False
    activation.process.treasury = False
    activation.process.director = False