mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
Stop storing unit_value and unit_description on master variant
This commit is contained in:
@@ -75,12 +75,12 @@ module Spree
|
||||
)
|
||||
}
|
||||
|
||||
delegate_belongs_to :master, :images, :sku, :unit_value, :unit_description
|
||||
delegate_belongs_to :master, :images, :sku
|
||||
delegate :images_attributes=, to: :master
|
||||
|
||||
# Transient attributes used temporarily when creating a new product,
|
||||
# these values are persisted on the product's variant
|
||||
attr_accessor :price, :display_as
|
||||
attr_accessor :price, :display_as, :unit_value, :unit_description
|
||||
|
||||
after_create :set_master_variant_defaults
|
||||
after_save :save_master
|
||||
@@ -100,7 +100,8 @@ module Spree
|
||||
if: proc { Spree::Config[:products_require_tax_category] }
|
||||
|
||||
validates :variant_unit, presence: true
|
||||
validates :unit_value, presence: { if: ->(p) { %w(weight volume).include? p.variant_unit } }
|
||||
validates :unit_value, presence:
|
||||
{ if: ->(p) { %w(weight volume).include?(p.variant_unit) && new_record? } }
|
||||
validates :variant_unit_scale,
|
||||
presence: { if: ->(p) { %w(weight volume).include? p.variant_unit } }
|
||||
validates :variant_unit_name,
|
||||
@@ -396,6 +397,8 @@ module Spree
|
||||
variant.is_master = false
|
||||
variant.price = price
|
||||
variant.display_as = display_as
|
||||
variant.unit_value = unit_value
|
||||
variant.unit_description = unit_description
|
||||
variants << variant
|
||||
end
|
||||
|
||||
|
||||
@@ -59,13 +59,13 @@ module Spree
|
||||
if: proc { !is_master }
|
||||
|
||||
validates :unit_value, presence: true, if: ->(variant) {
|
||||
%w(weight volume).include?(variant.product&.variant_unit)
|
||||
%w(weight volume).include?(variant.product&.variant_unit) && !variant.is_master
|
||||
}
|
||||
|
||||
validates :unit_value, numericality: { greater_than: 0 }
|
||||
validates :unit_value, numericality: { greater_than: 0 }, if: proc { !is_master }
|
||||
|
||||
validates :unit_description, presence: true, if: ->(variant) {
|
||||
variant.product&.variant_unit.present? && variant.unit_value.nil?
|
||||
variant.product&.variant_unit.present? && variant.unit_value.nil? && !variant.is_master
|
||||
}
|
||||
|
||||
before_validation :set_cost_currency
|
||||
|
||||
@@ -35,8 +35,8 @@
|
||||
= f.label :unit_value, t(".value"), 'ng-disabled' => "!hasUnit(product)"
|
||||
%span.required *
|
||||
%input.fullwidth{ id: 'product_unit_value', 'ng-model' => 'product.master.unit_value_with_description', :type => 'text', placeholder: "eg. 2", 'ng-disabled' => "!hasUnit(product)" }
|
||||
%input{ type: 'hidden', 'ng-value': 'product.master.unit_value', "ng-init": "product.master.unit_value='#{@product.master.unit_value}'", name: 'product[unit_value]' }
|
||||
%input{ type: 'hidden', 'ng-value': 'product.master.unit_description', "ng-init": "product.master.unit_description='#{@product.master.unit_description}'", name: 'product[unit_description]' }
|
||||
%input{ type: 'hidden', 'ng-value': 'product.master.unit_value', "ng-init": "product.master.unit_value='#{@product.unit_value}'", name: 'product[unit_value]' }
|
||||
%input{ type: 'hidden', 'ng-value': 'product.master.unit_description', "ng-init": "product.master.unit_description='#{@product.unit_description}'", name: 'product[unit_description]' }
|
||||
= f.error_message_on :unit_value
|
||||
= render 'display_as', f: f
|
||||
.six.columns.omega{ 'ng-show' => "product.variant_unit_with_scale == 'items'" }
|
||||
|
||||
@@ -85,6 +85,7 @@ describe Spree::Core::ProductDuplicator do
|
||||
expect(new_product).to receive(:taxons=).with([])
|
||||
expect(new_product).to receive(:product_properties=).with([new_property])
|
||||
expect(new_product).to receive(:created_at=).with(nil)
|
||||
expect(new_product).to receive(:unit_value=).with(true)
|
||||
expect(new_product).to receive(:updated_at=).with(nil)
|
||||
expect(new_product).to receive(:deleted_at=).with(nil)
|
||||
expect(new_product).to receive(:master=).with(new_master_variant)
|
||||
|
||||
@@ -151,51 +151,51 @@ describe ProductImport::ProductImporter do
|
||||
carrots = Spree::Product.find_by(name: 'Carrots')
|
||||
expect(carrots.supplier).to eq enterprise
|
||||
expect(carrots.on_hand).to eq 5
|
||||
expect(carrots.price).to eq 3.20
|
||||
expect(carrots.unit_value).to eq 500
|
||||
expect(carrots.variants.first.price).to eq 3.20
|
||||
expect(carrots.variants.first.unit_value).to eq 500
|
||||
expect(carrots.variant_unit).to eq 'weight'
|
||||
expect(carrots.variant_unit_scale).to eq 1
|
||||
expect(carrots.on_demand).to_not eq true
|
||||
expect(carrots.variants.first.on_demand).to_not eq true
|
||||
expect(carrots.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
|
||||
potatoes = Spree::Product.find_by(name: 'Potatoes')
|
||||
expect(potatoes.supplier).to eq enterprise
|
||||
expect(potatoes.on_hand).to eq 6
|
||||
expect(potatoes.price).to eq 6.50
|
||||
expect(potatoes.unit_value).to eq 2000
|
||||
expect(potatoes.variants.first.price).to eq 6.50
|
||||
expect(potatoes.variants.first.unit_value).to eq 2000
|
||||
expect(potatoes.variant_unit).to eq 'weight'
|
||||
expect(potatoes.variant_unit_scale).to eq 1000
|
||||
expect(potatoes.on_demand).to_not eq true
|
||||
expect(potatoes.variants.first.on_demand).to_not eq true
|
||||
expect(potatoes.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
|
||||
pea_soup = Spree::Product.find_by(name: 'Pea Soup')
|
||||
expect(pea_soup.supplier).to eq enterprise
|
||||
expect(pea_soup.on_hand).to eq 8
|
||||
expect(pea_soup.price).to eq 5.50
|
||||
expect(pea_soup.unit_value).to eq 0.75
|
||||
expect(pea_soup.variants.first.price).to eq 5.50
|
||||
expect(pea_soup.variants.first.unit_value).to eq 0.75
|
||||
expect(pea_soup.variant_unit).to eq 'volume'
|
||||
expect(pea_soup.variant_unit_scale).to eq 0.001
|
||||
expect(pea_soup.on_demand).to_not eq true
|
||||
expect(pea_soup.variants.first.on_demand).to_not eq true
|
||||
expect(pea_soup.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
|
||||
salad = Spree::Product.find_by(name: 'Salad')
|
||||
expect(salad.supplier).to eq enterprise
|
||||
expect(salad.on_hand).to eq 7
|
||||
expect(salad.price).to eq 4.50
|
||||
expect(salad.unit_value).to eq 1
|
||||
expect(salad.variants.first.price).to eq 4.50
|
||||
expect(salad.variants.first.unit_value).to eq 1
|
||||
expect(salad.variant_unit).to eq 'items'
|
||||
expect(salad.variant_unit_scale).to eq nil
|
||||
expect(salad.on_demand).to_not eq true
|
||||
expect(salad.variants.first.on_demand).to_not eq true
|
||||
expect(salad.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
|
||||
buns = Spree::Product.find_by(name: 'Hot Cross Buns')
|
||||
expect(buns.supplier).to eq enterprise
|
||||
expect(buns.on_hand).to eq 7
|
||||
expect(buns.price).to eq 3.50
|
||||
expect(buns.unit_value).to eq 1
|
||||
expect(buns.variants.first.price).to eq 3.50
|
||||
expect(buns.variants.first.unit_value).to eq 1
|
||||
expect(buns.variant_unit).to eq 'items'
|
||||
expect(buns.variant_unit_scale).to eq nil
|
||||
expect(buns.on_demand).to eq true
|
||||
expect(buns.variants.first.on_demand).to eq true
|
||||
expect(buns.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
end
|
||||
end
|
||||
|
||||
@@ -94,7 +94,7 @@ describe "Product Import" do
|
||||
potatoes = Spree::Product.find_by(name: 'Potatoes')
|
||||
expect(potatoes.supplier).to eq enterprise
|
||||
expect(potatoes.on_hand).to eq 6
|
||||
expect(potatoes.price).to eq 6.50
|
||||
expect(potatoes.variants.first.price).to eq 6.50
|
||||
expect(potatoes.variants.first.import_date).to be_within(1.minute).of Time.zone.now
|
||||
|
||||
wait_until { page.find("a.button.view").present? }
|
||||
|
||||
@@ -103,8 +103,8 @@ describe '
|
||||
expect(product.supplier).to eq(@supplier)
|
||||
expect(product.variant_unit).to eq('weight')
|
||||
expect(product.variant_unit_scale).to eq(1000)
|
||||
expect(product.unit_value).to eq(5000)
|
||||
expect(product.unit_description).to eq("")
|
||||
expect(product.variants.first.unit_value).to eq(5000)
|
||||
expect(product.variants.first.unit_description).to eq("")
|
||||
expect(product.variant_unit_name).to eq("")
|
||||
expect(product.primary_taxon_id).to eq(taxon.id)
|
||||
expect(product.variants.first.price.to_s).to eq('19.99')
|
||||
@@ -113,7 +113,7 @@ describe '
|
||||
expect(product.shipping_category).to eq(shipping_category)
|
||||
expect(product.description).to eq("<p>A description...</p>")
|
||||
expect(product.group_buy).to be_falsey
|
||||
expect(product.master.unit_presentation).to eq("5kg")
|
||||
expect(product.variants.first.unit_presentation).to eq("5kg")
|
||||
end
|
||||
|
||||
it "creating an on-demand product" do
|
||||
|
||||
Reference in New Issue
Block a user