spree_core 2.2.6 → 2.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +2 -1
  3. data/app/helpers/spree/products_helper.rb +7 -8
  4. data/app/models/spree/adjustment.rb +1 -1
  5. data/app/models/spree/asset.rb +1 -1
  6. data/app/models/spree/gateway/bogus.rb +3 -2
  7. data/app/models/spree/inventory_unit.rb +1 -1
  8. data/app/models/spree/item_adjustments.rb +1 -1
  9. data/app/models/spree/order.rb +9 -5
  10. data/app/models/spree/order_updater.rb +12 -27
  11. data/app/models/spree/payment.rb +7 -4
  12. data/app/models/spree/payment_method.rb +1 -1
  13. data/app/models/spree/payment_method/check.rb +2 -0
  14. data/app/models/spree/product.rb +2 -3
  15. data/app/models/spree/promotion.rb +1 -1
  16. data/app/models/spree/promotion/actions/create_line_items.rb +1 -0
  17. data/app/models/spree/promotion_handler/coupon.rb +5 -1
  18. data/app/models/spree/return_authorization.rb +2 -2
  19. data/app/models/spree/shipping_category.rb +2 -2
  20. data/app/models/spree/shipping_method_category.rb +1 -1
  21. data/app/models/spree/stock_item.rb +1 -1
  22. data/app/models/spree/stock_location.rb +1 -1
  23. data/app/models/spree/tax_category.rb +1 -1
  24. data/app/models/spree/tax_rate.rb +7 -4
  25. data/app/models/spree/variant.rb +1 -1
  26. data/app/models/spree/zone.rb +16 -17
  27. data/app/models/spree/zone_member.rb +1 -1
  28. data/config/locales/en.yml +3 -0
  29. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +5 -0
  30. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +3 -5
  31. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
  32. data/lib/generators/spree/install/install_generator.rb +3 -7
  33. data/lib/spree/core/controller_helpers/auth.rb +2 -2
  34. data/lib/spree/core/importer/order.rb +24 -9
  35. data/lib/spree/core/validators/email.rb +1 -1
  36. data/lib/spree/core/version.rb +1 -1
  37. data/lib/spree/permitted_attributes.rb +3 -1
  38. data/lib/spree/testing_support/factories/order_factory.rb +1 -1
  39. data/lib/spree/testing_support/factories/promotion_factory.rb +4 -4
  40. data/lib/spree/testing_support/factories/stock_factory.rb +2 -2
  41. data/lib/tasks/core.rake +2 -2
  42. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 04e5eefe3009befd78025ca57659db32bc2e50a3
4
- data.tar.gz: f15a4fb3f353eb751af1989d90b3efead4115fbd
3
+ metadata.gz: ced799e6508e709a118e4e7ce365c38c64d83e35
4
+ data.tar.gz: 649ea08eb8e94b74a418811cf004e0af6ed36185
5
5
  SHA512:
6
- metadata.gz: c5f0b142e192633ab15d86f362310bc9b6640b274f3da599e52ccf0440bf6434983c990adba8c2002d9b9b2415bcb01bb518c6da3bd267e800af093c16085eb4
7
- data.tar.gz: e9fc9ce3dce676ea2c268012c0155fef5827ef8c17bcf868e3593ebb0f68b7c1a7959e97c625aff7cb041a83cbc1bbd3687dafd5d4c1bc42a6accc5846e587c8
6
+ metadata.gz: 89a31fc0972175a5718c2960a99fc1c9f21fccccaf60b1de207c692dc5c58e457ceb640c36ca56276ccf42abec76de682d275df81fd4331ba62936b7663085f0
7
+ data.tar.gz: 3b6fbdbd8d8eebc5dbb21514cc2ae887743231bf97d4cc181ce089d7a387081d5b70271b2d0a2a6ffdb1bf00bbfedc5b2648571b12c59839b7fc326354d9b10d
@@ -162,9 +162,10 @@ module Spree
162
162
  end
163
163
 
164
164
  private
165
+
165
166
  # Returns style of image or nil
166
167
  def image_style_from_method_name(method_name)
167
- if style = method_name.to_s.sub(/_image$/, '')
168
+ if method_name.to_s.match(/_image$/) && style = method_name.to_s.sub(/_image$/, '')
168
169
  possible_styles = Spree::Image.attachment_definitions[:attachment][:styles]
