solidus_core 2.11.7 → 2.11.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.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4d85b2e48b45c5f20a8de9e1152813de4731e283946bb69c1bef2c01b8b9455
4
- data.tar.gz: 78b9982563a8722a9892313dc8c3a4f2631d291679cad631c482c13b25279090
3
+ metadata.gz: a612b396e4f6bd4624851ca8c6a234c6cc1628c8e6edf889d62fb57830b452a2
4
+ data.tar.gz: 95129bf8b5ad056d9356b63b4a89eaf36697208d16035e84b7627d8d3a710996
5
5
  SHA512:
6
- metadata.gz: ae52ba5c560040d3e6096d129dafc377b59de4ac7a536728f28c5099846d727e511ae2604f72f47473117cdc25e6b69e3aa690aeecc3df9d57a66b592cd73b80
7
- data.tar.gz: 2662be65dd3122d1f35bbd272b2b341ec4a54f123bde9acadb5145b726164a8bed4b4956d62c9577527ce9f130c040ffff0958bd576525c29eb7690d7bbf8ea6
6
+ metadata.gz: ba3b3f8246277100e2b3f9f71edca05cd76a1352e851cff75a36c68f7eb8107485ac7d258a0ea15703e3e7582542c24aef1d0201e9d3697b6fbbe80e6315581c
7
+ data.tar.gz: 219847c0d55e4b02063c69e32a7a0a0399600d083ab915c707722be181f87a591b87a2245e241ba77cee23253ca869228e638eecb8d3ebceb17e67371a125f05
@@ -9,11 +9,9 @@ module Spree
9
9
  class Attachment
10
10
  delegate_missing_to :@attachment
11
11
 
12
- DEFAULT_SIZE = '100%'
13
-
14
12
  def initialize(attachment, styles: {})
15
13
  @attachment = attachment
16
- @styles = styles
14
+ @styles = normalize_styles(styles)
17
15
  end
18
16
 
19
17
  def exists?
@@ -21,20 +19,18 @@ module Spree
21
19
  end
22
20
 
23
21
  def filename
24
- blob.filename.to_s
22
+ blob&.filename.to_s
25
23
  end
26
24
 
27
25
  def url(style = nil)
28
- variant(style).url
26
+ variant(style)&.url
29
27
  end
30
28
 
31
29
  def variant(style = nil)
32
- size = style_to_size(style&.to_sym)
30
+ size = style_to_size(style)
33
31
  @attachment.variant(
34
- resize: size,
35
- strip: true,
36
- 'auto-orient': true,
37
- colorspace: 'sRGB',
32
+ resize_to_limit: size,
33
+ strip: true
38
34
  ).processed
39
35
  end
40
36
 
@@ -61,8 +57,12 @@ module Spree
61
57
  @attachment.metadata
62
58
  end
63
59
 
60
+ def normalize_styles(styles)
61
+ styles.transform_values { |v| v.split('x') }
62
+ end
63
+
64
64
  def style_to_size(style)
65
- @styles.fetch(style) { DEFAULT_SIZE }
65
+ @styles.fetch(style&.to_sym) { [width, height] }
66
66
  end
67
67
  end
68
68
  end
@@ -107,6 +107,8 @@ module Spree
107
107
 
108
108
  def url(style = default_style)
109
109
  attachment.url(style)
110
+ rescue ActiveStorage::FileNotFoundError
111
+ "noimage/#{style}.png"
110
112
  end
111
113
 
112
114
  def destroy_attachment(_name)
@@ -1,28 +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
7
  include Spree::RansackableAttributes
7
8
 
8
- def preferences
9
- read_attribute(:preferences) || self.class.preferences_coder_class.new
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)
10
23
  end
11
24
 
12
- def initialize_preference_defaults
13
- if has_attribute?(:preferences)
14
- self.preferences = default_preferences.merge(preferences)
15
- end
16
- end
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
17
40
 
18
- # Only run preference initialization on models which requires it. Improves
19
- # performance of record initialization slightly.
20
- def self.preference(*args)
21
- # after_initialize can be called multiple times with the same symbol, it
22
- # will only be called once on initialization.
23
- serialize :preferences, preferences_coder_class
24
- after_initialize :initialize_preference_defaults
25
- super
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
26
48
  end
27
49
 
28
50
  if Kaminari.config.page_method_name != :page
@@ -35,10 +57,6 @@ class Spree::Base < ActiveRecord::Base
35
57
  end
36
58
  end
37
59
 
38
- def self.preferences_coder_class
39
- Hash
40
- end
41
-
42
60
  self.abstract_class = true
43
61
 
44
62
  # Provides a scope that should be included any time products
@@ -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.
@@ -7,6 +7,10 @@ module Spree::Image::ActiveStorageAttachment
7
7
  delegate :width, :height, to: :attachment, prefix: true
8
8
 
