Sha256: c4f2673c3807527d6e991de73917a3b201eca3b55321749a1bc942b7651a1a50

Contents?: true

Size: 1.95 KB

Versions: 62

Compression:

Stored size: 1.95 KB

Contents

module Workarea
  class BulkAction
    include ApplicationDocument

    field :query_id, type: String
    field :ids, type: Array, default: []
    field :exclude_ids, type: Array, default: []
    field :completed_at, type: Time

    before_validation :clean_blank_ids

    validate :something_to_act_on

    before_save :convert_query_to_ids

    delegate :params, :count, to: :admin_query

    index({ _type: 1 })
    index(
      { created_at: 1 },
      { expire_after_seconds: Workarea.config.bulk_action_expiration.to_i }
    )

    def perform!
      admin_query.each { |m| act_on!(m) }
    end

    def act_on!(model)
      raise NotImplementedError
    end

    def completed!
      update_attribute(:completed_at, Time.current)
    end

    def completed?
      !!completed_at
    end

    def reset_to_default!
      attributes
        .except(*BulkAction.fields.keys)
        .each { |a, _| send("reset_#{a}_to_default!") }

      self
    end

    # For reasonably sized queries, we want to store the ids of the results
    # to maintain the original result set acted on in the case that an
    # edit removes a result from the query during the bulk action.
    def convert_query_to_ids
      return if ids.present? || admin_query.results.total_pages > 10

      self.ids =
        Array.new(admin_query.results.total_pages) do |page|
          page_params = admin_query.params.merge(page: page + 1)
          page_search = admin_query.query.class.new(page_params)

          page_search.results.map do |model|
            id = model.to_global_id.to_param
            id unless id.in?(exclude_ids)
          end
        end.flatten.compact
    end

    def admin_query
      @admin_query ||= AdminQueryOperation.new(attributes)
    end

    private

    def something_to_act_on
      if query_id.blank? && ids.blank?
        errors.add(:base, I18n.t('workarea.errors.messages.nothing_to_act_on'))
      end
    end

    def clean_blank_ids
      ids.reject!(&:blank?)
    end
  end
end

Version data entries

62 entries across 62 versions & 1 rubygems

Version Path
workarea-core-3.4.13 app/models/workarea/bulk_action.rb
workarea-core-3.4.12 app/models/workarea/bulk_action.rb