From 2db2fbcadef811e3e3efd245be54769f3d75a6f5 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Thu, 2 Aug 2012 14:45:27 +1000 Subject: [PATCH] Change set_variant_attribute to set_variant_attributes, implement it on Order --- .../spree/orders_controller_decorator.rb | 4 +--- app/models/spree/line_item_decorator.rb | 2 ++ app/models/spree/order_decorator.rb | 7 +++++++ spec/controllers/orders_controller_spec.rb | 2 +- spec/models/order_spec.rb | 13 +++++++++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/controllers/spree/orders_controller_decorator.rb b/app/controllers/spree/orders_controller_decorator.rb index c7e0e5d83e..28745eb561 100644 --- a/app/controllers/spree/orders_controller_decorator.rb +++ b/app/controllers/spree/orders_controller_decorator.rb @@ -18,9 +18,7 @@ Spree::OrdersController.class_eval do def populate_variant_attributes if params.key? :variant_attributes params[:variant_attributes].each do |variant_id, attributes| - attributes.each do |k, v| - @order.set_variant_attribute(Spree::Variant.find(variant_id), k, v) - end + @order.set_variant_attributes(Spree::Variant.find(variant_id), attributes) end end end diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree/line_item_decorator.rb index 10b08ec2f3..6430aa9ad3 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree/line_item_decorator.rb @@ -1,4 +1,6 @@ Spree::LineItem.class_eval do + attr_accessible :max_quantity + def shipping_method self.product.shipping_method_for_distributor(self.order.distributor) end diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 673294f16a..a1d7a54ea5 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -15,6 +15,13 @@ Spree::Order.class_eval do can_change_distributor? || product.distributors.include?(distributor) end + def set_variant_attributes(variant, attributes) + line_item = contains?(variant) + + line_item.assign_attributes(attributes) + line_item.save! + end + before_validation :shipping_address_from_distributor diff --git a/spec/controllers/orders_controller_spec.rb b/spec/controllers/orders_controller_spec.rb index 5172844f31..772a3bfdf0 100644 --- a/spec/controllers/orders_controller_spec.rb +++ b/spec/controllers/orders_controller_spec.rb @@ -116,7 +116,7 @@ describe Spree::OrdersController do p = create(:product, :distributors => [distributor_product], :group_buy => true) order = current_order(true) - order.should_receive(:set_variant_attribute).with(p.master, 'max_quantity', '3') + order.should_receive(:set_variant_attributes).with(p.master, {'max_quantity' => '3'}) controller.stub(:current_order).and_return(order) expect do diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index 8a6cd8c177..18b64aa03f 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -46,4 +46,17 @@ describe Spree::Order do # And cannot be added if it does not match subject.can_add_product_to_cart?(p_subsequent_other_dist).should be_false end + + it "sets attributes on line items for variants" do + subject.save! + d = create(:distributor) + p = create(:product, :distributors => [d]) + + subject.distributor = d + subject.add_variant(p.master, 1) + subject.set_variant_attributes(p.master, {'max_quantity' => '3'}) + + li = Spree::LineItem.last + li.max_quantity.should == 3 + end end