menu

Nodes

API

class viewflow.rest.flow.StartFunction(func=None, **kwargs)

Bases: viewflow.nodes.func.StartFunction

StartNode that can be executed within you code.

Example:

class MyFlow(Flow):
    start = flow.StartFunction(this.create_request)

    def create_request(self, activation, **kwargs):
        activation.prepare()
        activation.done()

MyFlow.create_request.run(**kwargs)

Note

Any kwarg you pass of the run call will be passed to the function.

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.activation.StartActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Resolve internal this-references.

run(*args, **kwargs)

Execute the function task.

start_func_default(activation)

Default implementation for start function.

Do nothing, just create a new process instance.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Function(func, task_loader=None, **kwargs)

Bases: viewflow.nodes.func.Function

Node that can be executed within you code.

Example:

class MyFlow(Flow):
    my_task = flow.Function(this.perform_my_task)

    @method_decorator(flow.flow_func(task_loader=lambda flow_task, **kwargs: ... ))
    def perform_my_task(self, activation, **kwargs):
        activation.prepare()
        activation.done()

MyFlow.my_task.run(**kwargs)

Note

Any kwarg you pass of the run call will be passed to the function.

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.activation.FuncActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Resolve internal this-references.

run(*args, **kwargs)

Execute the function task.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Handler(handler, **kwargs)

Bases: viewflow.nodes.handler.Handler

Node that can be executed automatically after task was created.

In difference to Function a Handler is not explicitly called in code, but executes automatically.

Example:

def my_handler(activation):
    # Your custom code
    pass

class MyFlow(Flow):
    previous_task = flow.View(ProcessView)                 .Next(this.my_task)

    my_task = flow.Function(my_handler)                 .Next(this.End)

    end = flow.End()

Note

You don’t need to call prepare() or done() on the activation in you handler callback.

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.nodes.handler.HandlerActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Resolve internal this-references.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.If(cond, **kwargs)

Bases: viewflow.nodes.ifgate.If

Activates one of paths based on condition

Example:

check_decision = flow.If(lambda p: p.approved) \
    .OnTrue(this.approved) \
    .OnFalse(this.end)
Else(node)

Node activated if condition is False.

Then(node)

Node activated if condition is True.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.ifgate.IfActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Switch(**kwargs)

Bases: viewflow.nodes.switch.Switch

Activates first path with matched condition

Case(node, cond=None)

Node to activate if condition is True.

Parameters

cond – Calable[activation] -> bool

Default(node)

Last node to activate if no one other succeed.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.switch.SwitchActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Join(wait_all=True, **kwargs)

Bases: viewflow.nodes.join.Join

Waits for one or all incoming links and activates next path.

Join should be connected to one split task only.

Example:

join_on_warehouse = flow.Join() \
    .Next(this.next_task)
Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.join.JoinActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Split(**kwargs)

Bases: viewflow.nodes.split.Split

Activates outgoing path in-parallel depends on per-path condition.

Example:

split_on_decision = flow.Split() \
    .Next(check_post, cond=lambda p: p,is_check_post_required) \
    .Next(this.perform_task_always)
Always(node)

Activate that node unconditionally.

Shortcut for .Next without a condition

Next(node, cond=None)

Node to activate if condition is true.

Parameters

cond – Callable[activation] -> bool

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.split.SplitActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.AbstractJob(job, **kwargs)

Bases: viewflow.nodes.job.AbstractJob

Base task fro background jobs

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’undo’.

property job

Callable that should start the job in background.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/undo/ url.

class viewflow.rest.flow.StartSignal(signal, receiver, sender=None, **kwargs)

Bases: viewflow.nodes.signal.StartSignal

StartNode that connects to a django signal.

Example:

def my_start_receiver(activation, **signal_kwargs):
    activation.prepare()
    # You custom code
    activation.done()

class MyFlow(Flow):
    start = flow.StartSignal(post_save, my_start_receiver, sender=MyModelCls)

Note

The first argument of your receiver will be the activation.

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.activation.StartActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

on_signal(sender, **signal_kwargs)

Signal handler.

ready()

Resolve internal this-references. and subscribe to the signal.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Signal(signal, receiver, sender=None, task_loader=None, allow_skip=False, **kwargs)

Bases: viewflow.nodes.signal.Signal