169
170
  style if style.in? possible_styles.with_indifferent_access
170
171
  end
@@ -11,14 +11,13 @@ module Spree
11
11
 
12
12
  # returns the formatted price for the specified variant as a difference from product price
13
13
  def variant_price_diff(variant)
14
- diff = variant.amount_in(current_currency) - variant.product.amount_in(current_currency)
15
- return nil if diff == 0
16
- amount = Spree::Money.new(diff.abs, { currency: current_currency }).to_html
17
- if diff > 0
18
- "(#{Spree.t(:add)}: #{amount})".html_safe
19
- else
20
- "(#{Spree.t(:subtract)}: #{amount})".html_safe
21
- end
14
+ variant_amount = variant.amount_in(current_currency)
15
+ product_amount = variant.product.amount_in(current_currency)
16
+ return if variant_amount == product_amount || product_amount.nil?
17
+ diff = variant.amount_in(current_currency) - product_amount
18
+ amount = Spree::Money.new(diff.abs, currency: current_currency).to_html
19
+ label = diff > 0 ? :add : :subtract
20
+ "(#{Spree.t(label)}: #{amount})".html_safe
22
21
  end
23
22
 
24
23
  # returns the formatted full price for the variant, if at least one variant price differs from product price
@@ -22,7 +22,7 @@
22
22
  # it might be reinstated.
23
23
  module Spree
24
24
  class Adjustment < ActiveRecord::Base
25
- belongs_to :adjustable, polymorphic: true
25
+ belongs_to :adjustable, polymorphic: true, touch: true
26
26
  belongs_to :source, polymorphic: true
27
27
  belongs_to :order, class_name: "Spree::Order"
28
28
 
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class Asset < ActiveRecord::Base
3
3
  belongs_to :viewable, polymorphic: true, touch: true
4
- acts_as_list scope: :viewable
4
+ acts_as_list scope: [:viewable_id, :viewable_type]
5
5
  end
6
6
  end
@@ -19,8 +19,9 @@ module Spree
19
19
 
20
20
  def create_profile(payment)
21
21
  # simulate the storage of credit card profile using remote service
22
- success = VALID_CCS.include? payment.source.number
23
- payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
22
+ if success = VALID_CCS.include?(payment.source.number)
23
+ payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
24
+ end
24
25
  end
25
26
 
26
27
  def authorize(money, credit_card, options = {})
@@ -3,7 +3,7 @@ module Spree
3
3
  belongs_to :variant, class_name: "Spree::Variant", inverse_of: :inventory_units
4
4
  belongs_to :order, class_name: "Spree::Order", inverse_of: :inventory_units
5
5
  belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units
6
- belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization"
6
+ belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization", inverse_of: :inventory_units
7
7
  belongs_to :line_item, class_name: "Spree::LineItem", inverse_of: :inventory_units
8
8
 
9
9
  scope :backordered, -> { where state: 'backordered' }
@@ -72,7 +72,7 @@ module Spree
72
72
  end
73
73
 
74
74
  def best_promotion_adjustment
75
- @best_promotion_adjustment ||= adjustments.promotion.eligible.reorder("amount ASC, created_at DESC").first
75
+ @best_promotion_adjustment ||= adjustments.promotion.eligible.reorder("amount ASC, created_at DESC, id DESC").first
76
76
  end
77
77
  end
78
78
  end
@@ -38,9 +38,9 @@ module Spree
38
38
  alias_attribute :ship_total, :shipment_total
39
39
 
40
40
  has_many :state_changes, as: :stateful
41
- has_many :line_items, -> { order('created_at ASC') }, dependent: :destroy, inverse_of: :order
41
+ has_many :line_items, -> { order("#{LineItem.table_name}.created_at ASC") }, dependent: :destroy, inverse_of: :order
42
42
  has_many :payments, dependent: :destroy
43
- has_many :return_authorizations, dependent: :destroy
43
+ has_many :return_authorizations, dependent: :destroy, inverse_of: :order
44
44
  has_many :adjustments, -> { order("#{Adjustment.table_name}.created_at ASC") }, as: :adjustable, dependent: :destroy
45
45
  has_many :line_item_adjustments, through: :line_items, source: :adjustments
46
46
  has_many :shipment_adjustments, through: :shipments, source: :adjustments
@@ -306,7 +306,11 @@ module Spree
306
306
  end