9
9
  included do
10
+ validates :attachment, presence: true
11
+ validate :attachment_is_an_image
12
+ validate :supported_content_type
13
+
10
14
  has_attachment :attachment,
11
15
  styles: {
12
16
  mini: '48x48>',
@@ -15,7 +19,11 @@ module Spree::Image::ActiveStorageAttachment
15
19
  large: '1200x1200>'
16
20
  },
17
21
  default_style: :product
18
- validates :attachment, presence: true
19
- validate :attachment_is_an_image
22
+
23
+ def supported_content_type
24
+ unless attachment.content_type.in?(Spree::Config.allowed_image_mime_types)
25
+ errors.add(:attachment, :content_type_not_supported)
26
+ end
27
+ end
20
28
  end
21
29
  end
@@ -15,7 +15,7 @@ module Spree::Image::PaperclipAttachment
15
15
  convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
16
16
  validates_attachment :attachment,
17
17
  presence: true,
18
- content_type: { content_type: %w[image/jpeg image/jpg image/png image/gif] }
18
+ content_type: { content_type: Spree::Config.allowed_image_mime_types }
19
19
 
20
20
  # save the w,h of the original image (from which others can be calculated)
21
21
  # we need to look at the write-queue for images which have not been saved yet
@@ -584,7 +584,7 @@ module Spree
584
584
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
585
585
  else
586
586
  shipments.destroy_all
587
- self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
587
+ shipments.push(*Spree::Config.stock.coordinator_class.new(self).shipments)
588
588
  end
589
589
  end
590
590
 
@@ -26,10 +26,16 @@ module Spree
26
26
  # @param payment [Spree::Payment] - the payment that should be canceled
27
27
  #
28
28
  def cancel(payment)
29
- if response = payment.payment_method.try_void(payment)
30
- payment.handle_void_response(response)
29
+ # For payment methods already implemeting `try_void`
30
+ if try_void_available?(payment.payment_method)
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
31
36
  else
32
- payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason, perform_after_create: false).perform!
37
+ # For payment methods not yet implemeting `try_void`
38
+ deprecated_behavior(payment)
33
39
  end
34
40
  end
35
41
 
@@ -38,6 +44,19 @@ module Spree
38
44
  def refund_reason
39
45
  Spree::RefundReason.where(name: reason).first_or_create
40
46
  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
41
60
  end
42
61
  end
43
62
  end
@@ -9,6 +9,10 @@ module Spree
9
9
 
10
10
  VALID_CCS = ['1', TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
11
11
 
12
+ AUTHORIZATION_CODE = '12345'
13
+ FAILURE_MESSAGE = 'Bogus Gateway: Forced failure'
14
+ SUCCESS_MESSAGE = 'Bogus Gateway: Forced success'
15
+
12
16
  attr_accessor :test
13
17
 
14
18
  def gateway_class
@@ -26,40 +30,40 @@ module Spree
26
30
  def authorize(_money, credit_card, _options = {})
27
31
  profile_id = credit_card.gateway_customer_profile_id
28
32
  if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
29
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
33
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'D' })
30
34
  else
31
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
35
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, { message: FAILURE_MESSAGE }, test: true)
32
36
  end
33
37
  end
34
38
 
35
39
  def purchase(_money, credit_card, _options = {})
36
40
  profile_id = credit_card.gateway_customer_profile_id
37
41
  if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
38
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
42
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'M' })
39
43
  else
40
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
44
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, message: FAILURE_MESSAGE, test: true)
41
45
  end
42
46
  end
43
47
 
44
48
  def credit(_money, _credit_card, _response_code, _options = {})
45
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
49
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
46
50
  end
47
51
 
48
52
  def capture(_money, authorization, _gateway_options)
49
53
  if authorization == '12345'
50
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true)
54
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true)
51
55
  else
52
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', error: 'Bogus Gateway: Forced failure', test: true)
56
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, error: FAILURE_MESSAGE, test: true)
53
57
  end
54
58
  end
55
59
 
56
60
  def void(_response_code, _credit_card, _options = {})
57
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
61
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
58
62
  end
59
63
 
60
64
  # @see Spree::PaymentMethod#try_void
61
65
  def try_void(_payment)
62
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
66
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
63
67
  end
64
68
 
65
69
  def test?
@@ -9,17 +9,17 @@ module Spree
9
9
 
10
10
  def authorize(_money, credit_card, _options = {})
11
11
  if VALID_CCS.include? credit_card.number
12
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
12
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'A' })
13
13
  else
14
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
14
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, { message: FAILURE_MESSAGE }, test: true)
15
15
  end
16
16
  end
17
17
 
18
18
  def purchase(_money, credit_card, _options = {})
19
19
  if VALID_CCS.include? credit_card.number
20
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
20
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'A' })
21
21
  else