Node that connects to a django signal.

Example:

create_model = flow.Signal(post_create, my_receiver, sender=MyModelCls)

Note

Other than the StartSignal you will need to provide activation for your receiver yourself. This can be done using the flow_signal() decorator.

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.activation.FuncActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

on_signal(sender, **signal_kwargs)

Signal handler.

ready()

Resolve internal this-references. and subscribe to the signal.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Start(*args, **kwargs)

Bases: viewflow.nodes.view.Start

Start process event

Example:

start = flow.Start(StartView, fields=["some_process_field"]) \
    .Available(lambda user: user.is_super_user) \
    .Activate(this.first_start)

In case of function based view:

start = flow.Start(start_process)

@flow_start_view()
def start_process(request, activation):
     if not activation.has_perm(request.user):
         raise PermissionDenied

     activation.prepare(request.POST or None)
     form = SomeForm(request.POST or None)

     if form.is_valid():
          form.save()
          activation.done()
          return redirect('/')
     return render(request, {'activation': activation, 'form': form})

Ensure to include {{ activation.management_form }} inside template, to proper track when task was started and other task performance statistics:

<form method="POST">
     {{ form }}
     {{ activation.management_form }}
     <button type="submit"/>
</form>
Available(owner=None, **owner_kwargs)

Make process start action available for the User.

Accepts user lookup kwargs or callable predicate :: User -> bool:

.Available(username='employee')
.Available(lambda user: user.is_super_user)
Next(node)

Next node to activate.

Permission(permission=None, auto_create=False, obj=None, help_text=None)

Make task available for users with specific permission.

Accepts permissions name or callable :: Callable[Activation] -> string:

.Permission('my_app.can_approve')
.Permission(lambda process: 'my_app.department_manager_{}'.format(process.department.pk))

Task specific permission could be auto created during migration:

# Creates `process_class.can_do_task_process_class` permission
do_task = View().Permission(auto_create=True)

# You can specify permission codename and description right here
# The following creates `processcls_app.can_execute_task` permission
do_task = View().Permission('can_execute_task', help_text='Custom text', auto_create=True)
activate(prev_activation, token)

Create task activation.

property activate_next_view

View for the admin to perform activate action.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.rest.activation.ManagedStartViewActivation

can_execute(user, task=None)

Check user permission to start a flow.

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

“Handle url_Type=’execute’.

If url_type is ‘guess’ and task can be executed by user, the ‘execute’ url is returned.

ready()

Insert additional flow permissions to the meta of the process model.

Permissions itself are created as usual during django database migration process.

start_view_class

alias of viewflow.rest.views.start.CreateProcessView

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Start view url.

property view

View to perform flow start.

class viewflow.rest.flow.View(*args, **kwargs)

Bases: viewflow.nodes.view.View

View task

Example:

task = flow.View(some_view) \
    .Permission('my_app.can_do_task') \
    .Next(this.next_task)

In case of function based view:

task = flow.Task(task)

@flow_start_view()
def task(request, activation):
     if not activation.flow_task.has_perm(request.user):
         raise PermissionDenied

     activation.prepare(request.POST or None)
     form = SomeForm(request.POST or None)

     if form.is_valid():
          form.save()
          activation.done()
          return redirect('/')
     return render(request, {'activation': activation, 'form': form})

Ensure to include {{ activation.management_form }} inside template, to proper track when task was started and other task performance statistics:

<form method="POST">
     {{ form }}
     {{ activation.management_form }}
     <button type="submit"/>
</form>
Assign(owner=None, **owner_kwargs)

Assign task to the User immediately on activation.

Accepts user lookup kwargs or callable :: Process -> User:

.Assign(username='employee')
.Assign(lambda process: process.created_by)
Next(node)

Next node to activate.

Permission(permission=None, auto_create=False, obj=None, help_text=None)

Make task available for users with specific permission.

Accepts permissions name or callable :: Callable[Activation] -> string:

.Permission('my_app.can_approve')
.Permission(lambda process: 'my_app.department_manager_{}'.format(process.department.pk))

Task specific permission could be auto created during migration:

# Creates `process_class.can_do_task_process_class` permission
do_task = View().Permission(auto_create=True)

# You can specify permission codename and description right here
# The following creates `processcls_app.can_execute_task` permission
do_task = View().Permission('can_execute_task', help_text='Custom text', auto_create=True)
activate(prev_activation, token)