307
307
 
308
308
  def outstanding_balance
309
- total - payment_total
309
+ if self.state == 'canceled' && self.payments.present? && self.payments.completed.size > 0
310
+ -1 * payment_total
311
+ else
312
+ total - payment_total
313
+ end
310
314
  end
311
315
 
312
316
  def outstanding_balance?
@@ -424,6 +428,7 @@ module Spree
424
428
  order.line_items.each do |line_item|
425
429
  next unless line_item.currency == currency
426
430
  current_line_item = self.line_items.find_by(variant: line_item.variant)
431
+
427
432
  if current_line_item
428
433
  current_line_item.quantity += line_item.quantity
429
434
  current_line_item.save
@@ -628,9 +633,8 @@ module Spree
628
633
  def after_cancel
629
634
  shipments.each { |shipment| shipment.cancel! }
630
635
  payments.completed.each { |payment| payment.cancel! }
631
-
632
636
  send_cancel_email
633
- self.update_column(:payment_state, 'credit_owed') unless shipped?
637
+ self.update!
634
638
  end
635
639
 
636
640
  def send_cancel_email
@@ -151,35 +151,20 @@ module Spree
151
151
  #
152
152
  # The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
153
153
  def update_payment_state
154
-
155
- # line_item are empty when user empties cart
156
- if line_items.empty? || round_money(order.payment_total) < round_money(order.total)
157
- if payments.present?
158
- if payments.last.state == 'failed'
159
- order.payment_state = 'failed'
160
- elsif payments.last.state == 'checkout'
161
- order.payment_state = 'pending'
162
- elsif payments.last.state == 'completed'
163
- if line_items.empty?
164
- order.payment_state = 'credit_owed'
165
- else
166
- order.payment_state = 'balance_due'
167
- end
168
- elsif payments.last.state == 'pending'
169
- order.payment_state = 'balance_due'
170
- else
171
- order.payment_state = 'credit_owed'
172
- end
173
- else
174
- order.payment_state = 'balance_due'
175
- end
176
- elsif round_money(order.payment_total) > round_money(order.total)
177
- order.payment_state = 'credit_owed'
154
+ last_state = order.payment_state
155
+ if payments.present? && payments.valid.size == 0
156
+ order.payment_state = 'failed'
157
+ elsif !payments.present? && order.state == 'canceled'
158
+ order.payment_state = 'void'
159
+ elsif order.state == 'canceled' && order.payment_total == 0 && payments.completed.size > 0
160
+ order.payment_state = 'void'
178
161
  else
179
- order.payment_state = 'paid'
162
+ order.payment_state = 'balance_due' if order.outstanding_balance > 0
163
+ order.payment_state = 'credit_owed' if order.outstanding_balance < 0
164
+ order.payment_state = 'paid' if !order.outstanding_balance?
180
165
  end
181
-
182
- order.state_changed('payment')
166
+ order.state_changed('payment') if last_state != order.payment_state
167
+ order.payment_state
183
168
  end
184
169
 
185
170
  private
@@ -8,7 +8,7 @@ module Spree
8
8
 
9
9
  belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments
10
10
  belongs_to :source, polymorphic: true
11
- belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
11
+ belongs_to :payment_method, class_name: 'Spree::PaymentMethod', inverse_of: :payments
12
12
 
13
13
  has_many :offsets, -> { where("source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'") },
14
14
  class_name: "Spree::Payment", foreign_key: :source_id
@@ -166,7 +166,8 @@ module Spree
166
166
  end
167
167
 
168
168
  def create_payment_profile
169
- return unless source.respond_to?(:has_payment_profile?) && !source.has_payment_profile?
169
+ return unless source.respond_to?(:has_payment_profile?) && !source.has_payment_profile? &&
170
+ state != 'invalid' && state != 'failed'
170
171
 
171
172
  payment_method.create_profile(self)
172
173
  rescue ActiveMerchant::ConnectionError => e
@@ -174,8 +175,10 @@ module Spree
174
175
  end
175
176
 
176
177
  def invalidate_old_payments
177
- order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
178
- payment.invalidate!
178
+ if state != 'invalid' and state != 'failed'
179
+ order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
180
+ payment.invalidate!
181
+ end
179
182
  end
180
183
  end
181
184
 
@@ -8,7 +8,7 @@ module Spree
8
8
 
9
9
  validates :name, presence: true
