spree_core 4.4.1 → 4.5.0

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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/products/find.rb +1 -3
  3. data/app/finders/spree/taxons/find.rb +1 -1
  4. data/app/helpers/spree/base_helper.rb +12 -9
  5. data/app/helpers/spree/locale_helper.rb +6 -2
  6. data/app/helpers/spree/products_helper.rb +9 -4
  7. data/app/jobs/spree/variants/remove_from_incomplete_orders_job.rb +9 -0
  8. data/app/jobs/spree/variants/remove_line_item_job.rb +9 -0
  9. data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
  10. data/app/models/concerns/spree/display_link.rb +17 -29
  11. data/app/models/concerns/spree/image_methods.rb +21 -9
  12. data/app/models/concerns/spree/metadata.rb +2 -2
  13. data/app/models/concerns/spree/product_scopes.rb +10 -8
  14. data/app/models/spree/address.rb +7 -1
  15. data/app/models/spree/asset/support/active_storage.rb +3 -2
  16. data/app/models/spree/asset.rb +3 -0
  17. data/app/models/spree/cms_page.rb +4 -0
  18. data/app/models/spree/cms_section.rb +12 -12
  19. data/app/models/spree/cms_section_image.rb +15 -0
  20. data/app/models/spree/cms_section_image_one.rb +4 -0
  21. data/app/models/spree/cms_section_image_three.rb +4 -0
  22. data/app/models/spree/cms_section_image_two.rb +4 -0
  23. data/app/models/spree/credit_card.rb +10 -4
  24. data/app/models/spree/customer_return.rb +3 -0
  25. data/app/models/spree/digital.rb +4 -0
  26. data/app/models/spree/digital_link.rb +7 -0
  27. data/app/models/spree/gateway/bogus.rb +1 -1
  28. data/app/models/spree/icon.rb +5 -1
  29. data/app/models/spree/image/configuration/active_storage.rb +5 -1
  30. data/app/models/spree/image.rb +3 -3
  31. data/app/models/spree/inventory_unit.rb +5 -2
  32. data/app/models/spree/legacy_user.rb +1 -2
  33. data/app/models/spree/line_item.rb +4 -1
  34. data/app/models/spree/linkable/homepage.rb +3 -0
  35. data/app/models/spree/linkable/uri.rb +3 -0
  36. data/app/models/spree/log_entry.rb +4 -0
  37. data/app/models/spree/menu.rb +3 -0
  38. data/app/models/spree/menu_item.rb +7 -11
  39. data/app/models/spree/option_type.rb +4 -0
  40. data/app/models/spree/option_value.rb +5 -0
  41. data/app/models/spree/order/address_book.rb +1 -0
  42. data/app/models/spree/order/store_credit.rb +0 -8
  43. data/app/models/spree/order.rb +11 -2
  44. data/app/models/spree/order_merger.rb +1 -1
  45. data/app/models/spree/payment/processing.rb +1 -1
  46. data/app/models/spree/payment.rb +7 -1
  47. data/app/models/spree/payment_capture_event.rb +4 -0
  48. data/app/models/spree/payment_method/store_credit.rb +1 -1
  49. data/app/models/spree/payment_method.rb +3 -0
  50. data/app/models/spree/payment_source.rb +10 -0
  51. data/app/models/spree/preference.rb +4 -0
  52. data/app/models/spree/price.rb +3 -0
  53. data/app/models/spree/product.rb +56 -14
  54. data/app/models/spree/product_property.rb +1 -0
  55. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  56. data/app/models/spree/promotion.rb +6 -0
  57. data/app/models/spree/promotion_rule.rb +1 -1
  58. data/app/models/spree/promotion_rule_user.rb +1 -1
  59. data/app/models/spree/property.rb +3 -0
  60. data/app/models/spree/prototype.rb +3 -0
  61. data/app/models/spree/refund.rb +8 -0
  62. data/app/models/spree/reimbursement.rb +3 -0
  63. data/app/models/spree/return_authorization.rb +3 -0
  64. data/app/models/spree/return_item.rb +4 -0
  65. data/app/models/spree/role.rb +1 -1
  66. data/app/models/spree/role_user.rb +1 -1
  67. data/app/models/spree/shipment.rb +7 -0
  68. data/app/models/spree/shipping_category.rb +3 -0
  69. data/app/models/spree/shipping_method.rb +6 -0
  70. data/app/models/spree/state_change.rb +1 -1
  71. data/app/models/spree/stock/availability_validator.rb +9 -3
  72. data/app/models/spree/stock/content_item.rb +1 -1
  73. data/app/models/spree/stock/quantifier.rb +1 -1
  74. data/app/models/spree/stock_item.rb +5 -0
  75. data/app/models/spree/stock_location.rb +19 -5
  76. data/app/models/spree/stock_movement.rb +4 -0
  77. data/app/models/spree/stock_transfer.rb +3 -0
  78. data/app/models/spree/store.rb +19 -14
  79. data/app/models/spree/store_credit.rb +4 -1
  80. data/app/models/spree/store_favicon_image.rb +17 -0
  81. data/app/models/spree/store_logo.rb +9 -0
  82. data/app/models/spree/store_mailer_logo.rb +13 -0
  83. data/app/models/spree/tax_category.rb +6 -0
  84. data/app/models/spree/tax_rate.rb +6 -1
  85. data/app/models/spree/taxon.rb +4 -1
  86. data/app/models/spree/taxon_image/configuration/active_storage.rb +5 -1
  87. data/app/models/spree/taxon_image.rb +3 -2
  88. data/app/models/spree/taxonomy.rb +4 -1
  89. data/app/models/spree/variant.rb +43 -14
  90. data/app/models/spree/wished_item.rb +4 -0
  91. data/app/models/spree/wishlist.rb +4 -1
  92. data/app/models/spree/zone.rb +3 -0
  93. data/app/services/spree/addresses/create.rb +1 -1
  94. data/app/services/spree/addresses/update.rb +7 -2
  95. data/app/services/spree/cart/remove_line_item.rb +1 -0
  96. data/app/services/spree/variants/remove_line_items.rb +15 -0
  97. data/config/locales/en.yml +5 -2
  98. data/config/routes.rb +43 -0
  99. data/db/migrate/20211201202851_update_linkable_resource_types.rb +10 -0
  100. data/db/migrate/20211203082008_add_settings_to_payment_methods.rb +11 -0
  101. data/db/migrate/20211229162122_disable_propagate_all_variants_by_default.rb +5 -0
  102. data/db/migrate/20220103082046_add_status_and_make_active_at_to_spree_products.rb +7 -0
  103. data/db/migrate/20220106230929_add_internal_note_to_spree_orders.rb +5 -0
  104. data/db/migrate/20220113052823_create_payment_sources.rb +22 -0
  105. data/db/migrate/20220117100333_add_make_active_at_to_spree_products.rb +17 -0
  106. data/db/migrate/20220120092821_add_metadata_to_spree_tax_rates.rb +13 -0
  107. data/db/migrate/20220201103922_add_first_name_and_last_name_to_spree_users.rb +9 -0
  108. data/db/migrate/20220222083546_add_barcode_to_spree_variants.rb +6 -0
  109. data/db/migrate/20220329113557_fix_cms_pages_unique_indexes.rb +8 -0
  110. data/db/migrate/20220613133029_add_metadata_to_spree_stock_items.rb +13 -0
  111. data/lib/friendly_id/paranoia.rb +4 -0
  112. data/lib/generators/spree/dummy/dummy_generator.rb +13 -2
  113. data/lib/generators/spree/dummy/templates/package.json +12 -0
  114. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  115. data/lib/spree/core/configuration.rb +90 -0
  116. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  117. data/lib/spree/core/controller_helpers/currency.rb +7 -5
  118. data/lib/spree/core/controller_helpers/locale.rb +8 -6
  119. data/lib/spree/core/controller_helpers/order.rb +4 -2
  120. data/lib/spree/core/controller_helpers/search.rb +1 -1
  121. data/lib/spree/core/controller_helpers/store.rb +5 -3
  122. data/lib/spree/core/dependencies.rb +130 -0
  123. data/lib/spree/core/engine.rb +47 -37
  124. data/{app/models/spree → lib/spree/core}/preferences/configuration.rb +3 -0
  125. data/{app/models/spree → lib/spree/core}/preferences/preferable.rb +3 -0
  126. data/lib/spree/core/search/base.rb +9 -5
  127. data/lib/spree/core/version.rb +1 -1
  128. data/lib/spree/core.rb +25 -5
  129. data/lib/spree/permitted_attributes.rb +9 -7
  130. data/lib/spree/testing_support/common_rake.rb +1 -0
  131. data/lib/spree/testing_support/factories/favicon_image_factory.rb +9 -0
  132. data/lib/spree/testing_support/factories/icon_factory.rb +3 -1
  133. data/lib/spree/testing_support/factories/image_factory.rb +3 -1
  134. data/lib/spree/testing_support/factories/menu_item_factory.rb +1 -1
  135. data/lib/spree/testing_support/factories/order_factory.rb +2 -1
  136. data/lib/spree/testing_support/factories/product_factory.rb +6 -1
  137. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -0
  138. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  139. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  140. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  141. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  142. data/lib/spree/testing_support/factories/stock_location_factory.rb +3 -2
  143. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  144. data/lib/spree/testing_support/factories/taxon_image_factory.rb +3 -1
  145. data/lib/spree/testing_support/factories/user_factory.rb +4 -0
  146. data/lib/spree/testing_support/factories/variant_factory.rb +4 -0
  147. data/lib/spree_core.rb +2 -1
  148. data/lib/tasks/core.rake +12 -0
  149. data/spree_core.gemspec +2 -3
  150. metadata +64 -53
  151. data/app/models/friendly_id/slug_decorator.rb +0 -9
  152. data/app/models/spree/app_configuration.rb +0 -86
  153. data/app/models/spree/order_contents.rb +0 -31
  154. data/lib/friendly_id/slug_rails5_patch.rb +0 -11
  155. data/lib/spree/core/app_dependencies.rb +0 -126
  156. /data/{app/models/spree → lib/spree/core}/preferences/preferable_class_methods.rb +0 -0
  157. /data/{app/models/spree → lib/spree/core}/preferences/scoped_store.rb +0 -0
  158. /data/{app/models/spree → lib/spree/core}/preferences/store.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6f1530fed2a687bd1eb187fbc25fc58fcd257d498f9e9f641291f99991f0e46
