Class: Spree::Import

Inherits:
Object
  • Object
show all
Includes:
NumberAsParam, NumberIdentifier
Defined in:
app/models/spree/import.rb

Direct Known Subclasses

Spree::Imports::Products

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.available_modelsArray<Class>

Returns the available models for the import



232
233
234
# File 'app/models/spree/import.rb', line 232

def available_models
  available_types.map(&:model_class)
end

.available_typesArray<Class>

Returns the available types for the import



226
227
228
# File 'app/models/spree/import.rb', line 226

def available_types
  Spree.import_types
end

.model_classObject

eg. Spree::Imports::Orders => Spree::Order

Raises:

  • (NameError)


243
244
245
246
247
248
249
# File 'app/models/spree/import.rb', line 243

def model_class
  klass = "Spree::#{to_s.demodulize.singularize}".safe_constantize

  raise NameError, "Missing model class for #{to_s}" unless klass

  klass
end

.type_for_model(model) ⇒ Class

Returns the type for the model



238
239
240
# File 'app/models/spree/import.rb', line 238

def type_for_model(model)
  available_types.find { |type| type.model_class.to_s == model.to_s }
end

Instance Method Details

#attachment_file_contentString

Returns the content of the attachment file



179
180
181
# File 'app/models/spree/import.rb', line 179

def attachment_file_content
  @attachment_file_content ||= attachment.attached? ? attachment.blob.download&.force_encoding('UTF-8') : nil
end

#complete?Boolean

Returns true if the import is complete



86
87
88
# File 'app/models/spree/import.rb', line 86

def complete?
  status == 'completed'
end

#create_mappingsObject

Creates mappings from the schema fields TODO: get mappings from the previous import if it exists, so user won’t have to map the same columns again



185
186
187
188
189
190
191
# File 'app/models/spree/import.rb', line 185

def create_mappings
  schema_fields.each do |schema_field|
    mapping = mappings.find_or_create_by!(schema_field: schema_field[:name])
    mapping.try_to_auto_assign_file_column(csv_headers)
    mapping.save!
  end
end

#create_rows_asyncvoid

This method returns an undefined value.

Creates rows asynchronously



195
196
197
# File 'app/models/spree/import.rb', line 195

def create_rows_async
  Spree::Imports::CreateRowsJob.set(wait: 2.seconds).perform_later(id)
end

#csv_headersArray<String>

Returns the headers of the csv file



168
169
170
171
172
173
174
175
# File 'app/models/spree/import.rb', line 168

def csv_headers
  return [] if attachment_file_content.blank?

  @csv_headers ||= ::CSV.parse_line(
    attachment_file_content,
    col_sep: preferred_delimiter
  )
end

#current_abilitySpree::Ability

Returns the current ability for the import



219
220
221
# File 'app/models/spree/import.rb', line 219

def current_ability
  @current_ability ||= Spree.ability_class.new(user, { store: store })
end

#display_nameString

Returns the display name for the import



158
159
160
# File 'app/models/spree/import.rb', line 158

def display_name
  "#{Spree.t(type.demodulize.pluralize.downcase)} #{number}"
end

#import_schemaSpree::ImportSchema

Returns the import schema for the import



102
103
104
# File 'app/models/spree/import.rb', line 102

def import_schema
  "Spree::ImportSchemas::#{type.demodulize}".safe_constantize.new
end

#mapped_fieldsArray<String>

Returns the mapped fields for the import schema



146
147
148
# File 'app/models/spree/import.rb', line 146

def mapped_fields
  @mapped_fields ||= mappings.mapped.where(schema_field: required_fields)
end

#mapping?Boolean

Returns true if the import is in mapping state



74
75
76
# File 'app/models/spree/import.rb', line 74

def mapping?
  status == 'mapping'
end

#mapping_done?Boolean

Returns true if the mapping is done



152
153
154
# File 'app/models/spree/import.rb', line 152

def mapping_done?
  mapped_fields.count == required_fields.count
end

#model_classClass

Returns the model class for the import



92
93
94
95
96
97
98
# File 'app/models/spree/import.rb', line 92

def model_class
  if type == 'Spree::Imports::Customers'
    Spree.user_class
  else
    "Spree::#{type.demodulize.singularize}".safe_constantize
  end
end

#process_rows_asyncvoid

This method returns an undefined value.

Processes rows asynchronously



201
202
203
# File 'app/models/spree/import.rb', line 201

def process_rows_async
  Spree::Imports::ProcessRowsJob.perform_later(id)
end

#processing?Boolean

Returns true if the import is processing or completed mapping



80
81
82
# File 'app/models/spree/import.rb', line 80

def processing?
  ['processing', 'completed_mapping'].include?(status)
end

#required_fieldsArray<String>

Returns the required fields for the import schema



140
141
142
# File 'app/models/spree/import.rb', line 140

def required_fields
  import_schema.required_fields
end

#row_processor_classClass

Returns the row processor class for the import



108
109
110
# File 'app/models/spree/import.rb', line 108

def row_processor_class
  "Spree::ImportRowProcessors::#{type.demodulize.singularize}".safe_constantize
end

#schema_fieldsArray<Hash>

Returns the fields for the import schema If model supports metafields, it will include the metafield definitions for this model



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'app/models/spree/import.rb', line 115

def schema_fields
  base_fields = import_schema.fields

  # Dynamically add metafield definitions if the model supports metafields
  if model_class_supports_metafields?
    metafield_fields = metafield_definitions_for_model.map do |definition|
      {
        name: definition.csv_header_name,
        label: definition.name
      }
    end
    base_fields + metafield_fields
  else
    base_fields
  end
end

#send_import_completed_emailObject



162
163
164
# File 'app/models/spree/import.rb', line 162

def send_import_completed_email
  # Spree::ImportMailer.import_done(self).deliver_later
end

#storeSpree::Store

Returns the store for the import



207
208
209
# File 'app/models/spree/import.rb', line 207

def store
  owner.is_a?(Spree::Store) ? owner : owner.respond_to?(:store) ? owner.store : Spree::Store.default
end

#unmapped_file_columnsArray<String>

Returns the file columns that are not mapped



134
135
136
# File 'app/models/spree/import.rb', line 134

def unmapped_file_columns
  csv_headers.reject { |header| mappings.mapped.exists?(file_column: header) }
end

#update_loader_in_import_viewObject



211
212
213
214
215
# File 'app/models/spree/import.rb', line 211

def update_loader_in_import_view
  return unless defined?(broadcast_update_to)

  broadcast_update_to "import_#{id}_loader", target: 'loader', partial: 'spree/admin/imports/loader', locals: { import: self }
end