Как сделать шаг назад с помощью функции редактирования в viewflow - PullRequest
0 голосов
/ 07 апреля 2020

В настоящее время я пытаюсь воссоздать этот поток:

enter image description here

Пока мой поток идет только в 1 направлении, нет возможности для возвращаясь на шаг назад, скажем, человек «b» обнаруживает ошибку, введенную человеком «a», я могу sh позволить человеку «b» отправить задание человеку «a», чтобы они можете «редактировать» свою запись. Однако в потоке представления, похоже, нет функции редактирования, есть ли причина для этого?

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.documents)

    #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)

    #system check point
    check_treasury = flow.If(
        cond=lambda act: act.process.preparer,
        task_title="Processing",
    ).Then(this.approve_by_verifier).Else(this.end)

    #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.verifier)
    #there is more but not relevant 

Я понимаю, что есть некоторые "отменить" смешанные представления, но я не уверен, как это реализуется в моем случае и как все организовано, пожалуйста Помогите!

1 Ответ

0 голосов
/ 07 апреля 2020

Я до сих пор не знаю, как правильно это сделать. Но вот что я сделал на данный момент:

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, который ищет процесс и «обновляет» его, помечая все внешние отношения как недействительные и удаляя все предыдущие одобрения. Это действительно супер неортодоксально и хакерски, но пока что это работает, пожалуйста, дайте мне знать ваши комментарии и поделитесь со мной вашими ответами.

Я до сих пор не понял, как именно можно «редактировать» или «редактировать». отмените или «переназначьте» его задачи, документации не так много, и я действительно удивлен, что люди не сталкиваются с такими проблемами, так как там остро не хватает контента. В любом случае, я надеюсь увидеть конструктивную обратную связь!

...