4
- data.tar.gz: fd670b73289d5515e3e27dd5f80451f3c866865ea278cfb8e8d9b43d3c650a46
3
+ metadata.gz: f53d1d3ed70fd19d1ae3665df1dfabac01948cd28e71b3a68c86c8a8f7afcf1a
4
+ data.tar.gz: 87e8a6e4d121d979fadbe0d44d89d30f0f6d55c89b64d3bcd0c2354c794b9ef1
5
5
  SHA512:
6
- metadata.gz: d83b92fbf213054613dd642a968a6958c6a54dcdd4177c54385b3a82bf567de92cc5d0c21a18deda0768dfeafb2b955fcf508c1392ded7071e7c499c29afcb73
7
- data.tar.gz: c4e3da90f798233259263b922a5ac32999d4e34c46a64b0731e316c5eada252b18bce0c53cc4651e977b3984aa343ef80570cdbf96378600f362d23d3bc2b320
6
+ metadata.gz: 51b6d8e283837db0d607f9528f1527d8cfc46c020a804bc3f2797c392eb040d6b7081df92d52eafac617c2fff64c6e98b500912173266f4c04286f32ab5fbdac
7
+ data.tar.gz: d2305b19b0364a34e379955ce76fb453702c385f7377a23f40a65ae61f93de5a5d157bd4978c757b563c6c263f5375a32f224840129b29085af424cc00f6712d
@@ -4,8 +4,6 @@ module Spree
4
4
  def initialize(scope:, params:, current_currency: nil)
5
5
  @scope = scope
6
6
 
7
- ActiveSupport::Deprecation.warn('`current_currency` param is deprecated and will be removed in Spree 5') if current_currency
8
-
9
7
  if current_currency.present?
10
8
  ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
11
9
  `current_currency` param is deprecated and will be removed in Spree 5.
@@ -257,7 +255,7 @@ module Spree
257
255
 
258
256
  def map_prices(prices)
259
257
  prices.map do |price|
260
- price == 'Infinity' ? Float::INFINITY : price.to_f
258
+ price == 'Infinity' ? BigDecimal::INFINITY : price.to_f
261
259
  end
262
260
  end
263
261
 
@@ -19,7 +19,7 @@ module Spree
19
19
  taxons = by_roots(taxons)
20
20
  taxons = by_name(taxons)
21
21
 
22
- taxons
22
+ taxons.distinct
23
23
  end
24
24
 
25
25
  private
@@ -61,11 +61,11 @@ module Spree
61
61
  DEPRECATION
62
62
 
63
63
  image_path ||= if current_store.logo.attached? && current_store.logo.variable?
64
- main_app.url_for(current_store.logo.variant(resize: '244x104>'))
64
+ main_app.cdn_image_url(current_store.logo.variant(resize_to_limit: [244, 104]))
65
65
  elsif current_store.logo.attached? && current_store.logo.image?
66
- main_app.url_for(current_store.logo)
66
+ main_app.cdn_image_url(current_store.logo)
67
67
  else
68
- 'logo/spree_50.png'
68
+ 'logo/spree_50.png'
69
69
  end
70
70
 
71
71
  path = spree.respond_to?(:root_path) ? spree.root_path : main_app.root_path
@@ -76,7 +76,11 @@ module Spree
76
76
  end
77
77
 
78
78
  def spree_favicon_path
79
- main_app.url_for(current_store.favicon || 'favicon.ico')
79
+ if current_store.favicon.present?
80
+ main_app.cdn_image_url(current_store.favicon)
81
+ else
82
+ url_for('favicon.ico')
83
+ end
80
84
  end
81
85
 
82
86
  def object
@@ -88,7 +92,7 @@ module Spree
88
92
 
89
93
  if object.is_a? Spree::Product
90
94
  image = default_image_for_product_or_variant(object)
91
- og_meta['og:image'] = main_app.url_for(image.attachment) if image&.attachment
95
+ og_meta['og:image'] = main_app.cdn_image_url(image.attachment) if image&.attachment
92
96
 
93
97
  og_meta['og:url'] = spree.url_for(object) if frontend_available? # url_for product needed
94
98
  og_meta['og:type'] = object.class.name.demodulize.downcase
@@ -163,8 +167,7 @@ module Spree
163
167
  end
164
168
 
165
169
  def seo_url(taxon, options = {})
166
- options.merge(locale: locale_param)
167
- spree.nested_taxons_path(taxon.permalink, options)
170
+ spree.nested_taxons_path(taxon.permalink, options.merge(locale: locale_param))
168
171
  end
169
172
 
170
173
  def frontend_available?
@@ -238,7 +241,7 @@ module Spree
238
241
 
239
242
  def create_product_image_tag(image, product, options, style)
240
243
  options[:alt] = image.alt.blank? ? product.name : image.alt
241
- image_tag main_app.url_for(image.url(style)), options
244
+ image_tag main_app.cdn_image_url(image.url(style)), options
242
245
  end
243
246
 
244
247
  def define_image_method(style)
@@ -249,7 +252,7 @@ module Spree
249
252
  img = if image_path.present?
250
253
  create_product_image_tag image_path, product, options, style
251
254
  else
252
- inline_svg_tag "noimage/backend-missing-image.svg", class: "noimage", size: "60%*60%"
255
+ inline_svg_tag 'noimage/backend-missing-image.svg', class: 'noimage', size: '60%*60%'
253
256
  end
254
257
 
255
258
  content_tag(:div, img, class: "admin-product-image-container #{style}-img")
@@ -15,10 +15,14 @@ module Spree
15
15
  end
16
16
 
17
17
  def locale_presentation(locale)
18
- if I18n.exists?('spree.i18n.this_file_language', locale: locale)
18
+ if I18n.exists?('spree.i18n.this_file_language', locale: locale, fallback: false)
19
19
  [locale_full_name(locale), locale.to_s]
20
+ elsif defined?(SpreeI18n::Locale) && (language_name = SpreeI18n::Locale.local_language_name(locale))
21
+ ["#{language_name} (#{locale})", locale.to_s]
22
+ elsif locale.to_s == 'en'
23
+ ['English (US)', 'en']
20
24
  else
21
- locale.to_s == 'en' ? ['English (US)', 'en'] : [locale, locale.to_s]
25
+ [locale, locale.to_s]
22
26
  end
23
27
  end
24
28
 
@@ -76,15 +76,20 @@ module Spree
76
76
 
77
77
  # will return a human readable string
78
78
  def available_status(product)
79
- return Spree.t(:discontinued) if product.discontinued?
79
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
80
+ `Spree::ProductsHelper#available_status` method from spree/core is deprecated and will be removed.
81
+ Please use `Spree::Admin::ProductsHelper#available_status` from spree_backend instead.
82
+ DEPRECATION
83
+
84
+ return Spree.t(:archived) if product.discontinued?
80
85
  return Spree.t(:deleted) if product.deleted?
81
86
 
82
87
  if product.available?
83
- Spree.t(:available)
84
- elsif product.available_on&.future?
88
+ Spree.t(:active)
89
+ elsif product.make_active_at&.future?
85
90
  Spree.t(:pending_sale)
86
91
  else
87
- Spree.t(:no_available_date_set)
92
+ Spree.t(:draft)
88
93
  end
89
94
  end
90
95
 
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Variants
3
+ class RemoveFromIncompleteOrdersJob < Spree::BaseJob
4
+ def perform(variant)
5
+ Spree::Variants::RemoveLineItems.call(variant: variant)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Variants
3
+ class RemoveLineItemJob < Spree::BaseJob
4
+ def perform(line_item:)
5
+ Spree::Dependencies.cart_remove_line_item_service.constantize.call(order: line_item.order, line_item: line_item)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -18,7 +18,7 @@ module Spree
18
18
 
19
19
  def calculator_type=(calculator_type)
20
20
  klass = calculator_type.constantize if calculator_type
21
- self.calculator = klass.new if klass && !calculator.is_a?(klass)
21
+ self.calculator = klass.new if klass && !calculator.instance_of?(klass)
22
22
  end
23
23
 
24
24
  private
@@ -1,42 +1,30 @@
1
1
  module Spree
