首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许用户选择回滚到django-viewflow的流

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

Stack Overflow用户
提问于 2020-04-10 16:40:09
回答 1查看 205关注 0票数 1

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

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

以下是我到目前为止所做的工作:

flows.py

代码语言:javascript
复制
#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

这里的问题是,由于.next()节点,我硬编码了我希望回滚到的阶段,但是这并不理想,因为它将使用户能够“选择”他们要将其发送回的阶段……

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-04-10 21:14:25

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

有了Viewflow,重新启动决策可以实现为记录用户决策的flow.View,并遵循使用其他flow.StartFunction之一启动新的流实例的flow.Handler

另一种选择是使用flow.View记录用户决策,使用flow.Switch单步执行另一个任务。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61136760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档