spree_core 2.3.10 → 2.3.11

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 728b74de9c0f8e2e371fab35a9a103a220090f4f
4
- data.tar.gz: b60a27598a180ae3a23f7c449aeca221ddea1eb5
3
+ metadata.gz: 220579fa75f0cf4f04ad3c1688427f6ac85bd9f7
4
+ data.tar.gz: 4b695dfd6914c69725d8efab2b49b053ea1498ab
5
5
  SHA512:
6
- metadata.gz: b70efe721217914f339f792721cdc192e80f17d2e860d8fa7983da76ba2034f071d2c04cb0b46c03e50c14180ee843ec8e224591b1c6991737f083adf5cb6f0b
7
- data.tar.gz: e6e6f4412dc66a18e4f7891ebc1d9f440fb682e4f63593a35e83392a3f4982491d268e3f40e7f60f72ec67325244ba85a4ec5462a5ccc71a111cb7776ab96497
6
+ metadata.gz: 4753626212fc08dfd1a242773210b59e38f9da5a927da31344da74a14b24fe9a676bfacb182f1d576fc71109d9c524b970b7f458402393bb9cd5570ea07f7b46
7
+ data.tar.gz: 67a816dbd5d27061e1918cdcf0cd431c63b843ff944ad01d567751d9790f5d113f84b47528be164480045760d17964d4aae3583d831d66460f6927ec9fe82c8a
@@ -24,7 +24,7 @@ module Spree
24
24
  class Adjustment < Spree::Base
25
25
  belongs_to :adjustable, polymorphic: true, touch: true
26
26
  belongs_to :source, polymorphic: true
27
- belongs_to :order, class_name: "Spree::Order"
27
+ belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
28
28
 
29
29
  validates :adjustable, presence: true
30
30
  validates :order, presence: true
@@ -46,6 +46,11 @@ module Spree
46
46
  has_many :inventory_units, inverse_of: :order
47
47
  has_many :products, through: :variants
48
48
  has_many :variants, through: :line_items
49
+ has_many :all_adjustments,
50
+ class_name: 'Spree::Adjustment',
51
+ foreign_key: :order_id,
52
+ dependent: :destroy,
53
+ inverse_of: :order
49
54
 
50
55
  has_and_belongs_to_many :promotions, join_table: 'spree_orders_promotions'
51
56
 
@@ -115,9 +120,10 @@ module Spree
115
120
  self.update_hooks.add(hook)
116
121
  end
117
122
 
118
- def all_adjustments
119
- Adjustment.where("order_id = :order_id OR (adjustable_id = :order_id AND adjustable_type = 'Spree::Order')",
120
- order_id: self.id)
123
+ # Use this method in other gems that wish to register their own custom logic
124
+ # that should be called when determining if two line items are equal.
125
+ def self.register_line_item_comparison_hook(hook)
126
+ self.line_item_comparison_hooks.add(hook)
121
127
  end
122
128
 
123
129
  # For compatiblity with Calculator::PriceSack
@@ -168,10 +168,5 @@ module Spree
168
168
  order.state_changed('payment') if last_state != order.payment_state
169
169
  order.payment_state
170
170
  end
171
-
172
- private
173
- def round_money(n)
174
- (n * 100).round / 100.0
175
- end
176
171
  end
177
172
  end
@@ -16,6 +16,7 @@ module Spree
16
16
  has_many :state_changes, as: :stateful
17
17
  has_many :capture_events, :class_name => 'Spree::PaymentCaptureEvent'
18
18
 
19
+ validates_presence_of :payment_method
19
20
  before_validation :validate_source
20
21
  before_create :set_unique_identifier
21
22
 
@@ -157,6 +158,10 @@ module Spree
157
158
  amount - capture_events.sum(:amount)
158
159
  end
159
160
 
161
+ def editable?
162
+ checkout? || pending?
163
+ end
164
+
160
165
  private
161
166
 
162
167
  def validate_source
@@ -29,22 +29,26 @@ module Spree
29
29
  end
30
30
 
31
31
  private
32
- def promotions
33
- promo_table = Promotion.arel_table
34
- join_table = Arel::Table.new(:spree_orders_promotions)
35
32
 