10
10
 
11
- has_many :payments, class_name: "Spree::Payment"
11
+ has_many :payments, class_name: "Spree::Payment", inverse_of: :payment_method
12
12
  has_many :credit_cards, class_name: "Spree::CreditCard"
13
13
 
14
14
  def self.providers
@@ -18,6 +18,8 @@ module Spree
18
18
  ActiveMerchant::Billing::Response.new(true, "", {}, {})
19
19
  end
20
20
 
21
+ def cancel(response); end
22
+
21
23
  def void(*args)
22
24
  ActiveMerchant::Billing::Response.new(true, "", {}, {})
23
25
  end
@@ -39,9 +39,8 @@ module Spree
39
39
  has_one :master,
40
40
  -> { where is_master: true },
41
41
  inverse_of: :product,
42
- class_name: 'Spree::Variant',
43
- dependent: :destroy
44
-
42
+ class_name: 'Spree::Variant'
43
+
45
44
  has_many :variants,
46
45
  -> { where(is_master: false).order("#{::Spree::Variant.quoted_table_name}.position ASC") },
47
46
  inverse_of: :product,
@@ -27,7 +27,7 @@ module Spree
27
27
  end
28
28
 
29
29
  def self.with_coupon_code(coupon_code)
30
- where("lower(code) = ?", coupon_code.strip.downcase).first
30
+ where("lower(#{self.table_name}.code) = ?", coupon_code.strip.downcase).first
31
31
  end
32
32
 
33
33
  def self.active
@@ -45,6 +45,7 @@ module Spree
45
45
  order.contents.add(item.variant, item.quantity - current_quantity)
46
46
  end
47
47
  end
48
+ true
48
49
  end
49
50
  end
50
51
  end
@@ -72,11 +72,15 @@ module Spree
72
72
  end
73
73
  }
74
74
 
75
+ # Check for applied adjustments.
75
76
  discount = order.line_item_adjustments.promotion.detect(&detector)
76
77
  discount ||= order.shipment_adjustments.promotion.detect(&detector)
77
78
  discount ||= order.adjustments.promotion.detect(&detector)
78
79
 
79
- if discount.eligible
80
+ # Check for applied line items.
81
+ created_line_items = promotion.actions.detect { |a| a.type == 'Spree::Promotion::Actions::CreateLineItems' }
82
+
83
+ if (discount && discount.eligible) || created_line_items
80
84
  order.update_totals
81
85
  order.persist_totals
82
86
  self.success = Spree.t(:coupon_code_applied)
@@ -1,8 +1,8 @@
1
1
  module Spree
2
2
  class ReturnAuthorization < ActiveRecord::Base
3
- belongs_to :order, class_name: 'Spree::Order'
3
+ belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
4
4
 
5
- has_many :inventory_units, dependent: :nullify
5
+ has_many :inventory_units, dependent: :nullify, inverse_of: :return_authorization
6
6
  belongs_to :stock_location
7
7
  before_create :generate_number
8
8
  before_save :force_positive_amount
@@ -2,7 +2,7 @@ module Spree
2
2
  class ShippingCategory < ActiveRecord::Base
3
3
  validates :name, presence: true
4
4
  has_many :products, inverse_of: :shipping_category
5
- has_many :shipping_method_categories
5
+ has_many :shipping_method_categories, inverse_of: :shipping_method
6
6
  has_many :shipping_methods, through: :shipping_method_categories
7
7
  end
8
- end
8
+ end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class ShippingMethodCategory < ActiveRecord::Base
3
3
  belongs_to :shipping_method, class_name: 'Spree::ShippingMethod'
4
- belongs_to :shipping_category, class_name: 'Spree::ShippingCategory'
4
+ belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :shipping_method_categories
5
5
  end
6
6
  end
@@ -2,7 +2,7 @@ module Spree
2
2
  class StockItem < ActiveRecord::Base
3
3
  acts_as_paranoid
4
4
 
5
- belongs_to :stock_location, class_name: 'Spree::StockLocation'
5
+ belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items
6
6
  belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :stock_items
7
7
  has_many :stock_movements, inverse_of: :stock_item
8
8
 
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class StockLocation < ActiveRecord::Base
3
3
  has_many :shipments
4
- has_many :stock_items, dependent: :delete_all
4
+ has_many :stock_items, dependent: :delete_all, inverse_of: :stock_location
5
5
  has_many :stock_movements, through: :stock_items
