solidus_core 2.11.3 → 2.11.8
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/models/spree/address.rb +28 -5
- data/app/models/spree/base.rb +39 -14
- data/app/models/spree/calculator.rb +8 -4
- data/app/models/spree/calculator/free_shipping.rb +1 -0
- data/app/models/spree/calculator/percent_per_item.rb +2 -0
- data/app/models/spree/calculator/price_sack.rb +1 -0
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order_merger.rb +1 -1
- data/app/models/spree/payment.rb +10 -3
- data/app/models/spree/payment/cancellation.rb +3 -22
- data/app/models/spree/payment_method.rb +3 -0
- data/app/models/spree/payment_source.rb +2 -2
- data/app/models/spree/product.rb +8 -2
- data/app/models/spree/product/scopes.rb +0 -1
- data/app/models/spree/promotion_action.rb +3 -0
- data/app/models/spree/promotion_rule.rb +4 -0
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/inventory_validator.rb +2 -2
- data/app/models/spree/taxon/active_storage_attachment.rb +1 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +1 -0
- data/db/migrate/20210122110141_add_name_to_spree_addresses.rb +13 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +4 -1
- data/lib/spree/app_configuration.rb +1 -1
- data/lib/spree/core.rb +1 -4
- data/lib/spree/core/engine.rb +7 -8
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/permitted_attributes.rb +5 -5
- data/lib/spree/preferences/persistable.rb +23 -0
- data/lib/spree/testing_support.rb +31 -0
- data/lib/spree/testing_support/dummy_app.rb +4 -2
- data/lib/spree/testing_support/dummy_app/mailer_previews/test_mailer_preview.rb +4 -0
- data/lib/spree/testing_support/factories.rb +8 -4
- data/lib/spree/testing_support/factories/address_factory.rb +6 -2
- data/lib/spree/testing_support/factories/adjustment_factory.rb +10 -5
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +5 -0
- data/lib/spree/testing_support/factories/calculator_factory.rb +5 -0
- data/lib/spree/testing_support/factories/carton_factory.rb +7 -2
- data/lib/spree/testing_support/factories/country_factory.rb +5 -0
- data/lib/spree/testing_support/factories/credit_card_factory.rb +5 -0
- data/lib/spree/testing_support/factories/customer_return_factory.rb +8 -3
- data/lib/spree/testing_support/factories/image_factory.rb +5 -0
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +9 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +7 -2
- data/lib/spree/testing_support/factories/option_type_factory.rb +8 -0
- data/lib/spree/testing_support/factories/option_value_factory.rb +5 -0
- data/lib/spree/testing_support/factories/order_factory.rb +11 -6
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +7 -2
- data/lib/spree/testing_support/factories/payment_factory.rb +9 -4
- data/lib/spree/testing_support/factories/payment_method_factory.rb +5 -0
- data/lib/spree/testing_support/factories/price_factory.rb +6 -1
- data/lib/spree/testing_support/factories/product_factory.rb +10 -5
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +7 -2
- data/lib/spree/testing_support/factories/product_property_factory.rb +7 -2
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +5 -0
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +7 -2
- data/lib/spree/testing_support/factories/promotion_factory.rb +7 -2
- data/lib/spree/testing_support/factories/property_factory.rb +5 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +7 -2
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +5 -0
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +6 -1
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +5 -0
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +8 -3
- data/lib/spree/testing_support/factories/return_item_factory.rb +8 -3
- data/lib/spree/testing_support/factories/return_reason_factory.rb +5 -0
- data/lib/spree/testing_support/factories/role_factory.rb +5 -0
- data/lib/spree/testing_support/factories/shipment_factory.rb +9 -3
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +5 -0
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +8 -3
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +7 -2
- data/lib/spree/testing_support/factories/state_factory.rb +7 -1
- data/lib/spree/testing_support/factories/stock_item_factory.rb +7 -2
- data/lib/spree/testing_support/factories/stock_location_factory.rb +8 -3
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +6 -1
- data/lib/spree/testing_support/factories/stock_package_factory.rb +7 -2
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +5 -0
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +7 -2
- data/lib/spree/testing_support/factories/store_credit_factory.rb +8 -3
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +5 -0
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +5 -0
- data/lib/spree/testing_support/factories/store_factory.rb +6 -1
- data/lib/spree/testing_support/factories/tax_category_factory.rb +7 -1
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +8 -3
- data/lib/spree/testing_support/factories/taxon_factory.rb +6 -1
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +5 -0
- data/lib/spree/testing_support/factories/user_factory.rb +8 -3
- data/lib/spree/testing_support/factories/variant_factory.rb +9 -4
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +7 -2
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +8 -3
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +7 -2
- data/lib/spree/testing_support/factories/zone_factory.rb +7 -2
- data/lib/spree/testing_support/factory_bot.rb +68 -0
- data/lib/spree/testing_support/order_walkthrough.rb +10 -10
- data/lib/spree/testing_support/sequences.rb +4 -1
- data/{app/models → lib}/spree/user_class_handle.rb +0 -0
- data/lib/tasks/email.rake +3 -2
- data/lib/tasks/migrations/migrate_address_names.rake +158 -0
- data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +38 -0
- data/lib/tasks/upgrade.rake +13 -0
- data/solidus_core.gemspec +24 -2
- metadata +49 -23
- data/lib/spree/awesome_nested_set_override.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0d36b03697769f4d9449dfeac2da6004e9d06b7d1575489abbbecf5497dfae1
|
4
|
+
data.tar.gz: a0de4d86e474402ac44765317ab8ffb2967dbb4de6675491616af185e17fb3dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f1a2577af4ea0108060bb3e9d81e81fa7114813b6ce5b1d925f53378da6b2f9c41b5e22d67d65389d2ee4e3d57719c79855fa4bbbb820f0cac68b63afeb313a
|
7
|
+
data.tar.gz: f4bf3efd9563905b2eca58c6df0b95c9c1591b0a46c07cbc4bfaaed0000cd691f2e9333dc7f860c78a0a450c38f38f2a74d1b8ab63f15e188ac46de5d7080520
|
data/app/models/spree/address.rb
CHANGED
@@ -92,6 +92,12 @@ module Spree
|
|
92
92
|
if base['lastname'].presence || base['last_name'].presence
|
93
93
|
base['lastname'] = name_from_attributes.last_name
|
94
94
|
end
|
95
|
+
|
96
|
+
virtual_name = name_from_attributes.value
|
97
|
+
if base['name'].blank? && virtual_name.present?
|
98
|
+
base['name'] = virtual_name
|
99
|
+
end
|
100
|
+
|
95
101
|
excluded_attributes = DB_ONLY_ATTRS + %w(first_name last_name)
|
96
102
|
|
97
103
|
base.except(*excluded_attributes)
|
@@ -120,7 +126,11 @@ module Spree
|
|
120
126
|
# @return [Boolean] true if the two addresses have the same address fields
|
121
127
|
def ==(other_address)
|
122
128
|
return false unless other_address && other_address.respond_to?(:value_attributes)
|
123
|
-
|
129
|
+
if Spree::Config.use_combined_first_and_last_name_in_address
|
130
|
+
value_attributes.except(*LEGACY_NAME_ATTRS) == other_address.value_attributes.except(*LEGACY_NAME_ATTRS)
|
131
|
+
else
|
132
|
+
value_attributes == other_address.value_attributes
|
133
|
+
end
|
124
134
|
end
|
125
135
|
|
126
136
|
# @deprecated Do not use this. Use Address.== instead.
|
@@ -193,17 +203,30 @@ module Spree
|
|
193
203
|
country && country.iso
|
194
204
|
end
|
195
205
|
|
206
|
+
before_save :set_name_from_firstname_and_lastname
|
207
|
+
|
208
|
+
def set_name_from_firstname_and_lastname
|
209
|
+
name_from_firstname_and_lastname = Spree::Address::Name.from_attributes(attributes.except(:name, 'name'))
|
210
|
+
|
211
|
+
if read_attribute(:name).blank? && name_from_firstname_and_lastname.present?
|
212
|
+
write_attribute(:name, name_from_firstname_and_lastname)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
196
216
|
# @return [String] the full name on this address
|
197
217
|
def name
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
218
|
+
self[:name] || begin
|
219
|
+
Spree::Address::Name.new(
|
220
|
+
read_attribute(:firstname),
|
221
|
+
read_attribute(:lastname)
|
222
|
+
).value
|
223
|
+
end
|
202
224
|
end
|
203
225
|
|
204
226
|
def name=(value)
|
205
227
|
return if value.nil?
|
206
228
|
|
229
|
+
write_attribute(:name, value)
|
207
230
|
name_from_value = Spree::Address::Name.new(value)
|
208
231
|
write_attribute(:firstname, name_from_value.first_name)
|
209
232
|
write_attribute(:lastname, name_from_value.last_name)
|
data/app/models/spree/base.rb
CHANGED
@@ -1,25 +1,50 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/preferences/persistable'
|
4
|
+
|
3
5
|
class Spree::Base < ActiveRecord::Base
|
4
|
-
include Spree::Preferences::Preferable
|
5
6
|
include Spree::Core::Permalinks
|
6
|
-
serialize :preferences, Hash
|
7
|
-
|
8
7
|
include Spree::RansackableAttributes
|
9
8
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def self.preference(*args)
|
10
|
+
Spree::Deprecation.warn <<~WARN
|
11
|
+
#{name} has a `preferences` column, but does not explicitly (de)serialize this column.
|
12
|
+
In order to make #{name} work with future versions of Solidus (and Rails), please add the
|
13
|
+
following line to your class:
|
14
|
+
```
|
15
|
+
class #{name}
|
16
|
+
include Spree::Preferences::Persistable
|
17
|
+
...
|
18
|
+
end
|
19
|
+
```
|
20
|
+
WARN
|
21
|
+
include Spree::Preferences::Persistable
|
22
|
+
preference(*args)
|
14
23
|
end
|
15
24
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
25
|
+
def preferences
|
26
|
+
value = read_attribute(:preferences)
|
27
|
+
if !value.is_a?(Hash)
|
28
|
+
Spree::Deprecation.warn <<~WARN
|
29
|
+
#{self.class.name} has a `preferences` column, but does not explicitly (de)serialize this column.
|
30
|
+
In order to make #{self.class.name} work with future versions of Solidus (and Rails), please add the
|
31
|
+
following lines to your class:
|
32
|
+
```
|
33
|
+
class #{self.class.name}
|
34
|
+
include Spree::Preferences::Persistable
|
35
|
+
...
|
36
|
+
end
|
37
|
+
```
|
38
|
+
WARN
|
39
|
+
self.class.include Spree::Preferences::Persistable
|
40
|
+
|
41
|
+
ActiveRecord::Type::Serialized.new(
|
42
|
+
ActiveRecord::Type::Text.new,
|
43
|
+
ActiveRecord::Coders::YAMLColumn.new(:preferences, Hash)
|
44
|
+
).deserialize(value)
|
45
|
+
else
|
46
|
+
value
|
47
|
+
end
|
23
48
|
end
|
24
49
|
|
25
50
|
if Kaminari.config.page_method_name != :page
|
@@ -1,7 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/preferences/persistable'
|
4
|
+
|
3
5
|
module Spree
|
4
6
|
class Calculator < Spree::Base
|
7
|
+
include Spree::Preferences::Persistable
|
8
|
+
|
5
9
|
belongs_to :calculable, polymorphic: true, optional: true
|
6
10
|
|
7
11
|
# This method calls a compute_<computable> method. must be overriden in concrete calculator.
|
@@ -10,12 +14,12 @@ module Spree
|
|
10
14
|
def compute(computable)
|
11
15
|
# Spree::LineItem -> :compute_line_item
|
12
16
|
computable_name = computable.class.name.demodulize.underscore
|
13
|
-
|
17
|
+
method_name = "compute_#{computable_name}".to_sym
|
14
18
|
calculator_class = self.class
|
15
|
-
if respond_to?(
|
16
|
-
send(
|
19
|
+
if respond_to?(method_name)
|
20
|
+
send(method_name, computable)
|
17
21
|
else
|
18
|
-
raise NotImplementedError, "Please implement '#{
|
22
|
+
raise NotImplementedError, "Please implement '#{method_name}(#{computable_name})' in your calculator: #{calculator_class.name}"
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
@@ -8,6 +8,7 @@ module Spree
|
|
8
8
|
# now a Promotion Action which deals with these types of promotions instead.
|
9
9
|
class Calculator::FreeShipping < Calculator
|
10
10
|
def compute(object)
|
11
|
+
Spree::Deprecation.warn('This method is deprecated, because it is no longer used')
|
11
12
|
if object.is_a?(Array)
|
12
13
|
return if object.empty?
|
13
14
|
order = object.first.order
|
@@ -15,6 +15,8 @@ module Spree
|
|
15
15
|
preference :percent, :decimal, default: 0
|
16
16
|
|
17
17
|
def compute(object = nil)
|
18
|
+
Spree::Deprecation.warn('This method is deprecated, please use adjustments at line item level')
|
19
|
+
|
18
20
|
return 0 if object.nil?
|
19
21
|
object.line_items.sum { |line_item|
|
20
22
|
value_for_line_item(line_item)
|
@@ -11,6 +11,7 @@ module Spree
|
|
11
11
|
|
12
12
|
# as object we always get line items, as calculable we have Coupon, ShippingMethod
|
13
13
|
def compute(object)
|
14
|
+
Spree::Deprecation.warn('This method is deprecated, please use adjustments at line item level')
|
14
15
|
if object.is_a?(Array)
|
15
16
|
base = object.sum { |element| element.respond_to?(:amount) ? element.amount : BigDecimal(element.to_s) }
|
16
17
|
else
|
@@ -37,14 +37,14 @@ module Spree
|
|
37
37
|
|
38
38
|
private
|
39
39
|
|
40
|
-
def process_payments_with(
|
40
|
+
def process_payments_with(method_name)
|
41
41
|
# Don't run if there is nothing to pay.
|
42
42
|
return true if payment_total >= total
|
43
43
|
|
44
44
|
unprocessed_payments.each do |payment|
|
45
45
|
break if payment_total >= total
|
46
46
|
|
47
|
-
payment.public_send(
|
47
|
+
payment.public_send(method_name)
|
48
48
|
end
|
49
49
|
rescue Core::GatewayError => error
|
50
50
|
result = !!Spree::Config[:allow_checkout_on_gateway_error]
|
@@ -128,7 +128,7 @@ module Spree
|
|
128
128
|
# @param [Spree::LineItem] line_item The line item which could not be saved
|
129
129
|
# @return [void]
|
130
130
|
def handle_error(line_item)
|
131
|
-
order.errors
|
131
|
+
order.errors.add(:base, line_item.errors.full_messages)
|
132
132
|
end
|
133
133
|
|
134
134
|
# Save the order totals after merge
|
data/app/models/spree/payment.rb
CHANGED
@@ -168,9 +168,16 @@ module Spree
|
|
168
168
|
|
169
169
|
def validate_source
|
170
170
|
if source && !source.valid?
|
171
|
-
|
172
|
-
|
173
|
-
|
171
|
+
if Gem::Requirement.new(">= 6.1").satisfied_by?(Rails.gem_version)
|
172
|
+
source.errors.each do |error|
|
173
|
+
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{error.attribute}")
|
174
|
+
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope: 'spree'), "#{field_name} #{error.message}")
|
175
|
+
end
|
176
|
+
else
|
177
|
+
source.errors.each do |field, error|
|
178
|
+
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
|
179
|
+
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope: 'spree'), "#{field_name} #{error}")
|
180
|
+
end
|
174
181
|
end
|
175
182
|
end
|
176
183
|
if errors.any?
|
@@ -26,16 +26,10 @@ module Spree
|
|
26
26
|
# @param payment [Spree::Payment] - the payment that should be canceled
|
27
27
|
#
|
28
28
|
def cancel(payment)
|
29
|
-
|
30
|
-
|
31
|
-
if response = payment.payment_method.try_void(payment)
|
32
|
-
payment.handle_void_response(response)
|
33
|
-
else
|
34
|
-
payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason, perform_after_create: false).perform!
|
35
|
-
end
|
29
|
+
if response = payment.payment_method.try_void(payment)
|
30
|
+
payment.handle_void_response(response)
|
36
31
|
else
|
37
|
-
|
38
|
-
deprecated_behavior(payment)
|
32
|
+
payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason, perform_after_create: false).perform!
|
39
33
|
end
|
40
34
|
end
|
41
35
|
|
@@ -44,19 +38,6 @@ module Spree
|
|
44
38
|
def refund_reason
|
45
39
|
Spree::RefundReason.where(name: reason).first_or_create
|
46
40
|
end
|
47
|
-
|
48
|
-
def try_void_available?(payment_method)
|
49
|
-
payment_method.respond_to?(:try_void) &&
|
50
|
-
payment_method.method(:try_void).owner != Spree::PaymentMethod
|
51
|
-
end
|
52
|
-
|
53
|
-
def deprecated_behavior(payment)
|
54
|
-
Spree::Deprecation.warn "#{payment.payment_method.class.name}#cancel is deprecated and will be removed. " \
|
55
|
-
'Please implement a `try_void` method instead that returns a response object if void succeeds ' \
|
56
|
-
'or `false|nil` if not. Solidus will refund the payment then.'
|
57
|
-
response = payment.payment_method.cancel(payment.response_code)
|
58
|
-
payment.handle_void_response(response)
|
59
|
-
end
|
60
41
|
end
|
61
42
|
end
|
62
43
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/preferences/persistable'
|
3
4
|
require 'spree/preferences/statically_configurable'
|
4
5
|
|
5
6
|
module Spree
|
@@ -11,6 +12,8 @@ module Spree
|
|
11
12
|
# This class is not meant to be instantiated. Please create instances of concrete payment methods.
|
12
13
|
#
|
13
14
|
class PaymentMethod < Spree::Base
|
15
|
+
include Spree::Preferences::Persistable
|
16
|
+
|
14
17
|
preference :server, :string, default: 'test'
|
15
18
|
preference :test_mode, :boolean, default: true
|
16
19
|
|
@@ -23,9 +23,9 @@ module Spree
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# @param payment [Spree::Payment] the payment we want to know if can be voided
|
26
|
-
# @return [Boolean] true when the payment is not failed or
|
26
|
+
# @return [Boolean] true when the payment is not failed, voided or invalid
|
27
27
|
def can_void?(payment)
|
28
|
-
|
28
|
+
payment.can_void?
|
29
29
|
end
|
30
30
|
|
31
31
|
# Indicates whether its possible to credit the payment. Note that most
|
data/app/models/spree/product.rb
CHANGED
@@ -366,8 +366,14 @@ module Spree
|
|
366
366
|
# If the master is invalid, the Product object will be assigned its errors
|
367
367
|
def validate_master
|
368
368
|
unless master.valid?
|
369
|
-
|
370
|
-
errors.
|
369
|
+
if Gem::Requirement.new(">= 6.1").satisfied_by?(Rails.gem_version)
|
370
|
+
master.errors.each do |error|
|
371
|
+
errors.add(error.attribute, error.message)
|
372
|
+
end
|
373
|
+
else
|
374
|
+
master.errors.each do |att, error|
|
375
|
+
errors.add(att, error)
|
376
|
+
end
|
371
377
|
end
|
372
378
|
end
|
373
379
|
end
|
@@ -70,7 +70,6 @@ module Spree
|
|
70
70
|
add_search_scope :in_taxon do |taxon|
|
71
71
|
includes(:classifications)
|
72
72
|
.where('spree_products_taxons.taxon_id' => taxon.self_and_descendants.pluck(:id))
|
73
|
-
.select(Spree::Classification.arel_table[:position])
|
74
73
|
.order(Spree::Classification.arel_table[:position].asc)
|
75
74
|
end
|
76
75
|
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/preferences/persistable'
|
4
|
+
|
3
5
|
module Spree
|
4
6
|
# Base class for all types of promotion action.
|
5
7
|
#
|
6
8
|
# PromotionActions perform the necessary tasks when a promotion is activated
|
7
9
|
# by an event and determined to be eligible.
|
8
10
|
class PromotionAction < Spree::Base
|
11
|
+
include Spree::Preferences::Persistable
|
9
12
|
include Spree::SoftDeletable
|
10
13
|
|
11
14
|
belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_actions, optional: true
|
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/preferences/persistable'
|
4
|
+
|
3
5
|
module Spree
|
4
6
|
# Base class for all promotion rules
|
5
7
|
class PromotionRule < Spree::Base
|
8
|
+
include Spree::Preferences::Persistable
|
9
|
+
|
6
10
|
belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_rules, optional: true
|
7
11
|
|
8
12
|
scope :of_type, ->(type) { where(type: type) }
|
@@ -119,7 +119,7 @@ module Spree
|
|
119
119
|
|
120
120
|
def at_least_one_shipping_category
|
121
121
|
if shipping_categories.empty?
|
122
|
-
errors
|
122
|
+
errors.add(:base, "You need to select at least one shipping category")
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
@@ -11,10 +11,10 @@ module Spree
|
|
11
11
|
display_name = variant.name.to_s
|
12
12
|
display_name += %{ (#{variant.options_text})} unless variant.options_text.blank?
|
13
13
|
|
14
|
-
line_item.errors
|
14
|
+
line_item.errors.add(:quantity, I18n.t(
|
15
15
|
'spree.selected_quantity_not_available',
|
16
16
|
item: display_name.inspect
|
17
|
-
)
|
17
|
+
))
|
18
18
|
false
|
19
19
|
end
|
20
20
|
end
|
@@ -5,10 +5,10 @@ module Spree
|
|
5
5
|
class InventoryValidator < ActiveModel::Validator
|
6
6
|
def validate(line_item)
|
7
7
|
if line_item.inventory_units.count != line_item.quantity
|
8
|
-
line_item.errors
|
8
|
+
line_item.errors.add(:inventory, I18n.t(
|
9
9
|
'spree.inventory_not_available',
|
10
10
|
item: line_item.variant.name
|
11
|
-
)
|
11
|
+
))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -9,11 +9,10 @@ module Spree::Taxon::ActiveStorageAttachment
|
|
9
9
|
styles: { mini: '32x32>', normal: '128x128>' },
|
10
10
|
default_style: :mini
|
11
11
|
validate :icon_is_an_image
|
12
|
-
|
13
|
-
|
14
12
|
end
|
15
13
|
|
16
14
|
def attachment_partial_name
|
15
|
+
Spree::Deprecation.warn("calling #attachment_partial_name on Spree::Taxon is deprecated without replacement.")
|
17
16
|
'paperclip'
|
18
17
|
end
|
19
18
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddNameToSpreeAddresses < ActiveRecord::Migration[5.2]
|
4
|
+
def up
|
5
|
+
add_column :spree_addresses, :name, :string
|
6
|
+
add_index :spree_addresses, :name
|
7
|
+
end
|
8
|
+
|
9
|
+
def down
|
10
|
+
remove_index :spree_addresses, :name
|
11
|
+
remove_column :spree_addresses, :name
|
12
|
+
end
|
13
|
+
end
|