spree_core 2.3.2 → 2.3.3
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 +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
|