Sha256: d628438cf9dfdbabd98afd7d74a32e7578c24f0fd70c915a7520b8c4e2045f5c

Contents?: true

Size: 1.89 KB

Versions: 31

Compression:

Stored size: 1.89 KB

Contents

module Para
  module Importer
    class Base < Para::Job::Base
      class_attribute :allows_import_errors

      attr_reader :file, :sheet

      def perform(file, options = {})
        @file = file
        options.reverse_merge!(extension: file.attachment_ext)
        @sheet = Roo::Spreadsheet.open(file.attachment_path, options)

        ActiveRecord::Base.transaction do
          (2..(sheet.last_row)).each do |index|
            begin
              progress!
              import_from_row(sheet.row(index))
            rescue ActiveRecord::RecordInvalid => error
              if allows_import_errors?
                add_errors_from(index, error.record)
              else
                raise
              end
            end
          end
        end

        save_errors!

        # Ensure that `.perform_now` returns the importer
        self
      end

      protected

      def total_progress
        sheet.last_row - 1
      end

      def import_from_row(row)
        raise '#import_from_row(row) must be defined'
      end

      def add_errors_from(index, record)
        # The file's row number starts at 1 and headers are striped, so we
        # add 2 to the index to obtain the row number
        row_name = I18n.t('para.import.row_error_prefix', number: index)

        record.errors.messages.each do |attribute, messages|
          messages.each do |message|
            full_message = record.errors.full_message(attribute, message)

            if (value = record.send(attribute)).presence
              full_message << ' (<b>' <<  value << '</b>)'
            end

            errors.add(row_name, full_message)
          end
        end
      end

      def allows_import_errors?
        !!self.class.allows_import_errors
      end

      def self.allow_import_errors!
        self.allows_import_errors = true
      end

      def headers
        @headers ||= sheet.row(1)
      end
    end
  end
end

Version data entries

31 entries across 31 versions & 1 rubygems

Version Path
para-0.12.5 lib/para/importer/base.rb
para-0.12.4 lib/para/importer/base.rb
para-0.12.3 lib/para/importer/base.rb
para-0.12.2 lib/para/importer/base.rb
para-0.12.1 lib/para/importer/base.rb
para-0.12.0 lib/para/importer/base.rb
para-0.11.4 lib/para/importer/base.rb
para-0.11.3 lib/para/importer/base.rb
para-0.11.2 lib/para/importer/base.rb
para-0.11.1 lib/para/importer/base.rb
para-0.11.0 lib/para/importer/base.rb
para-0.10.0 lib/para/importer/base.rb
para-0.9.4 lib/para/importer/base.rb
para-0.9.3.3 lib/para/importer/base.rb
para-0.9.3.2 lib/para/importer/base.rb
para-0.9.3.1 lib/para/importer/base.rb
para-0.9.2 lib/para/importer/base.rb
para-0.9.0 lib/para/importer/base.rb
para-0.8.15 lib/para/importer/base.rb
para-0.8.14 lib/para/importer/base.rb