2
2
  module DisplayLink
3
- def link
4
- case linked_resource_type
5
- when 'Spree::Taxon'
6
- return if linked_resource&.permalink.blank?
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ belongs_to :linked_resource, polymorphic: true
7
+
8
+ def link
9
+ case linked_resource_type
10
+ when 'Spree::Taxon'
11
+ return if linked_resource&.permalink.blank?
7
12
 
8
- if spree_routes.method_defined?(:nested_taxons_path)
9
- spree_routes.nested_taxons_path(linked_resource.permalink)
10
- else
11
13
  "/#{Spree::Config[:storefront_taxons_path]}/#{linked_resource.permalink}"
12
- end
13
- when 'Spree::Product'
14
- return if linked_resource&.slug.blank?
14
+ when 'Spree::Product'
15
+ return if linked_resource&.slug.blank?
15
16
 
16
- if spree_routes.method_defined?(:products_path)
17
- spree_routes.product_path(linked_resource)
18
- else
19
17
  "/#{Spree::Config[:storefront_products_path]}/#{linked_resource.slug}"
20
- end
21
- when 'Spree::CmsPage'
22
- return if linked_resource&.slug.blank?
18
+ when 'Spree::CmsPage'
19
+ return if linked_resource&.slug.blank?
23
20
 
24
- if spree_routes.method_defined?(:page_path)
25
- spree_routes.page_path(linked_resource.slug)
26
- else
27
21
  "/#{Spree::Config[:storefront_pages_path]}/#{linked_resource.slug}"
22
+ when 'Spree::Linkable::Homepage'
23
+ '/'
24
+ when 'Spree::Linkable::Uri'
25
+ destination
28
26
  end
29
- when 'Home Page'
30
- '/'
31
- when 'URL'
32
- destination
33
27
  end
34
28
  end
35
-
36
- private
37
-
38
- def spree_routes
39
- Spree::Core::Engine.routes.url_helpers
40
- end
41
29
  end
42
30
  end
@@ -2,23 +2,35 @@ module Spree
2
2
  module ImageMethods
3
3
  extend ActiveSupport::Concern
4
4
 
5
- def generate_url(size:, gravity: 'center', quality: 80, background: 'show')
5
+ def generate_url(size:, gravity: 'centre', quality: 80, background: [0, 0, 0])
6
6
  return if size.blank?
7
+
7
8
  size = size.gsub(/\s+/, '')
8
9
 
9
10
  return unless size.match(/(\d+)x(\d+)/)
10
11
 
11
- polymorphic_path(attachment.variant(
12
- gravity: gravity,
13
- resize: size,
14
- extent: size,
15
- background: background,
16
- quality: quality.to_i
17
- ), only_path: true)
12
+ width, height = size.split('x').map(&:to_i)
13
+ gravity = translate_gravity_for_mini_magick(gravity)
14
+
15
+ # FIXME: bring back support for background color
16
+
17
+ cdn_image_url(attachment.variant(resize_and_pad: [width, height, { gravity: gravity }], saver: { quality: quality }))
18
18
  end
19
19
 
20
20
  def original_url
21
- polymorphic_path(attachment, only_path: true)
21
+ cdn_image_url(attachment)
22
+ end
23
+
24
+ private
25
+
26
+ def translate_gravity_for_mini_magick(gravity)
27
+ variant_processor = Rails.application.config.active_storage.variant_processor
28
+
29
+ if gravity.downcase == 'centre' && [:mini_magick, nil].include?(variant_processor)
30
+ 'center'
31
+ else
32
+ gravity
33
+ end
22
34
  end
23
35
  end
24
36
  end
@@ -3,8 +3,8 @@ module Spree
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- attribute :public_metadata, default: {} if Rails.version.to_f >= 6.1
7
- attribute :private_metadata, default: {} if Rails.version.to_f >= 6.1
6
+ attribute :public_metadata, default: {}
7
+ attribute :private_metadata, default: {}
8
8
  serialize :public_metadata, HashSerializer
9
9
  serialize :private_metadata, HashSerializer
10
10
  end
@@ -236,7 +236,7 @@ module Spree
236
236
 
237
237
  def self.not_discontinued(only_not_discontinued = true)
238
238
  if only_not_discontinued != '0' && only_not_discontinued
239
- where("#{Product.quoted_table_name}.discontinue_on IS NULL or #{Product.quoted_table_name}.discontinue_on >= ?", Time.zone.now)
239
+ where.not(status: 'archived')
240
240
  else
241
241
  all
242
242
  end
@@ -253,9 +253,11 @@ module Spree
253
253
 
254
254
  # Can't use add_search_scope for this as it needs a default argument
255
255
  def self.available(available_on = nil, currency = nil)
256
- available_on ||= Time.current
257
-
258
- scope = not_discontinued.where("#{Product.quoted_table_name}.available_on <= ?", available_on)
256
+ if available_on
257
+ scope = not_discontinued.where("#{Product.quoted_table_name}.available_on <= ?", available_on)
258
+ else
259
+ scope = where(status: 'active')
260
+ end
259
261
 
260
262
  unless Spree::Config.show_products_without_price
261
263
  currency ||= Spree::Store.default.default_currency
@@ -282,7 +284,7 @@ module Spree
282
284
  if user.try(:has_spree_role?, 'admin')
283
285
  with_deleted
284
286
  else
285
- not_deleted.not_discontinued.where("#{Product.quoted_table_name}.available_on <= ?", Time.current)
287
+ not_deleted.where(status: 'active')
286
288
  end
287
289
  end
288
290
 
@@ -295,9 +297,9 @@ module Spree
295
297
  include PgSearch::Model
296
298
 
297
299
  if defined?(SpreeGlobalize)
298
- pg_search_scope :search_by_name, associated_against: { translations: :name }, using: :tsearch
300
+ pg_search_scope :search_by_name, associated_against: { translations: :name }, using: { tsearch: { any_word: true, prefix: true } }
299
301
  else
300
- pg_search_scope :search_by_name, against: :name, using: :tsearch
302
+ pg_search_scope :search_by_name, against: :name, using: { tsearch: { any_word: true, prefix: true } }
301
303
  end
302
304
  else
303
305
  def self.search_by_name(query)
@@ -337,7 +339,7 @@ module Spree
337
339
  case t
338
340
  when ApplicationRecord then t
339
341
  else
340
- Taxon.where(name: t).or(Taxon.where(id: t)).or(Taxon.where("permalink LIKE ? OR permalink = ?", "%/#{t}/", "#{t}/")).first
342
+ Taxon.where(Taxon.arel_table[:name].eq(t)).or(Taxon.where(Taxon.arel_table[:id].eq(t))).or(Taxon.where(Taxon.arel_table[:permalink].matches("%/#{t}/"))).or(Taxon.where(Taxon.arel_table[:permalink].matches("#{t}/"))).first
341
343
  end
342
344
  end.compact.flatten.uniq
343
345
  end
@@ -3,6 +3,12 @@ module Spree
3
3
  require 'validates_zipcode'
4
4
 
5
5
  include Metadata
6
+ if defined?(Spree::Webhooks)
7
+ include Spree::Webhooks::HasWebhooks
8
+ end
9
+ if defined?(Spree::Security::Addresses)
10
+ include Spree::Security::Addresses
11
+ end
6
12
 
7
13
  if Rails::VERSION::STRING >= '6.1'
8
14
  serialize :preferences, Hash, default: {}
@@ -31,7 +37,7 @@ module Spree
31
37
 
32
38
  belongs_to :country, class_name: 'Spree::Country'
33
39
  belongs_to :state, class_name: 'Spree::State', optional: true
34
- belongs_to :user, class_name: Spree.user_class.name, optional: true
40
+ belongs_to :user, class_name: "::#{Spree.user_class}", optional: true
35
41
 
36
42
  has_many :shipments, inverse_of: :address
37
43
 
@@ -8,7 +8,7 @@ module Spree
8
8
  def url(style)
9
9
  return placeholder(style) unless attachment.attached?
10
10
 
11
- attachment.variant(resize: dimensions_for_style(style))
11
+ attachment.variant(resize_to_limit: dimensions_for_style(style))
12
12
  end
13
13
 
14
14
  def placeholder(style)
@@ -16,7 +16,8 @@ module Spree
16
16
  end
17
17
 
18
18
  def dimensions_for_style(style)
19
- self.class.styles.with_indifferent_access[style] || self.class.styles.with_indifferent_access[default_style]
19
+ dimensions = self.class.styles.with_indifferent_access[style] || self.class.styles.with_indifferent_access[default_style]
20
+ dimensions.split('x').map(&:to_i)
20
21
  end
21
22
  end
22
23
  end
@@ -2,6 +2,9 @@ module Spree
2
2
  class Asset < Spree::Base
3
3
  include Support::ActiveStorage
4
4
  include Metadata
5
+ if defined?(Spree::Webhooks)
6
+ include Spree::Webhooks::HasWebhooks
7
+ end
5
8
 
6
9
  belongs_to :viewable, polymorphic: true, touch: true
7
10
  acts_as_list scope: [:viewable_id, :viewable_type]
@@ -3,6 +3,10 @@ module Spree
3
3
  include SingleStoreResource
4
4
  include DisplayLink
5
5
 