22
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
22
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, message: FAILURE_MESSAGE, test: true)
23
23
  end
24
24
  end
25
25
  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
 
@@ -49,7 +49,6 @@ module Spree
49
49
 
50
50
  has_many :variants,
51
51
  -> { where(is_master: false).order(:position) },
52
- inverse_of: :product,
53
52
  class_name: 'Spree::Variant'
54
53
 
55
54
  has_many :variants_including_master,
@@ -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) }
@@ -48,6 +48,10 @@ module Spree
48
48
  return true if perform_after_create == false
49
49
  return true if transaction_id.present?
50
50
 
51
+ # This is needed otherwise set_perform_after_create_default callback
52
+ # will print a deprecation warning when save! creates a record
53
+ self.perform_after_create = false unless persisted?
54
+
51
55
  credit_cents = money.cents
52
56
 
53
57
  @perform_response = process!(credit_cents)
@@ -63,9 +67,7 @@ module Spree
63
67
  log_entries.build(details: perform_response.to_yaml)
64
68
 
65
69
  self.transaction_id = perform_response.authorization
66
- # This is needed otherwise set_perform_after_create_default callback
67
- # will print a deprecation warning when save! creates a record.
68
- self.perform_after_create = false unless persisted?
70
+
69
71
  save!
70
72
 
71
73
  update_order
@@ -73,11 +73,16 @@ module Spree
73
73
  packages = split_packages(packages)
74
74
 
75
75
  # Turn the Stock::Packages into a Shipment with rates
76
- packages.map do |package|
76
+ shipments = packages.map do |package|
77
77
  shipment = package.shipment = package.to_shipment
78
78
  shipment.shipping_rates = Spree::Config.stock.estimator_class.new.shipping_rates(package)
79
79
  shipment
80
80
  end
81
+
82
+ # Make sure we don't add the proposed shipments to the order
83
+ order.shipments = order.shipments - shipments
84
+
85
+ shipments
81
86
  end
82
87
 
83
88
  def split_packages(initial_packages)
@@ -30,7 +30,7 @@ module Spree
30
30
  attr_writer :rebuild_vat_prices
31
31
  include Spree::DefaultPrice
32
32
 
33
- belongs_to :product, -> { with_discarded }, touch: true, class_name: 'Spree::Product', inverse_of: :variants, optional: false
33
+ belongs_to :product, -> { with_discarded }, touch: true, class_name: 'Spree::Product', inverse_of: :variants_including_master, optional: false
34
34
  belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
35
35
 
36
36
  delegate :name, :description, :slug, :available_on, :discontinue_on, :discontinued?,
@@ -171,7 +171,7 @@ module Solidus
171
171
  end
172
172
 
173
173
  bundle_cleanly{ run "bundle install" } if @plugins_to_be_installed.any?
174
- run "spring stop"
174
+ run "spring stop" if defined?(Spring)
175
175
 
176
176
  @plugin_generators_to_run.each do |plugin_generator_name|
177
177
  generate "#{plugin_generator_name} --skip_migrations=false"
@@ -504,6 +504,14 @@ module Spree
504
504
  # Enumerable of images adhering to the present_image_class interface
505
505
  class_name_attribute :image_attachment_module, default: 'Spree::Image::PaperclipAttachment'
506
506
 
507
+ # @!attribute [rw] allowed_image_mime_types
508
+ #
509
+ # Defines which MIME types are allowed for images
510
+ # `%w(image/jpeg image/jpg image/png image/gif).freeze` is the default.
511
+ #
512
+ # @return [Array]
513
+ class_name_attribute :allowed_image_mime_types, default: %w(image/jpeg image/jpg image/png image/gif).freeze
514
+
507
515
  # Allows switching attachment library for Taxon
508
516
  #
509
517
  # `Spree::Taxon::PaperclipAttachment`
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spree
4
- VERSION = "2.11.7"
4
+ VERSION = "2.11.11"
5
5
 
6
6
  def self.solidus_version
7
7
  VERSION
@@ -52,7 +52,13 @@ module Spree
52
52
  :month, :year, :expiry, :first_name, :last_name, :name
53
53
  ]
54
54
 
55
- @@customer_return_attributes = [:stock_location_id, return_items_attributes: [:id, :inventory_unit_id, :return_authorization_id, :returned, :amount, :reception_status_event, :acceptance_status, :exchange_variant_id, :resellable]]
55
+ @@customer_return_attributes = [
56
+ :stock_location_id, return_items_attributes: [
57
+ :id, :inventory_unit_id, :return_authorization_id, :returned, :amount,
58
+ :reception_status_event, :acceptance_status, :exchange_variant_id,
59
+ :resellable, :return_reason_id
60
+ ]
61
+ ]
56
62
 
57
63
  @@image_attributes = [:alt, :attachment, :position, :viewable_type, :viewable_id]
