class Spree::ProductDuplicator

Attributes

product[RW]

Public Class Methods

new(product, include_images = @@clone_images_default) click to toggle source
# File lib/spree/core/product_duplicator.rb, line 8
def initialize(product, include_images = @@clone_images_default)
  @product = product
  @include_images = include_images
end

Public Instance Methods

duplicate() click to toggle source
# File lib/spree/core/product_duplicator.rb, line 13
def duplicate
  new_product = duplicate_product

  # don't dup the actual variants, just the characterising types
  new_product.option_types = product.option_types if product.has_variants?

  # allow site to do some customization
  new_product.send(:duplicate_extra, product) if new_product.respond_to?(:duplicate_extra)
  new_product.save!
  new_product
end

Protected Instance Methods

duplicate_image(image) click to toggle source
# File lib/spree/core/product_duplicator.rb, line 59
def duplicate_image(image)
  new_image = image.dup
  new_image.attachment.attach(image.attachment.blob)
  new_image.save!
  new_image
end
duplicate_master() click to toggle source
# File lib/spree/core/product_duplicator.rb, line 40
def duplicate_master
  master = product.master
  master.dup.tap do |new_master|
    new_master.sku = sku_generator(master.sku)
    new_master.deleted_at = nil
    new_master.images = master.images.map { |image| duplicate_image image } if @include_images
    new_master.price = master.price
    new_master.currency = master.currency
  end
end
duplicate_product() click to toggle source
# File lib/spree/core/product_duplicator.rb, line 27
def duplicate_product
  product.dup.tap do |new_product|
    new_product.name = "COPY OF #{product.name}"
    new_product.taxons = product.taxons
    new_product.created_at = nil
    new_product.deleted_at = nil
    new_product.updated_at = nil
    new_product.product_properties = reset_properties
    new_product.master = duplicate_master
    new_product.variants = product.variants.map { |variant| duplicate_variant variant }
  end
end
duplicate_variant(variant) click to toggle source
# File lib/spree/core/product_duplicator.rb, line 51
def duplicate_variant(variant)
  new_variant = variant.dup
  new_variant.sku = sku_generator(new_variant.sku)
  new_variant.deleted_at = nil
  new_variant.option_values = variant.option_values.map { |option_value| option_value }
  new_variant
end
reset_properties() click to toggle source
# File lib/spree/core/product_duplicator.rb, line 66
def reset_properties
  product.product_properties.map do |prop|
    prop.dup.tap do |new_prop|
      new_prop.created_at = nil
      new_prop.updated_at = nil
    end
  end
end
sku_generator(sku) click to toggle source
# File lib/spree/core/product_duplicator.rb, line 75
def sku_generator(sku)
  "COPY OF #{Variant.unscoped.where('sku like ?', "%#{sku}").order(:created_at).last.sku}"
end