spree_core 2.3.2 → 2.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/spree.js.coffee.erb +2 -1
- data/app/models/spree/ability.rb +0 -4
- data/app/models/spree/order.rb +6 -8
- data/app/models/spree/order/checkout.rb +2 -1
- data/app/models/spree/order_populator.rb +1 -2
- data/app/models/spree/order_updater.rb +1 -0
- data/app/models/spree/payment.rb +4 -4
- data/app/models/spree/payment/processing.rb +4 -1
- data/app/models/spree/product.rb +15 -4
- data/app/models/spree/product_property.rb +2 -1
- data/app/models/spree/promotion.rb +1 -0
- data/app/models/spree/validations/db_maximum_length_validator.rb +22 -0
- data/lib/spree/core/controller_helpers/order.rb +25 -9
- data/lib/spree/core/search/base.rb +11 -2
- data/lib/spree/core/validators/email.rb +1 -23
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +4 -4
- data/lib/spree/testing_support/order_walkthrough.rb +2 -3
- data/lib/spree/testing_support/preferences.rb +2 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b180601af90a25cab2272036e7e46087ad23181
|
4
|
+
data.tar.gz: 9380b234a2c586b66ca775c79d6299d9d65c5b0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b175161e97670be7b65499e3b07b105f62847bd5ee18a7f07cfb83215c0756d6ff99bb617986ffcb860dfecc440df8f63b9313048cc6e7bcdac7428e58c9c3fc
|
7
|
+
data.tar.gz: a3a4564276563192dc89b30e225aff9b28ccc5c1ddaeb0696403f6a8a062df67267fe152154c15f7cc0274c0cccf7408131a430c679d4ad6c7e2fbd0b8ac3ce6
|
@@ -7,7 +7,8 @@ class window.Spree
|
|
7
7
|
"<%= Rails.application.routes.url_helpers.spree_path %>"
|
8
8
|
|
9
9
|
@pathFor: (path) ->
|
10
|
-
"#{window.location.
|
10
|
+
locationOrigin = "#{window.location.protocol}//#{window.location.hostname}" + (if window.location.port then ":#{window.location.port}" else "")
|
11
|
+
"#{locationOrigin}#{@mountedAt()}#{path}"
|
11
12
|
|
12
13
|
# Helper function to take a URL and add query parameters to it
|
13
14
|
# Uses the JSUri library from here: https://code.google.com/p/jsuri/
|
data/app/models/spree/ability.rb
CHANGED
@@ -46,10 +46,6 @@ module Spree
|
|
46
46
|
can [:read, :update], Order do |order, token|
|
47
47
|
order.user == user || order.guest_token && token == order.guest_token
|
48
48
|
end
|
49
|
-
can [:create, :read], Address
|
50
|
-
can :update, Address do |address|
|
51
|
-
user.bill_address == address || user.ship_address == address
|
52
|
-
end
|
53
49
|
can :display, CreditCard, user_id: user.id
|
54
50
|
can :display, Product
|
55
51
|
can :display, ProductProperty
|
data/app/models/spree/order.rb
CHANGED
@@ -629,14 +629,12 @@ module Spree
|
|
629
629
|
end
|
630
630
|
end
|
631
631
|
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
self.update!
|
639
|
-
end
|
632
|
+
def after_cancel
|
633
|
+
shipments.each { |shipment| shipment.cancel! }
|
634
|
+
payments.completed.each { |payment| payment.cancel! }
|
635
|
+
send_cancel_email
|
636
|
+
self.update!
|
637
|
+
end
|
640
638
|
|
641
639
|
def send_cancel_email
|
642
640
|
OrderMailer.cancel_email(self.id).deliver
|
@@ -71,7 +71,7 @@ module Spree
|
|
71
71
|
|
72
72
|
if states[:payment]
|
73
73
|
before_transition to: :complete do |order|
|
74
|
-
if order.payment_required? && order.payments.empty?
|
74
|
+
if order.payment_required? && order.payments.valid.empty?
|
75
75
|
order.errors.add(:base, Spree.t(:no_payment_found))
|
76
76
|
false
|
77
77
|
elsif order.payment_required?
|
@@ -96,6 +96,7 @@ module Spree
|
|
96
96
|
if states[:delivery]
|
97
97
|
before_transition to: :delivery, do: :create_proposed_shipments
|
98
98
|
before_transition to: :delivery, do: :ensure_available_shipping_rates
|
99
|
+
before_transition to: :delivery, do: :set_shipments_cost
|
99
100
|
before_transition from: :delivery, do: :apply_free_shipping_promotions
|
100
101
|
end
|
101
102
|
|
@@ -11,7 +11,6 @@ module Spree
|
|
11
11
|
|
12
12
|
def populate(variant_id, quantity)
|
13
13
|
attempt_cart_add(variant_id, quantity)
|
14
|
-
order.ensure_updated_shipments
|
15
14
|
valid?
|
16
15
|
end
|
17
16
|
|
@@ -26,7 +25,7 @@ module Spree
|
|
26
25
|
# 2,147,483,647 is crazy.
|
27
26
|
# See issue #2695.
|
28
27
|
if quantity > 2_147_483_647
|
29
|
-
errors.add(:base, Spree.t(:please_enter_reasonable_quantity, :
|
28
|
+
errors.add(:base, Spree.t(:please_enter_reasonable_quantity, scope: :order_populator))
|
30
29
|
return false
|
31
30
|
end
|
32
31
|
|
data/app/models/spree/payment.rb
CHANGED
@@ -23,12 +23,16 @@ module Spree
|
|
23
23
|
|
24
24
|
# update the order totals, etc.
|
25
25
|
after_save :update_order
|
26
|
+
|
26
27
|
# invalidate previously entered payments
|
27
28
|
after_create :invalidate_old_payments
|
28
29
|
|
29
30
|
attr_accessor :source_attributes, :request_env
|
30
31
|
|
31
32
|
after_initialize :build_source
|
33
|
+
after_rollback :persist_invalid
|
34
|
+
|
35
|
+
validates :amount, numericality: true
|
32
36
|
|
33
37
|
default_scope -> { order("#{self.table_name}.created_at") }
|
34
38
|
|
@@ -41,10 +45,6 @@ module Spree
|
|
41
45
|
scope :risky, -> { where("avs_response IN (?) OR (cvv_response_code IS NOT NULL and cvv_response_code != 'M') OR state = 'failed'", RISKY_AVS_CODES) }
|
42
46
|
scope :valid, -> { where.not(state: %w(failed invalid)) }
|
43
47
|
|
44
|
-
after_rollback :persist_invalid
|
45
|
-
|
46
|
-
validates :amount, numericality: true
|
47
|
-
|
48
48
|
def persist_invalid
|
49
49
|
return unless ['failed', 'invalid'].include?(state)
|
50
50
|
state_will_change!
|
@@ -81,6 +81,9 @@ module Spree
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def credit!(credit_amount=nil)
|
84
|
+
raise Core::GatewayError.new(Spree.t(:payment_processing_failed)) if processing?
|
85
|
+
|
86
|
+
started_processing!
|
84
87
|
protect_from_connection_error do
|
85
88
|
check_environment
|
86
89
|
|
@@ -97,6 +100,7 @@ module Spree
|
|
97
100
|
record_response(response)
|
98
101
|
|
99
102
|
if response.success?
|
103
|
+
self.update_column(:state, 'completed')
|
100
104
|
self.class.create!(
|
101
105
|
:order => order,
|
102
106
|
:source => self,
|
@@ -121,7 +125,6 @@ module Spree
|
|
121
125
|
|
122
126
|
def partial_credit(amount)
|
123
127
|
return if amount > credit_allowed
|
124
|
-
started_processing!
|
125
128
|
credit!(amount)
|
126
129
|
end
|
127
130
|
|
data/app/models/spree/product.rb
CHANGED
@@ -273,11 +273,22 @@ module Spree
|
|
273
273
|
end
|
274
274
|
|
275
275
|
# there's a weird quirk with the delegate stuff that does not automatically save the delegate object
|
276
|
-
# when saving so we force a save using a hook
|
276
|
+
# when saving so we force a save using a hook
|
277
|
+
# Fix for issue #5306
|
277
278
|
def save_master
|
278
|
-
|
279
|
-
master.
|
280
|
-
|
279
|
+
begin
|
280
|
+
if master && (master.changed? || master.new_record? || (master.default_price && (master.default_price.changed? || master.default_price.new_record?)))
|
281
|
+
master.save!
|
282
|
+
@nested_changes = true
|
283
|
+
end
|
284
|
+
|
285
|
+
# If the master cannot be saved, the Product object will get its errors
|
286
|
+
# and will be destroyed
|
287
|
+
rescue ActiveRecord::RecordInvalid
|
288
|
+
master.errors.each do |att, error|
|
289
|
+
self.errors.add(att, error)
|
290
|
+
end
|
291
|
+
raise
|
281
292
|
end
|
282
293
|
end
|
283
294
|
|
@@ -4,7 +4,8 @@ module Spree
|
|
4
4
|
belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties
|
5
5
|
|
6
6
|
validates :property, presence: true
|
7
|
-
|
7
|
+
|
8
|
+
validates_with Spree::Validations::DbMaximumLengthValidator, field: :value
|
8
9
|
|
9
10
|
default_scope -> { order("#{self.table_name}.position") }
|
10
11
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Spree
|
2
|
+
module Validations
|
3
|
+
##
|
4
|
+
# Validates a field based on the maximum length of the underlying DB field, if there is one.
|
5
|
+
class DbMaximumLengthValidator < ActiveModel::Validator
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
super
|
9
|
+
@field = options[:field].to_s
|
10
|
+
raise ArgumentError.new("a field must be specified to the validator") if @field.blank?
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate(record)
|
14
|
+
limit = record.class.columns_hash[@field].limit
|
15
|
+
value = record[@field.to_sym]
|
16
|
+
if value && limit && value.to_s.length > limit
|
17
|
+
record.errors.add(@field.to_sym, :too_long, count: limit)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -14,7 +14,15 @@ module Spree
|
|
14
14
|
|
15
15
|
# Used in the link_to_cart helper.
|
16
16
|
def simple_current_order
|
17
|
-
|
17
|
+
|
18
|
+
return @simple_current_order if @simple_current_order
|
19
|
+
|
20
|
+
@simple_current_order = find_order_by_token_or_user
|
21
|
+
|
22
|
+
if @simple_current_order
|
23
|
+
@simple_current_order.last_ip_address = ip_address
|
24
|
+
return @simple_current_order
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
# The current incomplete order from the guest_token for use in cart and during checkout
|
@@ -24,15 +32,9 @@ module Spree
|
|
24
32
|
|
25
33
|
return @current_order if @current_order
|
26
34
|
|
27
|
-
|
28
|
-
@current_order = Spree::Order.incomplete.includes(:adjustments).lock(options[:lock]).find_by(current_order_params)
|
35
|
+
@current_order = find_order_by_token_or_user(options)
|
29
36
|
|
30
|
-
|
31
|
-
if @current_order.nil? && try_spree_current_user
|
32
|
-
@current_order = Spree::Order.incomplete.order('id DESC').where({ currency: current_currency, user_id: try_spree_current_user.try(:id)}).first
|
33
|
-
end
|
34
|
-
|
35
|
-
if options[:create_order_if_necessary] and (@current_order.nil? or @current_order.completed?)
|
37
|
+
if options[:create_order_if_necessary] && (@current_order.nil? || @current_order.completed?)
|
36
38
|
@current_order = Spree::Order.new(current_order_params)
|
37
39
|
@current_order.user ||= try_spree_current_user
|
38
40
|
# See issue #3346 for reasons why this line is here
|
@@ -79,6 +81,20 @@ module Spree
|
|
79
81
|
def current_order_params
|
80
82
|
{ currency: current_currency, guest_token: cookies.signed[:guest_token], user_id: try_spree_current_user.try(:id) }
|
81
83
|
end
|
84
|
+
|
85
|
+
def find_order_by_token_or_user(options={})
|
86
|
+
|
87
|
+
# Find any incomplete orders for the guest_token
|
88
|
+
order = Spree::Order.incomplete.includes(:adjustments).lock(options[:lock]).find_by(current_order_params)
|
89
|
+
|
90
|
+
# Find any incomplete orders for the current user
|
91
|
+
if order.nil? && try_spree_current_user
|
92
|
+
order = Spree::Order.incomplete.order('id DESC').where({ currency: current_currency, user_id: try_spree_current_user.try(:id)}).first
|
93
|
+
end
|
94
|
+
|
95
|
+
order
|
96
|
+
end
|
97
|
+
|
82
98
|
end
|
83
99
|
end
|
84
100
|
end
|
@@ -13,10 +13,9 @@ module Spree
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def retrieve_products
|
16
|
-
@
|
16
|
+
@products = get_base_scope
|
17
17
|
curr_page = page || 1
|
18
18
|
|
19
|
-
@products = @products_scope.includes([:master => :prices])
|
20
19
|
unless Spree::Config.show_products_without_price
|
21
20
|
@products = @products.where("spree_prices.amount IS NOT NULL").where("spree_prices.currency" => current_currency)
|
22
21
|
end
|
@@ -37,9 +36,18 @@ module Spree
|
|
37
36
|
base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
|
38
37
|
base_scope = get_products_conditions_for(base_scope, keywords)
|
39
38
|
base_scope = add_search_scopes(base_scope)
|
39
|
+
base_scope = add_eagerload_scopes(base_scope)
|
40
40
|
base_scope
|
41
41
|
end
|
42
42
|
|
43
|
+
def add_eagerload_scopes scope
|
44
|
+
if include_images
|
45
|
+
scope.eager_load({master: [:prices, :images]})
|
46
|
+
else
|
47
|
+
scope.includes(master: :prices)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
43
51
|
def add_search_scopes(base_scope)
|
44
52
|
search.each do |name, scope_attribute|
|
45
53
|
scope_name = name.to_sym
|
@@ -64,6 +72,7 @@ module Spree
|
|
64
72
|
@properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
|
65
73
|
@properties[:keywords] = params[:keywords]
|
66
74
|
@properties[:search] = params[:search]
|
75
|
+
@properties[:include_images] = params[:include_images]
|
67
76
|
|
68
77
|
per_page = params[:per_page].to_i
|
69
78
|
@properties[:per_page] = per_page > 0 ? per_page : Spree::Config[:products_per_page]
|
@@ -1,29 +1,7 @@
|
|
1
|
-
# Borrowed from http://my.rails-royce.org/2010/07/21/email-validation-in-ruby-on-rails-without-regexp/
|
2
|
-
# Mentioned in tweet here: https://twitter.com/_sohara/status/177120126083141633
|
3
|
-
require 'mail'
|
4
1
|
class EmailValidator < ActiveModel::EachValidator
|
5
2
|
def validate_each(record,attribute,value)
|
6
|
-
unless
|
3
|
+
unless value =~ /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
|
7
4
|
record.errors.add(attribute, :invalid, {:value => value}.merge!(options))
|
8
5
|
end
|
9
6
|
end
|
10
|
-
|
11
|
-
def valid?(email)
|
12
|
-
begin
|
13
|
-
m = Mail::Address.new(email)
|
14
|
-
# We must check that value contains a domain and that value is an email address
|
15
|
-
r = m.domain && m.address == email
|
16
|
-
t = m.__send__(:tree)
|
17
|
-
# We need to dig into treetop
|
18
|
-
# A valid domain must have dot_atom_text elements size > 1
|
19
|
-
# user@localhost is excluded
|
20
|
-
# treetop must respond to domain
|
21
|
-
# We exclude valid email values like <user@localhost.com>
|
22
|
-
# Hence we use m.__send__(tree).domain
|
23
|
-
r &&= (t.domain.dot_atom_text.elements.size > 1)
|
24
|
-
rescue Exception => e
|
25
|
-
r = false
|
26
|
-
end
|
27
|
-
r
|
28
|
-
end
|
29
7
|
end
|
data/lib/spree/core/version.rb
CHANGED
@@ -13,7 +13,7 @@ module CapybaraExt
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def within_row(num, &block)
|
16
|
-
if
|
16
|
+
if RSpec.current_example.metadata[:js]
|
17
17
|
within("table.index tbody tr:nth-child(#{num})", &block)
|
18
18
|
else
|
19
19
|
within(:xpath, all("table.index tbody tr")[num-1].path, &block)
|
@@ -21,7 +21,7 @@ module CapybaraExt
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def column_text(num)
|
24
|
-
if
|
24
|
+
if RSpec.current_example.metadata[:js]
|
25
25
|
find("td:nth-child(#{num})").text
|
26
26
|
else
|
27
27
|
all("td")[num-1].text
|
@@ -133,7 +133,7 @@ RSpec::Matchers.define :have_meta do |name, expected|
|
|
133
133
|
has_css?("meta[name='#{name}'][content='#{expected}']", visible: false)
|
134
134
|
end
|
135
135
|
|
136
|
-
|
136
|
+
failure_message do |actual|
|
137
137
|
actual = first("meta[name='#{name}']")
|
138
138
|
if actual
|
139
139
|
"expected that meta #{name} would have content='#{expected}' but was '#{actual[:content]}'"
|
@@ -148,7 +148,7 @@ RSpec::Matchers.define :have_title do |expected|
|
|
148
148
|
has_css?("title", :text => expected, visible: false)
|
149
149
|
end
|
150
150
|
|
151
|
-
|
151
|
+
failure_message do |actual|
|
152
152
|
actual = first("title")
|
153
153
|
if actual
|
154
154
|
"expected that title would have been '#{expected}' but was '#{actual.text}'"
|
@@ -20,7 +20,7 @@ class OrderWalkthrough
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
order = Spree::Order.create!(:
|
23
|
+
order = Spree::Order.create!(email: "spree@example.com")
|
24
24
|
add_line_item!(order)
|
25
25
|
order.next!
|
26
26
|
|
@@ -50,7 +50,7 @@ class OrderWalkthrough
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def self.payment(order)
|
53
|
-
order.payments.create!(:
|
53
|
+
order.payments.create!(payment_method: Spree::PaymentMethod.first, amount: order.total)
|
54
54
|
# TODO: maybe look at some way of making this payment_state change automatic
|
55
55
|
order.payment_state = 'paid'
|
56
56
|
order.next!
|
@@ -65,4 +65,3 @@ class OrderWalkthrough
|
|
65
65
|
end
|
66
66
|
|
67
67
|
end
|
68
|
-
|
@@ -22,8 +22,8 @@ module Spree
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def assert_preference_unset(preference)
|
25
|
-
find("#preferences_#{preference}")['checked'].should
|
26
|
-
Spree::Config[preference].should
|
25
|
+
find("#preferences_#{preference}")['checked'].should be false
|
26
|
+
Spree::Config[preference].should be false
|
27
27
|
end
|
28
28
|
end
|
29
29
|
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.
|
4
|
+
version: 2.3.3
|
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-
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemerchant
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.44.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.44.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: acts_as_list
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -445,6 +445,7 @@ files:
|
|
445
445
|
- app/models/spree/taxon.rb
|
446
446
|
- app/models/spree/taxonomy.rb
|
447
447
|
- app/models/spree/tracker.rb
|
448
|
+
- app/models/spree/validations/db_maximum_length_validator.rb
|
448
449
|
- app/models/spree/variant.rb
|
449
450
|
- app/models/spree/variant/scopes.rb
|
450
451
|
- app/models/spree/zone.rb
|