Sha256: 5b404ce63d47157c55ac9c2f822758e5dd41f86f84b72d181668985eaec8bed8

Contents?: true

Size: 1.9 KB

Versions: 30

Compression:

Stored size: 1.9 KB

Contents

module Actions
  class BulkAction < Actions::ActionWithSubPlans
    include Dynflow::Action::WithBulkSubPlans

    # == Parameters:
    # actions_class::
    #   Class of action to trigger on targets
    # targets::
    #   Array of objects on which the action_class should be triggered
    # *args::
    #   Arguments that all the targets share
    def plan(action_class, targets, *args)
      check_targets!(targets)
      plan_self(:action_class => action_class.to_s,
                :target_ids => targets.map(&:id),
                :target_class => targets.first.class.to_s,
                :args => args)
    end

    def run(event = nil)
      super unless event == Dynflow::Action::Skip
    end

    def humanized_name
      if task.sub_tasks.first
        task.sub_tasks.first.humanized[:action]
      else
        _('Bulk action')
      end
    end

    def rescue_strategy
      Dynflow::Action::Rescue::Skip
    end

    def humanized_input
      a_sub_task = task.sub_tasks.first
      if a_sub_task
        [a_sub_task.humanized[:action].to_s.downcase] +
          Array(a_sub_task.humanized[:input]) + ['...']
      end
    end

    # @api override when the logic for the initiation of the subtasks
    #      is different from the default one
    def create_sub_plans
      action_class = input[:action_class].constantize
      target_class = input[:target_class].constantize
      targets = target_class.where(:id => current_batch)

      targets.map do |target|
        trigger(action_class, target, *input[:args])
      end
    end

    def check_targets!(targets)
      raise Foreman::Exception, N_('Empty bulk action') if targets.empty?
      if targets.map(&:class).uniq.length > 1
        raise Foreman::Exception, N_('The targets are of different types')
      end
    end

    def batch(from, size)
      input[:target_ids].slice(from, size)
    end

    def total_count
      input[:target_ids].count
    end
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
foreman-tasks-0.14.3 app/lib/actions/bulk_action.rb
foreman-tasks-0.14.2 app/lib/actions/bulk_action.rb
foreman-tasks-0.14.1 app/lib/actions/bulk_action.rb
foreman-tasks-0.11.3 app/lib/actions/bulk_action.rb
foreman-tasks-0.14.0 app/lib/actions/bulk_action.rb
foreman-tasks-0.13.4 app/lib/actions/bulk_action.rb
foreman-tasks-0.13.3 app/lib/actions/bulk_action.rb
foreman-tasks-0.13.2 app/lib/actions/bulk_action.rb
foreman-tasks-0.13.1 app/lib/actions/bulk_action.rb
foreman-tasks-0.13.0 app/lib/actions/bulk_action.rb
foreman-tasks-0.12.2 app/lib/actions/bulk_action.rb
foreman-tasks-0.11.2 app/lib/actions/bulk_action.rb
foreman-tasks-0.12.1 app/lib/actions/bulk_action.rb
foreman-tasks-0.12.0 app/lib/actions/bulk_action.rb
foreman-tasks-0.11.1 app/lib/actions/bulk_action.rb
foreman-tasks-0.10.9 app/lib/actions/bulk_action.rb
foreman-tasks-0.11.0 app/lib/actions/bulk_action.rb
foreman-tasks-0.10.8 app/lib/actions/bulk_action.rb
foreman-tasks-0.10.7 app/lib/actions/bulk_action.rb
foreman-tasks-0.10.6 app/lib/actions/bulk_action.rb