6
6
 
7
7
  belongs_to :state, class_name: 'Spree::State'
@@ -3,7 +3,7 @@ module Spree
3
3
  acts_as_paranoid
4
4
  validates :name, presence: true, uniqueness: { scope: :deleted_at }
5
5
 
6
- has_many :tax_rates, dependent: :destroy
6
+ has_many :tax_rates, dependent: :destroy, inverse_of: :tax_category
7
7
 
8
8
  before_save :set_default_category
9
9
 
@@ -11,10 +11,15 @@ end
11
11
  module Spree
12
12
  class TaxRate < ActiveRecord::Base
13
13
  acts_as_paranoid
14
+
15
+ # Need to deal with adjustments before calculator is destroyed.
16
+ before_destroy :deals_with_adjustments_for_deleted_source
17
+
14
18
  include Spree::Core::CalculatedAdjustments
15
19
  include Spree::Core::AdjustmentSource
16
- belongs_to :zone, class_name: "Spree::Zone"
17
- belongs_to :tax_category, class_name: "Spree::TaxCategory"
20
+
21
+ belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates
22
+ belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates
18
23
 
19
24
  has_many :adjustments, as: :source
20
25
 
@@ -22,8 +27,6 @@ module Spree
22
27
  validates :tax_category_id, presence: true
23
28
  validates_with DefaultTaxZoneValidator
24
29
 
25
- before_destroy :deals_with_adjustments_for_deleted_source
26
-
27
30
  scope :by_zone, ->(zone) { where(zone_id: zone) }
28
31
 
29
32
  # Gets the array of TaxRates appropriate for the specified order
@@ -9,7 +9,7 @@ module Spree
9
9
  :shipping_category_id, :meta_description, :meta_keywords,
10
10
  :shipping_category
11
11
 
12
- has_many :inventory_units
12
+ has_many :inventory_units, inverse_of: :variant
13
13
  has_many :line_items, inverse_of: :variant
14
14
 
15
15
  has_many :stock_items, dependent: :destroy, inverse_of: :variant
@@ -1,7 +1,8 @@
1
1
  module Spree
2
2
  class Zone < ActiveRecord::Base
3
- has_many :zone_members, dependent: :destroy, class_name: "Spree::ZoneMember"
4
- has_many :tax_rates, dependent: :destroy
3
+ has_many :zone_members, dependent: :destroy, class_name: "Spree::ZoneMember", inverse_of: :zone
4
+ has_many :tax_rates, dependent: :destroy, inverse_of: :zone
5
+
5
6
  has_and_belongs_to_many :shipping_methods, :join_table => 'spree_shipping_methods_zones'
6
7
 
7
8
  validates :name, presence: true, uniqueness: true
@@ -14,7 +15,7 @@ module Spree
14
15
  def self.default_tax
15
16
  where(default_tax: true).first
16
17
  end
17
-
18
+
18
19
  # Returns the matching zone with the highest priority zone type (State, Country, Zone.)
19
20
  # Returns nil in the case of no matches.
20
21
  def self.match(address)
@@ -91,23 +92,11 @@ module Spree
91
92
  end
92
93
 
93
94
  def country_ids=(ids)
94
- zone_members.destroy_all
95
- ids.reject{ |id| id.blank? }.map do |id|
96
- member = ZoneMember.new
97
- member.zoneable_type = 'Spree::Country'
98
- member.zoneable_id = id
99
- members << member
100
- end
95
+ set_zone_members(ids, 'Spree::Country')
101
96
  end
102
97
 
103
98
  def state_ids=(ids)
104
- zone_members.destroy_all
105
- ids.reject{ |id| id.blank? }.map do |id|
106
- member = ZoneMember.new
107
- member.zoneable_type = 'Spree::State'
108
- member.zoneable_id = id
109
- members << member
110
- end
99
+ set_zone_members(ids, 'Spree::State')
111
100
  end
112
101
 
113
102
  # Indicates whether the specified zone falls entirely within the zone performing
@@ -135,5 +124,15 @@ module Spree
135
124
  def remove_previous_default
136
125
  Spree::Zone.where('id != ?', self.id).update_all(default_tax: false) if default_tax
137
126
  end