36
- join_condition = promo_table.join(join_table, Arel::Nodes::OuterJoin).on(
37
- promo_table[:id].eq(join_table[:promotion_id])
38
- ).join_sources
33
+ def promotions
34
+ # AR cannot bind raw ASTs to prepared statements. There always must be a manager around.
35
+ # Also Postgresql requires an aliased table for `SELECT * FROM (subexpression) AS alias`.
36
+ # And Sqlite3 cannot work on outher parenthesis from `(left UNION right)`.
37
+ # So this construct makes both happy.
38
+ select = Arel::SelectManager.new(
39
+ Promotion,
40
+ Promotion.arel_table.create_table_alias(
41
+ order.promotions.active.union(Promotion.active.where(code: nil, path: nil)),
42
+ Promotion.table_name
43
+ ),
44
+ )
45
+ select.project(Arel.star)
39
46
 
40
- Promotion.active.includes(:promotion_rules).
41
- joins(join_condition).
42
- where(
43
- promo_table[:code].eq(nil).and(
44
- promo_table[:path].eq(nil)
45
- ).or(join_table[:order_id].eq(order.id))
46
- ).distinct
47
- end
47
+ Promotion.find_by_sql(
48
+ select,
49
+ order.promotions.bind_values
50
+ )
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -5,16 +5,20 @@ module Spree
5
5
  unit_count = line_item.inventory_units.size
6
6
  return if unit_count >= line_item.quantity
7
7
  quantity = line_item.quantity - unit_count
8
+ return if quantity.zero?
8
9
 
9
10
  quantifier = Stock::Quantifier.new(line_item.variant)
10
11
 
11
- unless quantifier.can_supply? quantity
12
- variant = line_item.variant
13
- display_name = %Q{#{variant.name}}
14
- display_name += %Q{ (#{variant.options_text})} unless variant.options_text.blank?
12
+ return if quantifier.can_supply?(quantity)
15
13
 
16
- line_item.errors[:quantity] << Spree.t(:selected_quantity_not_available, :scope => :order_populator, :item => display_name.inspect)
17
- end
14
+ variant = line_item.variant
15
+ display_name = "#{variant.name}"
16
+ display_name += " (#{variant.options_text})" unless variant.options_text.blank?
17
+
18
+ line_item.errors[:quantity] << Spree.t(
19
+ :selected_quantity_not_available,
20
+ item: display_name.inspect
21
+ )
18
22
  end
19
23
  end
20
24
  end
@@ -8,7 +8,11 @@ module Spree
8
8
 
9
9
  validates_presence_of :stock_location, :variant
10
10
  validates_uniqueness_of :variant_id, scope: [:stock_location_id, :deleted_at]
11
- validates :count_on_hand, numericality: { greater_than_or_equal_to: 0 }, if: :verify_count_on_hand?
11
+
12
+ validates_numericality_of :count_on_hand,
13
+ greater_than_or_equal_to: 0,
14
+ less_than_or_equal_to: 2**31 - 1,
15
+ only_integer: true, if: :verify_count_on_hand?
12
16
 
13
17
  delegate :weight, :should_track_inventory?, to: :variant
14
18
 
@@ -6,7 +6,12 @@ module Spree
6
6
  after_create :update_stock_item_quantity
7
7
 
8
8
  validates :stock_item, presence: true
9
- validates :quantity, presence: true
9
+ validates :quantity, presence: true, numericality: {
10
+ greater_than_or_equal_to: -2**31,
11
+ less_than_or_equal_to: 2**31-1,
12
+ only_integer: true,
13
+ allow_nil: true
14
+ }
10
15
 
11
16
  scope :recent, -> { order('created_at DESC') }
12
17
 
@@ -78,7 +78,11 @@ module Spree
78
78
  rates = self.match(order_tax_zone)
79
79
  tax_categories = rates.map(&:tax_category)
80
80
  relevant_items, non_relevant_items = items.partition { |item| tax_categories.include?(item.tax_category) }
81
- Spree::Adjustment.where(adjustable: relevant_items).tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
81
+
82
+ if relevant_items.present?
83
+ Spree::Adjustment.where(adjustable: relevant_items).tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
84
+ end
85
+
82
86
  relevant_items.each do |item|
83
87
  relevant_rates = rates.select { |rate| rate.tax_category == item.tax_category }
84
88
  store_pre_tax_amount(item, relevant_rates)
@@ -23,6 +23,10 @@ Spree::Core::Engine.config.to_prepare do
23
23
  def last_incomplete_spree_order
24
24
  spree_orders.incomplete.where(user_id: self.id).order('created_at DESC').first
25
25
  end
26
+
27
+ def analytics_id
28
+ id
29
+ end
26
30
  end
27
31
  end
28
32
  end
@@ -0,0 +1,70 @@
1
+ class FixAdjustmentOrderId < ActiveRecord::Migration
2
+ def change
3
+ say 'Populate order_id from adjustable_id where appropriate'
4
+ execute(<<-SQL.squish)
5
+ UPDATE
6
+ spree_adjustments
7
+ SET
8
+ order_id = adjustable_id
9
+ WHERE
10
+ adjustable_type = 'Spree::Order'
11
+ ;
12
+ SQL
13
+
14
+ # Submitter of change does not care about MySQL, as it is not officially supported.
15
+ # Still spree officials decided to provide a working code path for MySQL users, hence
16
+ # submitter made a AR code path he could validate on PostgreSQL.
17
+ #
18
+ # Whoever runs a big enough MySQL installation where the AR solution hurts:
19
+ # Will have to write a better MySQL specific equivalent.
20
+ if Spree::Order.connection.adapter_name.eql?('MySQL')
21
+ Spree::Adjustment.where(adjustable_type: 'Spree::LineItem').find_each do |adjustment|
22
+ adjustment.update_columns(order_id: Spree::LineItem.find(adjustment.adjustable_id).order_id)
23
+ end
24
+ else
25
+ execute(<<-SQL.squish)
26
+ UPDATE
27
+ spree_adjustments
28
+ SET
29
+ order_id =
30
+ (SELECT order_id FROM spree_line_items WHERE spree_line_items.id = spree_adjustments.adjustable_id)
31
+ WHERE
32
+ adjustable_type = 'Spree::LineItem'
33
+ SQL
34
+ end
35
+
36
+ say 'Fix schema for spree_adjustments order_id column'
37
+ change_table :spree_adjustments do |t|
38
+ t.change :order_id, :integer, null: false
39
+ end
40
+
41
+ # Improved schema for postgresql, uncomment if you like it:
42
+ #
43
+ # # Negated Logical implication.
44
+ # #
45
+ # # When adjustable_type is 'Spree::Order' (p) the adjustable_id must be order_id (q).
46
+ # #
47
+ # # When adjustable_type is NOT 'Spree::Order' the adjustable id allowed to be any value (including of order_id in
48
+ # # case foreign keys match). XOR does not work here.
49
+ # #
50
+ # # Postgresql does not have an operator for logical implication. So we need to build the following truth table
51
+ # # via AND with OR:
52
+ # #
53
+ # # p q | CHECK = !(p -> q)
54
+ # # -----------
55
+ # # t t | t
56
+ # # t f | f
57
+ # # f t | t
58
+ # # f f | t
59
+ # #
60
+ # # According to de-morgans law the logical implication q -> p is equivalent to !p || q
61
+ # #
62
+ # execute(<<-SQL.squish)
63
+ # ALTER TABLE ONLY spree_adjustments
64
+ # ADD CONSTRAINT fk_spree_adjustments FOREIGN KEY (order_id)
65
+ # REFERENCES spree_orders(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
66
+ # ADD CONSTRAINT check_spree_adjustments_order_id CHECK
67
+ # (adjustable_type <> 'Spree::Order' OR order_id = adjustable_id);
68
+ # SQL
69
+ end
70
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- '2.3.10'
3
+ '2.3.11'
4
4
  end
5
5
  end
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.3.10
4
+ version: 2.3.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.0.0.rc.3
55
55
  - !ruby/object:Gem::Dependency
56
- name: aws-sdk
56
+ name: aws-sdk-v1
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.27.0
61
+ version: 1.64.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.27.0
68
+ version: 1.64.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cancancan
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -244,16 +244,16 @@ dependencies:
244
244
  name: rails
245
245
  requirement: !ruby/object:Gem::Requirement
246
246
  requirements:
247
- - - '='
247
+ - - "~>"
248
248
  - !ruby/object:Gem::Version
249
- version: 4.1.9
249
+ version: 4.1.11
250
250
  type: :runtime
251
251
  prerelease: false
252
252
  version_requirements: !ruby/object:Gem::Requirement
253
253
  requirements:
254
- - - '='
254
+ - - "~>"
255
255
  - !ruby/object:Gem::Version
256
- version: 4.1.9
256
+ version: 4.1.11
257
257
  - !ruby/object:Gem::Dependency
258
258
  name: ransack
259
259
  requirement: !ruby/object:Gem::Requirement
@@ -622,6 +622,7 @@ files:
622
622
  - db/migrate/20141101231208_fix_adjustment_order_presence.rb
623
623
  - db/migrate/20141105213646_update_classifications_positions.rb
624
624
  - db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb
625
+ - db/migrate/20150515211137_fix_adjustment_order_id.rb
625
626
  - db/seeds.rb
626
627
  - lib/generators/spree/custom_user/custom_user_generator.rb
627
628
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt