Я до сих пор не знаю, как правильно это сделать. Но вот что я сделал на данный момент:
flows.py
class Pipeline(Flow):
process_class = PaymentVoucherProcess
lock_impl = lock.select_for_update_lock
#process starts here
start = flow.Start(
PVStartView,
task_title="Processing New Voucher"
).Permission("cash.can_start_voucher"
).Next(this.approve_by_preparer)
#preparer will approve
approve_by_preparer = flow.View(
UpdateProcessView,
form_class=PreparerApproveForm,
task_title="Approval By Preparer"
).Assign(lambda act: act.process.assign_preparer
).Permission("cash.preparer"
).Next(this.check_preparer)
#system check point
check_preparer = flow.If(
cond=lambda act: act.process.preparer,
task_title="Processing",
).Then(this.documents).Else(this.roll_back)
roll_back = flow.Handler(this.roll_back_call).Next(this.approve_by_preparer)
#preparer will upload supporting documents
documents = flow.View(
UploadView,
task_title="Recieving Supporting Documents"
).Assign(lambda act: act.process.assign_preparer
).Permission("cash.preparer"
).Next(this.preparer)
#preparer will sign
preparer = flow.View(
PreparerSignature,
task_title="Signature By Preparer"
).Assign(lambda act: act.process.assign_preparer
).Permission("cash.preparer"
).Next(this.approve_by_verifier)
#verifier will sign
approve_by_verifier = flow.View(
UpdateProcessView,
form_class=VerifierApproveForm,
task_title="Approval By Verifier"
).Assign(lambda act: act.process.assign_verifier
).Permission("cash.verifier"
).Next(this.check_verifier)
#system check point
check_verifier = flow.If(
cond=lambda act: act.process.verifier,
task_title="Processing"
).Then(this.verifier).Else(this.roll_back)
#bunch of code here and inbetween
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
По сути, этот обработчик отката заключается в том, что когда программа выясняет, что Person 'B' не одобряет , он запустит код roll_back, который ищет процесс и «обновляет» его, помечая все внешние отношения как недействительные и удаляя все предыдущие одобрения. Это действительно супер неортодоксально и хакерски, но пока что это работает, пожалуйста, дайте мне знать ваши комментарии и поделитесь со мной вашими ответами.
Я до сих пор не понял, как именно можно «редактировать» или «редактировать». отмените или «переназначьте» его задачи, документации не так много, и я действительно удивлен, что люди не сталкиваются с такими проблемами, так как там остро не хватает контента. В любом случае, я надеюсь увидеть конструктивную обратную связь!