127
+
128
+ def set_zone_members(ids, type)
129
+ zone_members.destroy_all
130
+ ids.reject{ |id| id.blank? }.map do |id|
131
+ member = ZoneMember.new
132
+ member.zoneable_type = type
133
+ member.zoneable_id = id
134
+ members << member
135
+ end
136
+ end
138
137
  end
139
138
  end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class ZoneMember < ActiveRecord::Base
3
- belongs_to :zone, class_name: 'Spree::Zone', counter_cache: true
3
+ belongs_to :zone, class_name: 'Spree::Zone', counter_cache: true, inverse_of: :zone_members
4
4
  belongs_to :zoneable, polymorphic: true
5
5
 
6
6
  def name
@@ -418,6 +418,7 @@ en:
418
418
  back_to_users_list: Back To Users List
419
419
  back_to_zones_list: Back To Zones List
420
420
  backorderable: Backorderable
421
+ backorderable_default: Backorderable default
421
422
  backorders_allowed: backorders allowed
422
423
  balance_due: Balance Due
423
424
  bill_address: Bill Address
@@ -800,6 +801,7 @@ en:
800
801
  or_over_price: ! '%{price} or over'
801
802
  order: Order
802
803
  order_adjustments: Order adjustments
804
+ order_already_updated: The order has already been updated.
803
805
  order_approved: Order approved
804
806
  order_canceled: Order canceled
805
807
  order_details: Order Details
@@ -950,6 +952,7 @@ en:
950
952
  name: User Logged In
951
953
  promotions: Promotions
952
954
  promotion_uses: Promotion uses
955
+ propagate_all_variants: Propagate all variants
953
956
  properties: Properties
954
957
  property: Property
955
958
  prototype: Prototype
@@ -1,5 +1,10 @@
1
1
  class RenameShippingMethodsZonesToSpreeShippingMethodsZones < ActiveRecord::Migration
2
2
  def change
3
3
  rename_table :shipping_methods_zones, :spree_shipping_methods_zones
4
+ # If Spree::ShippingMethod zones association was patched in
5
+ # CreateShippingMethodZone migrations, it needs to be patched back
6
+ Spree::ShippingMethod.has_and_belongs_to_many :zones, :join_table => 'spree_shipping_methods_zones',
7
+ :class_name => 'Spree::Zone',
8
+ :foreign_key => 'shipping_method_id'
4
9
  end
5
10
  end
@@ -3,10 +3,8 @@ class SetShipmentTotalForUsersUpgrading < ActiveRecord::Migration
3
3
  # NOTE You might not need this at all unless you're upgrading from Spree 2.1.x
4
4
  # or below. For those upgrading this should populate the Order#shipment_total
5
5
  # for legacy orders
6
- execute "UPDATE spree_orders
7
- SET shipment_total = (SELECT SUM(spree_shipments.cost) AS sum_id
8
- FROM spree_shipments
9
- WHERE spree_shipments.order_id = spree_orders.id)
10
- WHERE spree_orders.completed_at IS NOT NULL AND spree_orders.shipment_total = 0"
6
+ Spree::Order.complete.where('shipment_total = ?', 0).includes(:shipments).find_each do |order|
7
+ order.update_column(:shipment_total, order.shipments.sum(:cost))
8
+ end
11
9
  end
12
10
  end
@@ -0,0 +1,5 @@
1
+ class AddStateLockVersionToOrder < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_orders, :state_lock_version, :integer, default: 0, null: false
4
+ end
5
+ end
@@ -57,14 +57,10 @@ User-agent: *
57
57
  Disallow: /checkout
58
58
  Disallow: /cart
59
59
  Disallow: /orders
60
- Disallow: /countries
61
- Disallow: /line_items
62
- Disallow: /password_resets
63
- Disallow: /states
64
- Disallow: /user_sessions
65
- Disallow: /user_registrations
66
- Disallow: /users
60
+ Disallow: /user
67
61
  Disallow: /account
62
+ Disallow: /api
63
+ Disallow: /password
68
64
  ROBOTS
69
65
  end
70
66
 
@@ -8,7 +8,7 @@ module Spree
8
8
  helper_method :try_spree_current_user
9
9
 
10
10
  rescue_from CanCan::AccessDenied do |exception|
11
- unauthorized
11
+ redirect_unauthorized_access
12
12
  end
13
13
  end
14
14
 
@@ -20,7 +20,7 @@ module Spree
20
20
  # Redirect as appropriate when an access request fails. The default action is to redirect to the login screen.