Create task activation.

property activate_next_view

View for the admin to perform activate action.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.rest.activation.ManagedViewActivation

property assign_view

View to assign task to the user.

assign_view_class

alias of viewflow.rest.views.actions.AssignTaskView

calc_owner(activation)

Determine a user to auto-assign the task.

calc_owner_permission(activation)

Determine required permission to assign and execute this task.

calc_owner_permission_obj(activation)

Determine required permission to assign and execute this task.

can_assign(user, task)

Check if user can assign the task.

can_execute(user, task)

Check user premition to execute the task.

can_unassign(user, task)

Check if user can unassign the task.

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle assign, unassign and execute url_types.

If url_type is guess task check is it can be assigned, unassigned or executed. If true, the action would be returned as guess result url.

onCreate(ref)

Call a function when task created:

class MyFlow(Flow):
    approve = flow.View(...).OnCreate(this.on_approve_created)

    def on_approve_created(self, activation):
        if activation.task.owner:
            send_mail(
                'View task assigned to you','Here is the message.',
                'from@example.com', [activation.task.owner.email]
            )
ready()

Resolve internal this-references.

property unassign_view

View to unassign task from the user.

unassign_view_class

alias of viewflow.rest.views.actions.UnassignTaskView

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /assign/ and /unassign/ task urls.

property view

View to perform user task.

class viewflow.rest.flow.End(**kwargs)

Bases: viewflow.nodes.end.End

End process event.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.activation.EndActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Obsolete(*args, **kwargs)

Bases: viewflow.nodes.obsolete.Obsolete

Obsolete node removed from flow code definition, but loaded from db reference

This task can only be cancelled, without any additional actions

To enable obsolete nodes on flow, just include obsolete node in flow definition:

class MyFlow(Flow):
    ...
    obsolete = flow.Obsolete()

PRO Version only

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.obsolete.ObsoleteActivation

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

create_node(name)

Create real node instance for missing entry

detail_view_class

alias of viewflow.rest.views.detail.DetailTaskView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Return url for the task.

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

urls()

List of urls for flow node views.

class viewflow.rest.flow.StartSubprocess(func=None, **kwargs)

Bases: viewflow.nodes.subprocess.StartSubprocess

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activate_next_view_class

alias of viewflow.rest.views.actions.ActivateNextTaskView

activation_class

alias of viewflow.nodes.subprocess.StartSubprocessActivation

can_view(user, task)

Check if user has a view task detail permission.

property cancel_view

View for the admin to cancel a task.

cancel_view_class

alias of viewflow.rest.views.actions.CancelTaskView

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailSubprocessView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

property perform_view

View for the admin to re-execute a gate.

perform_view_class

alias of viewflow.rest.views.actions.PerformTaskView

ready()

Resolve internal this-references.

run(*args, **kwargs)

Execute the function task.

start_func_default(activation, parent_task)

Default implementation for start function.

Do nothing, just create a new process instance.

property undo_view

View for the admin to undo a task.

undo_view_class

alias of viewflow.rest.views.actions.UndoTaskView

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.Subprocess(subflow_task, **kwargs)

Bases: viewflow.nodes.subprocess.Subprocess

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.subprocess.SubprocessActivation

can_view(user, task)

Check if user has a view task detail permission.

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailSubprocessView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

urls()

Add /<process_pk>/<task_pk>/detail/ url.

class viewflow.rest.flow.NSubprocess(subflow_task, subitem_source, **kwargs)

Bases: viewflow.nodes.subprocess.NSubprocess

Next(node)

Next node to activate.

activate(prev_activation, token)

Create task activation.

activation_class

alias of viewflow.nodes.subprocess.NSubprocessActivation

can_view(user, task)

Check if user has a view task detail permission.

property detail_view

View for a task detail.

detail_view_class

alias of viewflow.rest.views.detail.DetailSubprocessView

get_task_url(task, url_type='guess', namespace='', **kwargs)

Handle for url_type=’detail’.

The end of url_type=`guess` chain. If all previous mixins does not return a value, the details page would be used.

ready()

Called when flow class setup finished.

Subclasses could perform additional initialization here.

urls()

Add /<process_pk>/<task_pk>/detail/ url.