Разрешение пользователям выбирать, какой поток откатиться до django -viewflow - PullRequest
1 голос
/ 10 апреля 2020

Привет всем, я использую viewflow в качестве движка рабочего процесса в моем django проекте. Я хотел знать, можно ли разрешить пользователям «выбирать», к какому потоку они будут sh откатываться, если, скажем, утверждение было отклонено.

enter image description here

Здесь директор выбирает «Отклонить», однако заканчивать поток здесь не имеет смысла, вместо этого он должен быть можно выбрать «откат», чтобы пользователям не нужно было перезапускать весь процесс снова.

Вот что я сделал до сих пор:

flows.py

#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 () я жестко закодировал фазу в котором я должен выполнить откат sh, однако это не идеально, поскольку для пользователя было бы оптимальным иметь возможность «выбрать», на какую фазу он должен был отправить его обратно ...

Поэтому У меня есть два вопроса: 1. Является ли мой метод отката правильным? (может быть, есть лучший способ сделать откат вместо вызова процесса и жесткого кода, обновляющего поля) 2. Есть ли способ выбрать, к какой части потока пользователь будет sh откатываться?

Спасибо, и я был бы очень признателен за любые советы

1 Ответ

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

На самом деле, хорошим примером практики BPMN является завершение потока sh как можно скорее, и оно не включает сложные циклы. Это делает код простым, понятным и простым в поддержке. Упрощает создание отчетов и сохраняет все версии данных в разных экземплярах процесса.

. С помощью потока потока решение о повторном запуске потока может быть реализовано как поток. Представление, которое записывает решение пользователя и следующий поток. Обработчик, который запускает новый экземпляр потока, используя один из дополнительных потоков. .StartFunction

flow sample

Другой вариант - использовать flow.View для записи решения пользователя и flow.Switch, чтобы перейти к другой задаче.

Как правило, BPMN разделяется. пользовательские задачи и шлюзы, которые приводят к записи всех решений, перед их использованием.

...