21
21
  # Override this method in your controllers if you want to have special behavior in case the user is not authorized
22
22
  # to access the requested action. For example, a popup window might simply close itself.
23
- def unauthorized
23
+ def redirect_unauthorized_access
24
24
  if try_spree_current_user
25
25
  flash[:error] = Spree.t(:authorization_failure)
26
26
  redirect_to '/unauthorized'
@@ -13,7 +13,9 @@ module Spree
13
13
  order = Spree::Order.create!
14
14
  order.associate_user!(user)
15
15
 
16
- create_shipments_from_params(params.delete(:shipments_attributes), order)
16
+ shipments_attrs = params.delete(:shipments_attributes)
17
+
18
+ create_shipments_from_params(shipments_attrs, order)
17
19
  create_line_items_from_params(params.delete(:line_items_attributes),order)
18
20
  create_adjustments_from_params(params.delete(:adjustments_attributes), order)
19
21
  create_payments_from_params(params.delete(:payments_attributes), order)
@@ -30,8 +32,15 @@ module Spree
30
32
 
31
33
  order.update_attributes!(params)
32
34
 
35
+ order.create_proposed_shipments unless shipments_attrs.present?
36
+
33
37
  # Really ensure that the order totals & states are correct
34
38
  order.updater.update
39
+ if shipments_attrs.present?
40
+ order.shipments.each_with_index do |shipment, index|
41
+ shipment.update_columns(cost: shipments_attrs[index][:cost].to_f) if shipments_attrs[index][:cost].present?
42
+ end
43
+ end
35
44
  order.reload
36
45
  rescue Exception => e
37
46
  order.destroy if order && order.persisted?
@@ -45,7 +54,7 @@ module Spree
45
54
  begin
46
55
  shipment = order.shipments.build
47
56
  shipment.tracking = s[:tracking]
48
- shipment.stock_location = Spree::StockLocation.find_by_name!(s[:stock_location])
57
+ shipment.stock_location = Spree::StockLocation.find_by_admin_name(s[:stock_location]) || Spree::StockLocation.find_by_name!(s[:stock_location])
49
58
 
50
59
  if s[:shipped_at].present?
51
60
  shipment.shipped_at = s[:shipped_at]
@@ -79,12 +88,15 @@ module Spree
79
88
  return {} unless line_items_hash
80
89
  line_items_hash.each_key do |k|
81
90
  begin
82
- line_item = line_items_hash[k]
83
- ensure_variant_id_from_params(line_item)
84
-
85
- extra_params = line_item.except(:variant_id, :quantity)
91
+ extra_params = line_items_hash[k].except(:variant_id, :quantity, :sku)
92
+ line_item = ensure_variant_id_from_params(line_items_hash[k])
86
93
  line_item = order.contents.add(Spree::Variant.find(line_item[:variant_id]), line_item[:quantity])
87
- line_item.update_attributes(extra_params) unless extra_params.empty?
94
+ # Raise any errors with saving to prevent import succeeding with line items failing silently.
95
+ if extra_params.present?
96
+ line_item.update_attributes!(extra_params)
97
+ else
98
+ line_item.save!
99
+ end
88
100
  rescue Exception => e
89
101
  raise "Order import line items: #{e.message} #{line_item}"
90
102
  end
@@ -124,10 +136,13 @@ module Spree
124
136
 
125
137
  def self.ensure_variant_id_from_params(hash)
126
138
  begin
139
+ sku = hash.delete(:sku)
127
140
  unless hash[:variant_id].present?
128
- hash[:variant_id] = Spree::Variant.active.find_by_sku!(hash[:sku]).id
129
- hash.delete(:sku)
141
+ hash[:variant_id] = Spree::Variant.active.find_by_sku!(sku).id
130
142
  end
143
+ hash
144
+ rescue ActiveRecord::RecordNotFound => e
145
+ raise "Ensure order import variant: Variant w/SKU #{sku} not found."
131
146
  rescue Exception => e
132
147
  raise "Ensure order import variant: #{e.message} #{hash}"
133
148
  end
@@ -1,6 +1,6 @@
1
1
  class EmailValidator < ActiveModel::EachValidator
2
2
  def validate_each(record,attribute,value)
3
- unless value =~ /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
3
+ unless value =~ /\A([^@\.]|[^@\.]([^@\s]*)[^@\.])@([^@\s]+\.)+[^@\s]+\z/
4
4
  record.errors.add(attribute, :invalid, {:value => value}.merge!(options))
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.2.6"
3
+ "2.2.7"
4
4
  end
5
5
  end
@@ -34,7 +34,9 @@ module Spree
34
34
  :state => [:name, :abbr]
35
35
  ]
36
36
 
37
- @@checkout_attributes = [:email, :use_billing, :shipping_method_id, :coupon_code, :special_instructions]
37
+ @@checkout_attributes = [
38
+ :coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing
39
+ ]
38
40
 
39
41
  @@image_attributes = [:alt, :attachment, :position, :viewable_type, :viewable_id]
40
42
 
@@ -16,7 +16,7 @@ FactoryGirl.define do
16
16
  bill_address
17
17
  ship_address
18
18
 
19
- ignore do
19
+ transient do
20
20
  line_items_count 5
21
21
  end
22
22
 
@@ -3,7 +3,7 @@ FactoryGirl.define do
3
3
  name 'Promo'
4
4
 
5
5
  trait :with_line_item_adjustment do
6
- ignore do
6
+ transient do
7
7
  adjustment_rate 10
8
8
  end
9
9
 
@@ -18,7 +18,7 @@ FactoryGirl.define do
18
18
  factory :promotion_with_item_adjustment, traits: [:with_line_item_adjustment]
19
19
 
20
20
  trait :with_order_adjustment do
21
- ignore do
21
+ transient do
22
22
  order_adjustment_amount 10
23
23
  end
24
24
 
@@ -32,13 +32,13 @@ FactoryGirl.define do
32
32
  end
33
33
 
34
34
  trait :with_item_total_rule do
35
- ignore do
35
+ transient do
36
36
  item_total_threshold_amount 10
37
37
  end
38
38
 
39
39
  after(:create) do |promotion, evaluator|
40
40
  rule = Spree::Promotion::Rules::ItemTotal.create!(
41
- preferred_operator: 'gte',
41
+ preferred_operator: 'gte',
42
42
  preferred_amount: evaluator.item_total_threshold_amount
43
43
  )
44
44
  promotion.rules << rule
@@ -1,7 +1,7 @@
1
1
  FactoryGirl.define do
2
2
  # must use build()
3
3
  factory :stock_packer, class: Spree::Stock::Packer do
4
- ignore do
4
+ transient do
5
5
  stock_location { build(:stock_location) }
6
6
  contents []
7
7
  end
@@ -10,7 +10,7 @@ FactoryGirl.define do
10
10
  end
11
11
 
12
12
  factory :stock_package, class: Spree::Stock::Package do
13
- ignore do
13
+ transient do
14
14
  stock_location { build(:stock_location) }
15
15
  order { create(:order_with_line_items, line_items_count: 2) }
16
16
  contents []
data/lib/tasks/core.rake CHANGED
@@ -86,8 +86,8 @@ use rake db:load_file[/absolute/path/to/sample/filename.rb]}
86
86
  end
87
87
 
88
88
  if load_sample
89
- #prevent errors for missing attributes (since rails 3.1 upgrade)
90
-
89
+ # Reload models' attributes in case they were loaded in old migrations with wrong attributes
90
+ ActiveRecord::Base.descendants.each(&:reset_column_information)
91
91
  Rake::Task["spree_sample:load"].invoke
92
92
  end
93
93
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.6
4
+ version: 2.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-19 00:00:00.000000000 Z
11
+ date: 2014-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -254,14 +254,14 @@ dependencies:
254
254
  requirements:
255
255
  - - "~>"
256
256
  - !ruby/object:Gem::Version
257
- version: 4.0.8
257
+ version: 4.0.12
258
258
  type: :runtime
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - "~>"
263
263
  - !ruby/object:Gem::Version
264
- version: 4.0.8
264
+ version: 4.0.12
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: ransack
267
267
  requirement: !ruby/object:Gem::Requirement
@@ -609,6 +609,7 @@ files:
609
609
  - db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb
610
610
  - db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb
611
611
  - db/migrate/20140804185157_add_default_to_shipment_cost.rb
612
+ - db/migrate/20141021194502_add_state_lock_version_to_order.rb
612
613
  - db/seeds.rb
613
614
  - lib/generators/spree/custom_user/custom_user_generator.rb
614
615
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt