Sha256: 0f15648a34e0d56b85600a08129499df9fd806ddd41baa24860672ab5235a02e

Contents?: true

Size: 2 KB

Versions: 63

Compression:

Stored size: 2 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.unscoped.where(:id => current_batch)

      missing = Array.new((current_batch - targets.map(&:id)).count) { nil }

      (targets + missing).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

63 entries across 63 versions & 1 rubygems

Version Path
foreman-tasks-8.1.4 app/lib/actions/bulk_action.rb
foreman-tasks-8.1.3 app/lib/actions/bulk_action.rb
foreman-tasks-8.1.2 app/lib/actions/bulk_action.rb
foreman-tasks-8.1.1 app/lib/actions/bulk_action.rb
foreman-tasks-8.1.0 app/lib/actions/bulk_action.rb
foreman-tasks-8.0.2 app/lib/actions/bulk_action.rb
foreman-tasks-8.0.1 app/lib/actions/bulk_action.rb
foreman-tasks-8.0.0 app/lib/actions/bulk_action.rb
foreman-tasks-7.2.1 app/lib/actions/bulk_action.rb
foreman-tasks-7.1.1 app/lib/actions/bulk_action.rb
foreman-tasks-7.2.0 app/lib/actions/bulk_action.rb
foreman-tasks-7.1.0 app/lib/actions/bulk_action.rb
foreman-tasks-6.0.3 app/lib/actions/bulk_action.rb
foreman-tasks-7.0.0 app/lib/actions/bulk_action.rb
foreman-tasks-6.0.2 app/lib/actions/bulk_action.rb
foreman-tasks-4.1.6 app/lib/actions/bulk_action.rb
foreman-tasks-5.2.3 app/lib/actions/bulk_action.rb
foreman-tasks-6.0.1 app/lib/actions/bulk_action.rb
foreman-tasks-5.2.2 app/lib/actions/bulk_action.rb
foreman-tasks-6.0.0 app/lib/actions/bulk_action.rb