58
64
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Preferences
5
+ module Persistable
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ include Spree::Preferences::Preferable
10
+ serialize :preferences, Hash
11
+ after_initialize :initialize_preference_defaults
12
+ end
13
+
14
+ private
15
+
16
+ def initialize_preference_defaults
17
+ if has_attribute?(:preferences)
18
+ self.preferences = default_preferences.merge(preferences)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -45,6 +45,7 @@ module DummyApp
45
45
  end
46
46
 
47
47
  class Application < ::Rails::Application
48
+ config.has_many_inverse = true
48
49
  config.eager_load = false
49
50
  config.cache_classes = true
50
51
  config.cache_store = :memory_store
@@ -0,0 +1 @@
1
+ This is a text file
@@ -3,34 +3,29 @@
3
3
  namespace :solidus do
4
4
  namespace :migrations do
5
5
  namespace :migrate_default_billing_addresses_to_address_book do
6
- task up: :environment do
7
- print "Migrating default billing addresses to address book ... "
6
+ task :up, [:batch_size] => [:environment] do |_t, args|
7
+ batch_size = args[:batch_size] || 100_000
8
+ print "Migrating default billing addresses to address book in batches of #{batch_size} ... "
8
9
  if Spree::UserAddress.where(default_billing: true).any?
9
- Spree.user_class.joins(:bill_address).update_all(bill_address_id: nil) # rubocop:disable Rails/SkipsModelValidations
10
+ Spree.user_class.joins(:bill_address).in_batches(of: batch_size).each do |batch|
11
+ batch.update_all(bill_address_id: nil) # rubocop:disable Rails/SkipsModelValidations
12
+ end
10
13
  end
11
- adapter_type = Spree::Base.connection.adapter_name.downcase.to_sym
12
- if adapter_type == :mysql2
13
- sql = <<~SQL
14
- UPDATE spree_user_addresses
14
+ Spree::UserAddress.joins(
15
+ <<~SQL
15
16
  JOIN spree_users ON spree_user_addresses.user_id = spree_users.id
16
- AND spree_user_addresses.address_id = spree_users.bill_address_id
17
- SET spree_user_addresses.default_billing = true
18
- SQL
19
- else
20
- sql = <<~SQL
21
- UPDATE spree_user_addresses
22
- SET default_billing = true
23
- FROM spree_users
24
- WHERE spree_user_addresses.address_id = spree_users.bill_address_id
25
- AND spree_user_addresses.user_id = spree_users.id;
17
+ AND spree_user_addresses.address_id = spree_users.bill_address_id
26
18
  SQL
19
+ ).in_batches(of: batch_size).each do |batch|
20
+ batch.update_all(default_billing: true) # rubocop:disable Rails/SkipsModelValidations
27
21
  end
28
- Spree::Base.connection.execute sql
22
+
29
23
  puts "Success"
30
24
  end
31
25
 
32
- task down: :environment do
33
- Spree::UserAddress.update_all(default_billing: false) # rubocop:disable Rails/SkipsModelValidations
26
+ task :down, [:batch_size] => [:environment] do |_t, args|
27
+ batch_size = args[:batch_size] || 100_000
28
+ Spree::UserAddress.in_batches(of: batch_size).update_all(default_billing: false) # rubocop:disable Rails/SkipsModelValidations
34
29
  puts "Rolled back default billing address migration to address book"
35
30
  end
36
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.11.7
4
+ version: 2.11.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-18 00:00:00.000000000 Z
11
+ date: 2021-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -829,6 +829,7 @@ files:
829
829
  - lib/spree/permission_sets/user_management.rb
830
830
  - lib/spree/permitted_attributes.rb
831
831
  - lib/spree/preferences/configuration.rb
832
+ - lib/spree/preferences/persistable.rb
832
833
  - lib/spree/preferences/preferable.rb
833
834
  - lib/spree/preferences/preferable_class_methods.rb
834
835
  - lib/spree/preferences/scoped_store.rb
@@ -918,6 +919,7 @@ files:
918
919
  - lib/spree/testing_support/factories/zone_factory.rb
919
920
  - lib/spree/testing_support/factory_bot.rb
920
921
  - lib/spree/testing_support/fixtures/blank.jpg
922
+ - lib/spree/testing_support/fixtures/file.txt
921
923
  - lib/spree/testing_support/flash.rb
922
924
  - lib/spree/testing_support/job_helpers.rb
923
925
  - lib/spree/testing_support/order_walkthrough.rb
@@ -983,7 +985,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
983
985
  - !ruby/object:Gem::Version
984
986
  version: 1.8.23
985
987
  requirements: []
986
- rubygems_version: 3.1.4
988
+ rubygems_version: 3.2.20
987
989
  signing_key:
988
990
  specification_version: 4
989
991
  summary: Essential models, mailers, and classes for the Solidus e-commerce project.