On Mon, Feb 27, 2012 at 10:28:20AM -0800, Reed Law wrote:
>
> Say I have an expression tree like this:
>
>       sequence :tag => 'submission' do
>         participant 'author', :task => 'overview'
>         participant 'author', :task => 'author_info'
>         participant 'author', :task => 'upload_files'
>         # ...
>       end
>
> I can use
> engine.process(wfid).expressions[1].h.original_tree.last.count and see
> that there are 10 expressions in the "submission" tag tree. What if I
> want to find out how much progress an author has made within the
> "submission" tree? So, for example, if the current task is
> "upload_files", the author is on step 3 of 10.
>
> I suppose I can put tags on each task (e.g. :tags => '1') but that
> seems unnecessary. I guess the best approach would be to have the
> workflow definition count the tasks and store it in a workitem field
> and then compare the number of remaining tasks with this number.

Hello,

you could directly do

  sequence :tag => 'submission' do
    author :task => 'overview', :progress => '1/10'
    author :task => 'author_info', :progress => '2/10'
    author :task => 'upload_files', :progress => '3/10'
    author :task => 'gap_analysis', :progress => '4/10'
    author :task => 'responsibilities', :progress => '5/10'
    author :task => 'disclosure', :progress => '6/10'
    author :task => 'copyright', :progress => '7/10'
    author :task => 'fees', :progress => '8/10'
    author :task => 'review', :progress => '9/10'
    author :task => 'submit', :progress => '10/10'
  end

It's easier (on ruote) than

    author :task => 'overview', tag => '1/10'

because ruote doesn't have to keep a copy of the tag.

Tags are more appropriate when you do things like

  sequence :tag => 'submission' do
    concurrence :tag => '1/2' do
      author :task => 'overview'
      editor :task => 'guide'
    concurrence :tag => '2/2' do
      author :task => 'terminate'
      editor :task => 'harass'
    end
  end

where the tags 'propagate' via the workitem. (as seen in
http://ruote.rubyforge.org/common_attributes.html#tag )

Note that if you're using Ruby process definitions, you could do

  sequence :tag => 'submission' do
    tasks = %w[
      overview author_info upload_files gap_analysis responsibilities
      disclosure copyright fees review submit
    ]
    tasks.each_with_index { |t, i|
      author :task => t, :progress => "#{i + 1}/#{tasks.length}
    }
  end

It's shorter, but perhaps not immediately graspable.

If your use case is "each time my user receives a workitem, I want to notify
him of his progress", you could do, as you have access to the workitem and
the dashboard:

  step = workitem.fei.child_id + 1
  exp = dashboard.fetch_flow_expression(workitem)
  parent_exp = dashboard.fetch_flow_expression(exp.parent_id)
  progress = "#{step}/#{parent_exp.tree[2].length}"

That's OK, but it adds two requests to the dashboard. You could do that right
when the workitem reaches the participant so that you don't have to repeat
the requests each time you display the workitem.

Another way would be to place in a workitem field the "parent length":

  sequence :tag => 'submission' do
    flag_length
    author :task => 'overview', :progress => '1/10'
    author :task => 'author_info', :progress => '2/10'
    author :task => 'upload_files', :progress => '3/10'
  end

where

  class FlagLength
    include Ruote::LocalParticipant

    def on_workitem
      parent_exp = fetch_flow_expression(flow_expression().parent_id)
      workitem['steps'] = parent_exp.tree[2].length - 1
      reply
    end
  end

then, when handling author workitems, you can do

  progress = "#{workitem.fei.child_id}/#{workitem.fields['steps']}"


I hope it helps, best regards,

--
John Mettraux - http://lambda.io/processi

-- 
you received this message because you are subscribed to the "ruote users" group.
to post : send email to [email protected]
to unsubscribe : send email to [email protected]
more options : http://groups.google.com/group/openwferu-users?hl=en

Reply via email to