6
+ if defined?(Spree::Webhooks)
7
+ include Spree::Webhooks::HasWebhooks
8
+ end
9
+
6
10
  acts_as_paranoid
7
11
 
8
12
  TYPES = ['Spree::Cms::Pages::StandardPage',
@@ -7,30 +7,30 @@ module Spree
7
7
 
8
8
  validate :reset_link_attributes
9
9
 
10
- IMAGE_COUNT = ['one', 'two', 'three']
11
- IMAGE_TYPES = ['image/png', 'image/jpg', 'image/jpeg', 'image/gif'].freeze
12
- IMAGE_SIZE = ['sm', 'md', 'lg', 'xl']
10
+ has_one :image_one, class_name: 'Spree::CmsSectionImageOne', dependent: :destroy, as: :viewable
11
+ accepts_nested_attributes_for :image_one, reject_if: :all_blank
13
12
 
14
- IMAGE_COUNT.each do |count|
15
- send(:has_one_attached, "image_#{count}".to_sym)
13
+ has_one :image_two, class_name: 'Spree::CmsSectionImageTwo', dependent: :destroy, as: :viewable
14
+ accepts_nested_attributes_for :image_two, reject_if: :all_blank
16
15
 
17
- IMAGE_SIZE.each do |size|
16
+ has_one :image_three, class_name: 'Spree::CmsSectionImageThree', dependent: :destroy, as: :viewable
17
+ accepts_nested_attributes_for :image_three, reject_if: :all_blank
18
+
19
+ Spree::CmsSectionImage::IMAGE_COUNT.each do |count|
20
+ Spree::CmsSectionImage::IMAGE_SIZE.each do |size|
18
21
  define_method("img_#{count}_#{size}") do |dimensions = nil|
19
- return if !send("image_#{count}").attached? || dimensions.nil?
22
+ image = send("image_#{count}")&.attachment
23
+ return if !image&.attached? || dimensions.nil?
20
24
 
21
- send("image_#{count}").variant(resize: dimensions)
25
+ image.variant(resize_to_limit: dimensions.split('x').map(&:to_i))
22
26
  end
23
27
  end
24
28
  end
25
29
 
26
- belongs_to :linked_resource, polymorphic: true
27
-
28
30
  default_scope { order(position: :asc) }
29
31
 
30
32
  validates :name, :cms_page, :type, presence: true
31
33
 
32
- validates :image_one, :image_two, :image_three, content_type: IMAGE_TYPES
33
-
34
34
  LINKED_RESOURCE_TYPE = []
35
35
 
36
36
  TYPES = ['Spree::Cms::Sections::HeroImage',
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ class CmsSectionImage < Asset
3
+ if Spree.public_storage_service_name
4
+ has_one_attached :attachment, service: Spree.public_storage_service_name
5
+ else
6
+ has_one_attached :attachment
7
+ end
8
+
9
+ IMAGE_COUNT = ['one', 'two', 'three']
10
+ IMAGE_TYPES = ['image/png', 'image/jpg', 'image/jpeg', 'image/gif'].freeze
11
+ IMAGE_SIZE = ['sm', 'md', 'lg', 'xl']
12
+
13
+ validates :attachment, attached: true, content_type: IMAGE_TYPES
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module Spree
2
+ class CmsSectionImageOne < CmsSectionImage
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Spree
2
+ class CmsSectionImageThree < CmsSectionImage
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Spree
2
+ class CmsSectionImageTwo < CmsSectionImage
3
+ end
4
+ end
@@ -2,11 +2,17 @@ module Spree
2
2
  class CreditCard < Spree::Base
3
3
  include ActiveMerchant::Billing::CreditCardMethods
4
4
  include Metadata
5
+ if defined?(Spree::Webhooks)
6
+ include Spree::Webhooks::HasWebhooks
7
+ end
8
+ if defined?(Spree::Security::CreditCards)
9
+ include Spree::Security::CreditCards
10
+ end
5
11
 
6
12
  acts_as_paranoid
7
13
 
8
14
  belongs_to :payment_method
9
- belongs_to :user, class_name: Spree.user_class.to_s, foreign_key: 'user_id',
15
+ belongs_to :user, class_name: "::#{Spree.user_class}", foreign_key: 'user_id',
10
16
  optional: true
11
17
  has_many :payments, as: :source
12
18
 
@@ -174,9 +180,9 @@ module Spree
174
180
 
175
181
  def self.json_api_permitted_attributes
176
182
  [
177
- 'number', 'month', 'year', 'expiry', 'verification_value', 'first_name', 'last_name',
178
- 'cc_type', 'gateway_customer_profile_id', 'gateway_payment_profile_id', 'last_digits',
179
- 'name', 'encrypted_data', 'address_id', 'created_at', 'updated_at', 'user_id',
183
+ 'number', 'month', 'year', 'expiry', 'verification_value', 'first_name', 'last_name',
184
+ 'cc_type', 'gateway_customer_profile_id', 'gateway_payment_profile_id', 'last_digits',
185
+ 'name', 'encrypted_data', 'address_id', 'created_at', 'updated_at', 'user_id',
180
186
  'payment_method_id', 'default', 'deleted_at'
181
187
  ]
182
188
  end
@@ -3,6 +3,9 @@ module Spree
3
3
  include Spree::Core::NumberGenerator.new(prefix: 'CR', length: 9)
4
4
  include NumberIdentifier
5
5
  include Metadata
6
+ if defined?(Spree::Webhooks)
7
+ include Spree::Webhooks::HasWebhooks
8
+ end
6
9
 
7
10
  belongs_to :stock_location
8
11
  belongs_to :store, class_name: 'Spree::Store', inverse_of: :customer_returns
@@ -3,6 +3,10 @@ module Spree
3
3
  belongs_to :variant
4
4
  has_many :digital_links, dependent: :destroy
5
5
 
6
+ if defined?(Spree::Webhooks)
7
+ include Spree::Webhooks::HasWebhooks
8
+ end
9
+
6
10
  if Spree.private_storage_service_name
7
11
  has_one_attached :attachment, service: Spree.private_storage_service_name
8
12
  else
@@ -2,6 +2,13 @@ module Spree
2
2
  class DigitalLink < Spree::Base
3
3
  has_secure_token
4
4
 
5
+ if defined?(Spree::Webhooks)
6
+ include Spree::Webhooks::HasWebhooks
7
+ end
8
+ if defined?(Spree::Security::DigitalLinks)
9
+ include Spree::Security::DigitalLinks
10
+ end
11
+
5
12
  belongs_to :digital
6
13
  belongs_to :line_item
7
14
 
@@ -58,7 +58,7 @@ module Spree
58
58
  ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
59
59
  end
60
60
 
61
- def cancel(_response_code)
61
+ def cancel(_response_code, _payment = nil)
62
62
  ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
63
63
  end
64
64
 
@@ -1,6 +1,10 @@
1
1
  module Spree
2
2
  class Icon < Spree::Asset
3
- has_one_attached :attachment
3
+ if Spree.public_storage_service_name
4
+ has_one_attached :attachment, service: Spree.public_storage_service_name
5
+ else
6
+ has_one_attached :attachment
7
+ end
4
8
 
5
9
  ICON_TYPES = %i[png jpg jpeg gif svg]
6
10
 
@@ -5,7 +5,11 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- has_one_attached :attachment
8
+ if Spree.public_storage_service_name
9
+ has_one_attached :attachment, service: Spree.public_storage_service_name
10
+ else
11
+ has_one_attached :attachment
12
+ end
9
13
 
10
14
  validates :attachment, attached: true, content_type: /\Aimage\/.*\z/
11
15
 
@@ -13,7 +13,7 @@ module Spree
13
13
 
14
14
  def styles
15
15
  self.class.styles.map do |_, size|
16
- width, height = size.chop.split('x')
16
+ width, height = size.chop.split('x').map(&:to_i)
17
17
 
18
18
  {
19
19
  url: generate_url(size: size),
@@ -28,7 +28,7 @@ module Spree
28
28
  size = self.class.styles[name]
29
29
  return unless size
30
30
 
31
- width, height = size.chop.split('x')
31
+ width, height = size.chop.split('x').map(&:to_i)
32
32
 
33
33
  {
34
34
  url: generate_url(size: size),
@@ -40,7 +40,7 @@ module Spree
40
40
 
41
41
  def style_dimensions(name)
42
42
  size = self.class.styles[name]
43
- width, height = size.chop.split('x')
43
+ width, height = size.chop.split('x').map(&:to_i)
44
44
 
45
45
  {
46
46
  width: width,
@@ -1,5 +1,9 @@
1
1
  module Spree
2
2
  class InventoryUnit < Spree::Base
3
+ if defined?(Spree::Webhooks)
4
+ include Spree::Webhooks::HasWebhooks
5
+ end
6
+
3
7
  with_options inverse_of: :inventory_units do
4
8
  belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
5
9
  belongs_to :order, class_name: 'Spree::Order'
@@ -59,8 +63,7 @@ module Spree
59
63
  end
60
64
 
61
65
  def find_stock_item
62
- Spree::StockItem.where(stock_location_id: shipment.stock_location_id,
63
- variant_id: variant_id).first
66
+ shipment.stock_location.stock_item_or_create(variant)
64
67
  end
65
68
 
66
69
  def self.split(original_inventory_unit, extract_quantity)