spree_core 4.2.5 → 4.3.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 (263) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/concerns/spree/product_filterable.rb +9 -0
  3. data/app/finders/spree/cms_pages/find.rb +41 -0
  4. data/app/finders/spree/menus/find.rb +11 -0
  5. data/app/finders/spree/option_values/find_available.rb +20 -0
  6. data/app/finders/spree/orders/find_complete.rb +14 -2
  7. data/app/finders/spree/orders/find_current.rb +1 -13
  8. data/app/finders/spree/product_properties/find_available.rb +20 -0
  9. data/app/finders/spree/products/find.rb +80 -21
  10. data/app/finders/spree/stores/find_current.rb +24 -0
  11. data/app/finders/spree/taxons/find.rb +22 -6
  12. data/app/helpers/spree/base_helper.rb +69 -7
  13. data/app/helpers/spree/locale_helper.rb +5 -1
  14. data/app/helpers/spree/products_helper.rb +7 -3
  15. data/app/models/concerns/spree/display_link.rb +42 -0
  16. data/app/models/concerns/spree/display_money.rb +6 -2
  17. data/app/models/concerns/spree/filter_param.rb +21 -0
  18. data/app/models/concerns/spree/image_methods.rb +24 -0
  19. data/app/models/concerns/spree/memoized_data.rb +24 -0
  20. data/app/models/concerns/spree/multi_store_resource.rb +24 -0
  21. data/app/models/concerns/spree/product_scopes.rb +71 -8
  22. data/app/models/concerns/spree/single_store_resource.rb +19 -0
  23. data/app/models/concerns/spree/user_address.rb +19 -0
  24. data/app/models/concerns/spree/user_methods.rb +14 -12
  25. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  26. data/app/models/concerns/spree/user_reporting.rb +35 -10
  27. data/app/models/concerns/spree/user_roles.rb +25 -0
  28. data/app/models/spree/ability.rb +3 -1
  29. data/app/models/spree/address.rb +27 -6
  30. data/app/models/spree/app_configuration.rb +8 -0
  31. data/app/models/spree/app_dependencies.rb +20 -6
  32. data/app/models/spree/base.rb +18 -0
  33. data/app/models/spree/classification.rb +3 -0
  34. data/app/models/spree/cms/pages/feature_page.rb +7 -0
  35. data/app/models/spree/cms/pages/homepage.rb +20 -0
  36. data/app/models/spree/cms/pages/standard_page.rb +4 -0
  37. data/app/models/spree/cms/sections/featured_article.rb +22 -0
  38. data/app/models/spree/cms/sections/hero_image.rb +38 -0
  39. data/app/models/spree/cms/sections/image_gallery.rb +103 -0
  40. data/app/models/spree/cms/sections/product_carousel.rb +14 -0
  41. data/app/models/spree/cms/sections/rich_text_content.rb +13 -0
  42. data/app/models/spree/cms/sections/side_by_side_images.rb +74 -0
  43. data/app/models/spree/cms_page.rb +66 -0
  44. data/app/models/spree/cms_section.rb +69 -0
  45. data/app/models/spree/country.rb +14 -6
  46. data/app/models/spree/credit_card.rb +2 -8
  47. data/app/models/spree/customer_return.rb +8 -2
  48. data/app/models/spree/gateway/bogus.rb +6 -4
  49. data/app/models/spree/icon.rb +9 -0
  50. data/app/models/spree/image/configuration/active_storage.rb +2 -0
  51. data/app/models/spree/image.rb +5 -24
  52. data/app/models/spree/inventory_unit.rb +1 -1
  53. data/app/models/spree/line_item.rb +1 -1
  54. data/app/models/spree/menu.rb +63 -0
  55. data/app/models/spree/menu_item.rb +76 -0
  56. data/app/models/spree/option_type.rb +1 -1
  57. data/app/models/spree/option_value.rb +11 -0
  58. data/app/models/spree/option_value_variant.rb +1 -1
  59. data/app/models/spree/order/address_book.rb +3 -5
  60. data/app/models/spree/order/currency_updater.rb +1 -1
  61. data/app/models/spree/order/emails.rb +32 -0
  62. data/app/models/spree/order/payments.rb +1 -1
  63. data/app/models/spree/order/store_credit.rb +1 -1
  64. data/app/models/spree/order.rb +46 -45
  65. data/app/models/spree/payment.rb +7 -0
  66. data/app/models/spree/payment_method.rb +16 -0
  67. data/app/models/spree/preferences/preferable.rb +12 -0
  68. data/app/models/spree/preferences/preferable_class_methods.rb +10 -1
  69. data/app/models/spree/product.rb +37 -30
  70. data/app/models/spree/product_property.rb +19 -4
  71. data/app/models/spree/promotion/rules/country.rb +1 -1
  72. data/app/models/spree/promotion/rules/first_order.rb +4 -3
  73. data/app/models/spree/promotion/rules/taxon.rb +10 -7
  74. data/app/models/spree/promotion.rb +6 -15
  75. data/app/models/spree/promotion_handler/cart.rb +7 -2
  76. data/app/models/spree/promotion_handler/coupon.rb +5 -4
  77. data/app/models/spree/promotion_handler/free_shipping.rb +5 -6
  78. data/app/models/spree/promotion_handler/page.rb +3 -2
  79. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -0
  80. data/app/models/spree/promotion_rule.rb +2 -0
  81. data/app/models/spree/property.rb +28 -1
  82. data/app/models/spree/reimbursement.rb +3 -1
  83. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -1
  84. data/app/models/spree/shipment_handler.rb +4 -2
  85. data/app/models/spree/stock/quantifier.rb +6 -6
  86. data/app/models/spree/stock_location.rb +9 -0
  87. data/app/models/spree/store.rb +90 -7
  88. data/app/models/spree/store_credit.rb +7 -3
  89. data/app/models/spree/store_credit_event.rb +2 -2
  90. data/app/models/spree/store_payment_method.rb +11 -0
  91. data/app/models/spree/store_product.rb +11 -0
  92. data/app/models/spree/store_promotion.rb +11 -0
  93. data/app/models/spree/taxon.rb +22 -1
  94. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -0
  95. data/app/models/spree/taxon_image.rb +1 -0
  96. data/app/models/spree/taxonomy.rb +3 -1
  97. data/app/models/spree/variant.rb +21 -6
  98. data/app/presenters/spree/filters/options_presenter.rb +47 -0
  99. data/app/presenters/spree/filters/price_presenter.rb +22 -0
  100. data/app/presenters/spree/filters/price_range_presenter.rb +29 -0
  101. data/app/presenters/spree/filters/properties_presenter.rb +23 -0
  102. data/app/presenters/spree/filters/property_presenter.rb +42 -0
  103. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +44 -0
  104. data/app/services/spree/account/addresses/create.rb +1 -0
  105. data/app/services/spree/account/addresses/helper.rb +6 -0
  106. data/app/services/spree/account/addresses/update.rb +9 -3
  107. data/app/services/spree/account/create.rb +17 -0
  108. data/app/services/spree/account/update.rb +15 -0
  109. data/app/services/spree/build_localized_redirect_url.rb +1 -1
  110. data/app/services/spree/cart/associate.rb +16 -0
  111. data/app/services/spree/cart/change_currency.rb +27 -0
  112. data/app/services/spree/cart/create.rb +5 -3
  113. data/app/services/spree/cart/destroy.rb +40 -0
  114. data/app/services/spree/cart/empty.rb +36 -0
  115. data/app/services/spree/cart/estimate_shipping_rates.rb +3 -3
  116. data/app/services/spree/checkout/add_store_credit.rb +1 -1
  117. data/app/services/spree/classifications/reposition.rb +18 -0
  118. data/app/services/spree/credit_cards/destroy.rb +41 -0
  119. data/app/sorters/spree/base_sorter.rb +23 -11
  120. data/app/sorters/spree/products/sort.rb +23 -7
  121. data/app/validators/db_maximum_length_validator.rb +5 -0
  122. data/app/validators/email_validator.rb +3 -1
  123. data/config/initializers/active_storage.rb +2 -0
  124. data/config/locales/en.yml +177 -3
  125. data/config/routes.rb +0 -5
  126. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +8 -0
  127. data/db/migrate/20210407200948_create_spree_menus.rb +16 -0
  128. data/db/migrate/20210408092939_create_spree_menu_items.rb +31 -0
  129. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +8 -0
  130. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +8 -0
  131. data/db/migrate/20210512191732_create_spree_cms_pages.rb +24 -0
  132. data/db/migrate/20210514204251_create_spree_cms_sections.rb +22 -0
  133. data/db/migrate/20210527094055_create_spree_products_stores.rb +36 -0
  134. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  135. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +46 -0
  136. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +29 -0
  137. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +10 -0
  138. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +11 -0
  139. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  140. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  141. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +29 -0
  142. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +11 -0
  143. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +305 -0
  144. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +9 -0
  145. data/lib/generators/spree/dummy/dummy_generator.rb +11 -6
  146. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  147. data/lib/generators/spree/dummy_model/templates/model.rb.tt +1 -1
  148. data/lib/generators/spree/install/install_generator.rb +12 -24
  149. data/lib/spree/core/components.rb +8 -0
  150. data/lib/spree/core/controller_helpers/auth.rb +7 -1
  151. data/lib/spree/core/controller_helpers/common.rb +1 -1
  152. data/lib/spree/core/controller_helpers/order.rb +4 -4
  153. data/lib/spree/core/controller_helpers/search.rb +1 -0
  154. data/lib/spree/core/controller_helpers/store.rb +24 -1
  155. data/lib/spree/core/engine.rb +6 -0
  156. data/lib/spree/core/importer/product.rb +3 -1
  157. data/lib/spree/core/product_duplicator.rb +1 -0
  158. data/lib/spree/core/search/base.rb +17 -22
  159. data/lib/spree/core/version.rb +1 -1
  160. data/lib/spree/core.rb +8 -4
  161. data/lib/spree/i18n.rb +1 -1
  162. data/lib/spree/money.rb +2 -1
  163. data/lib/spree/permitted_attributes.rb +21 -3
  164. data/lib/spree/testing_support/authorization_helpers.rb +6 -3
  165. data/lib/spree/testing_support/capybara_config.rb +3 -1
  166. data/lib/spree/testing_support/common_rake.rb +17 -4
  167. data/lib/spree/testing_support/extension_rake.rb +2 -2
  168. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/classification_factory.rb +8 -0
  170. data/lib/spree/testing_support/factories/cms_page_factory.rb +20 -0
  171. data/lib/spree/testing_support/factories/cms_section_factory.rb +31 -0
  172. data/lib/spree/testing_support/factories/customer_return_factory.rb +24 -17
  173. data/lib/spree/testing_support/factories/icon_factory.rb +7 -0
  174. data/lib/spree/testing_support/factories/line_item_factory.rb +6 -2
  175. data/lib/spree/testing_support/factories/menu_factory.rb +16 -0
  176. data/lib/spree/testing_support/factories/menu_item_factory.rb +10 -0
  177. data/lib/spree/testing_support/factories/options_factory.rb +5 -0
  178. data/lib/spree/testing_support/factories/order_factory.rb +11 -2
  179. data/lib/spree/testing_support/factories/payment_method_factory.rb +6 -2
  180. data/lib/spree/testing_support/factories/product_factory.rb +17 -1
  181. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/promotion_factory.rb +18 -9
  183. data/lib/spree/testing_support/factories/property_factory.rb +22 -0
  184. data/lib/spree/testing_support/factories/stock_location_factory.rb +5 -4
  185. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -0
  186. data/lib/spree/testing_support/factories/store_factory.rb +11 -0
  187. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -1
  188. data/lib/spree/testing_support/factories/taxon_image_factory.rb +7 -0
  189. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -0
  190. data/lib/spree/testing_support/factories/user_factory.rb +7 -2
  191. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  192. data/lib/spree/testing_support/flatpickr_capybara.rb +58 -35
  193. data/lib/spree/testing_support/locale_helpers.rb +1 -1
  194. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  195. data/lib/spree/testing_support/rspec_retry_config.rb +5 -0
  196. data/lib/tasks/core.rake +1 -1
  197. data/spec/fixtures/favicon.ico +0 -0
  198. data/spec/fixtures/files/icon_256x256.gif +0 -0
  199. data/spec/fixtures/files/icon_256x256.png +0 -0
  200. data/spec/fixtures/files/icon_512x512.png +0 -0
  201. data/spec/fixtures/files/img_256x128.png +0 -0
  202. data/spree_core.gemspec +12 -11
  203. metadata +211 -159
  204. data/app/assets/images/logo/spree_50.png +0 -0
  205. data/app/assets/images/noimage/large.png +0 -0
  206. data/app/assets/images/noimage/mini.png +0 -0
  207. data/app/assets/images/noimage/product.png +0 -0
  208. data/app/assets/images/noimage/small.png +0 -0
  209. data/app/assets/javascripts/spree.js +0 -78
  210. data/app/controllers/spree/errors_controller.rb +0 -11
  211. data/app/helpers/spree/mail_helper.rb +0 -29
  212. data/app/mailers/spree/base_mailer.rb +0 -46
  213. data/app/mailers/spree/order_mailer.rb +0 -26
  214. data/app/mailers/spree/reimbursement_mailer.rb +0 -12
  215. data/app/mailers/spree/shipment_mailer.rb +0 -12
  216. data/app/mailers/spree/test_mailer.rb +0 -8
  217. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -22
  218. data/app/views/layouts/spree/base_mailer.html.erb +0 -46
  219. data/app/views/spree/errors/forbidden.html.erb +0 -0
  220. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  221. data/app/views/spree/order_mailer/cancel_email.html.erb +0 -24
  222. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -38
  223. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -23
  224. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -39
  225. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +0 -23
  226. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +0 -38
  227. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -56
  228. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  229. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -12
  230. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -13
  231. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -456
  232. data/app/views/spree/shared/_error_messages.html.erb +0 -11
  233. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -16
  234. data/app/views/spree/shared/_paths.html.erb +0 -8
  235. data/app/views/spree/shared/_purchased_items_table.html.erb +0 -69
  236. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -13
  237. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +0 -27
  238. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +0 -13
  239. data/app/views/spree/shared/purchased_items_table/_total.html.erb +0 -13
  240. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -36
  241. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  242. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  243. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  244. data/config/initializers/assets.rb +0 -2
  245. data/config/initializers/premailer_assets.rb +0 -1
  246. data/config/initializers/premailer_rails.rb +0 -3
  247. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +0 -10
  248. data/lib/generators/spree/dummy/templates/initializers/bullet.rb +0 -5
  249. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -15
  250. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -16
  251. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -16
  252. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -16
  253. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +0 -23
  254. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +0 -13
  255. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +0 -5
  256. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +0 -5
  257. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +0 -11
  258. data/lib/tasks/email.rake +0 -10
  259. data/vendor/assets/javascripts/cleave.js +0 -1669
  260. data/vendor/assets/javascripts/fetch.umd.js +0 -531
  261. data/vendor/assets/javascripts/jquery.payment.js +0 -652
  262. data/vendor/assets/javascripts/jsuri.js +0 -458
  263. data/vendor/assets/javascripts/polyfill.min.js +0 -1
@@ -2,14 +2,7 @@ module Spree
2
2
  class CreditCard < Spree::Base
3
3
  include ActiveMerchant::Billing::CreditCardMethods
4
4
 
5
- # to migrate safely from older Spree versions that din't provide safe deletion for CCs
6
- # we need to ensure that we have a connection to the DB and that the `deleted_at` column exists
7
- if !ENV['SPREE_DISABLE_DB_CONNECTION'] &&
8
- connected? &&
9
- table_exists? &&
10
- connection.column_exists?(:spree_credit_cards, :deleted_at)
11
- acts_as_paranoid
12
- end
5
+ acts_as_paranoid
13
6
 
14
7
  belongs_to :payment_method
15
8
  belongs_to :user, class_name: Spree.user_class.to_s, foreign_key: 'user_id',
@@ -42,6 +35,7 @@ module Spree
42
35
  or(where('CAST(spree_credit_cards.year AS DECIMAL) = ?', Time.current.year).
43
36
  where('CAST(spree_credit_cards.month AS DECIMAL) >= ?', Time.current.month))
44
37
  }
38
+ scope :not_removed, -> { where(deleted_at: nil) }
45
39
 
46
40
  # needed for some of the ActiveMerchant gateways (eg. SagePay)
47
41
  alias_attribute :brand, :cc_type
@@ -2,6 +2,7 @@ module Spree
2
2
  class CustomerReturn < Spree::Base
3
3
  include Spree::Core::NumberGenerator.new(prefix: 'CR', length: 9)
4
4
  belongs_to :stock_location
5
+ belongs_to :store, class_name: 'Spree::Store', inverse_of: :customer_returns
5
6
 
6
7
  has_many :reimbursements, inverse_of: :customer_return
7
8
  has_many :return_items, inverse_of: :customer_return
@@ -9,6 +10,7 @@ module Spree
9
10
 
10
11
  after_create :process_return!
11
12
 
13
+ validates :store, presence: true
12
14
  validates :number, uniqueness: { case_sensitive: true }
13
15
  validates :return_items, :stock_location, presence: true
14
16
  validate :must_have_return_authorization, on: :create
@@ -17,7 +19,7 @@ module Spree
17
19
  accepts_nested_attributes_for :return_items
18
20
 
19
21
  extend DisplayMoney
20
- money_methods pre_tax_total: { currency: Spree::Config[:currency] }
22
+ money_methods :pre_tax_total
21
23
 
22
24
  self.whitelisted_ransackable_attributes = ['number']
23
25
 
@@ -31,6 +33,10 @@ module Spree
31
33
  completely_decided? && return_items.accepted.includes(:reimbursement).all? { |return_item| return_item.reimbursement.try(:reimbursed?) }
32
34
  end
33
35
 
36
+ def currency
37
+ order&.currency
38
+ end
39
+
34
40
  # Temporarily tie a customer_return to one order
35
41
  def order
36
42
  return nil if return_items.blank?
@@ -49,7 +55,7 @@ module Spree
49
55
  end
50
56
 
51
57
  def must_have_return_authorization
52
- if item = return_items.find { |ri| ri.return_authorization.blank? }
58
+ if (item = return_items.find { |ri| ri.return_authorization.blank? })
53
59
  errors.add(:base, Spree.t(:missing_return_authorization, item_name: item.inventory_unit.variant.name))
54
60
  end
55
61
  end
@@ -9,14 +9,12 @@ module Spree
9
9
 
10
10
  attr_accessor :test
11
11
 
12
+ preference :dummy_key, :string, default: 'PUBLICKEY123'
13
+
12
14
  def provider_class
13
15
  self.class
14
16
  end
15
17
 
16
- def preferences
17
- {}
18
- end
19
-
20
18
  def create_profile(payment)
21
19
  return if payment.source.has_payment_profile?
22
20
 
@@ -88,5 +86,9 @@ module Spree
88
86
  end
89
87
  random
90
88
  end
89
+
90
+ def public_preference_keys
91
+ [:dummy_key]
92
+ end
91
93
  end
92
94
  end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class Icon < Spree::Asset
3
+ has_one_attached :attachment
4
+
5
+ ICON_TYPES = %i[png jpg jpeg gif svg]
6
+
7
+ validates :attachment, attached: true, content_type: ICON_TYPES
8
+ end
9
+ end
@@ -10,6 +10,8 @@ module Spree
10
10
 
11
11
  has_one_attached :attachment
12
12
 
13
+ default_scope { includes(attachment_attachment: :blob) }
14
+
13
15
  def self.styles
14
16
  @styles ||= {
15
17
  mini: '48x48>',
@@ -2,6 +2,7 @@ module Spree
2
2
  class Image < Asset
3
3
  include Configuration::ActiveStorage
4
4
  include Rails.application.routes.url_helpers
5
+ include ::Spree::ImageMethods
5
6
 
6
7
  # In Rails 5.x class constants are being undefined/redefined during the code reloading process
7
8
  # in a rails development environment, after which the actual ruby objects stored in those class constants
@@ -15,13 +16,8 @@ module Spree
15
16
  width, height = size.chop.split('x')
16
17
 
17
18
  {
18
- url: polymorphic_path(attachment.variant(
19
- gravity: 'center',
20
- resize: size,
21
- extent: size,
22
- background: 'snow2',
23
- quality: 80
24
- ), only_path: true),
19
+ url: generate_url(size: size),
20
+ size: size,
25
21
  width: width,
26
22
  height: height
27
23
  }
@@ -35,13 +31,7 @@ module Spree
35
31
  width, height = size.chop.split('x')
36
32
 
37
33
  {
38
- url: polymorphic_path(attachment.variant(
39
- gravity: 'center',
40
- resize: size,
41
- extent: size,
42
- background: 'snow2',
43
- quality: 80
44
- ), only_path: true),
34
+ url: generate_url(size: size),
45
35
  size: size,
46
36
  width: width,
47
37
  height: height
@@ -59,16 +49,7 @@ module Spree
59
49
  end
60
50
 
61
51
  def plp_url
62
- size = self.class.styles[:plp_and_carousel]
63
- variant = attachment.variant(
64
- gravity: 'center',
65
- resize: size,
66
- extent: size,
67
- background: 'snow2',
68
- quality: 80
69
- )
70
-
71
- polymorphic_path(variant, only_path: true)
52
+ generate_url(size: self.class.styles[:plp_and_carousel])
72
53
  end
73
54
  end
74
55
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant'
5
5
  belongs_to :order, class_name: 'Spree::Order'
6
6
  belongs_to :shipment, class_name: 'Spree::Shipment', touch: true, optional: true
7
- has_many :return_items, inverse_of: :inventory_unit
7
+ has_many :return_items, class_name: 'Spree::ReturnItem', inverse_of: :inventory_unit
8
8
  has_many :return_authorizations, class_name: 'Spree::ReturnAuthorization', through: :return_items
9
9
  belongs_to :line_item, class_name: 'Spree::LineItem'
10
10
  end
@@ -39,7 +39,7 @@ module Spree
39
39
 
40
40
  after_create :update_tax_charge
41
41
 
42
- delegate :name, :description, :sku, :should_track_inventory?, :product, :options_text, :slug, to: :variant
42
+ delegate :name, :description, :sku, :should_track_inventory?, :product, :options_text, :slug, :product_id, to: :variant
43
43
  delegate :brand, :category, to: :product
44
44
  delegate :tax_zone, to: :order
45
45
 
@@ -0,0 +1,63 @@
1
+ module Spree
2
+ class Menu < Spree::Base
3
+ include SingleStoreResource
4
+
5
+ MENU_LOCATIONS = ['Header', 'Footer']
6
+ MENU_LOCATIONS_PARAMETERIZED = []
7
+
8
+ MENU_LOCATIONS.each do |location|
9
+ parameterize_location = location.parameterize(separator: '_')
10
+ MENU_LOCATIONS_PARAMETERIZED << parameterize_location
11
+ end
12
+
13
+ has_many :menu_items, dependent: :destroy, class_name: 'Spree::MenuItem'
14
+ belongs_to :store, touch: true, class_name: 'Spree::Store'
15
+
16
+ before_validation :parameterize_location
17
+ after_create :set_root
18
+ after_save :update_root_name
19
+ after_touch :touch_store
20
+
21
+ validates :name, :store, :locale, presence: true
22
+ validates :location, uniqueness: { scope: [:store, :locale] }
23
+ validates :location, inclusion: { in: MENU_LOCATIONS_PARAMETERIZED }
24
+
25
+ has_one :root, -> { where(parent_id: nil) }, class_name: 'Spree::MenuItem', dependent: :destroy
26
+
27
+ default_scope { order(created_at: :asc) }
28
+
29
+ scope :by_locale, ->(locale) { where(locale: locale) }
30
+
31
+ self.whitelisted_ransackable_attributes = %w[name location locale store_id]
32
+
33
+ MENU_LOCATIONS_PARAMETERIZED.each do |location_name|
34
+ define_singleton_method("for_#{location_name}") do |locale|
35
+ menu = find_by(location: location_name, locale: locale.to_s)
36
+
37
+ menu.root if menu.present?
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def parameterize_location
44
+ return unless location.present?
45
+
46
+ self.location = location.parameterize(separator: '_')
47
+ end
48
+
49
+ def set_root
50
+ self.root ||= menu_items.create!(name: name, item_type: 'Container')
51
+ end
52
+
53
+ def update_root_name
54
+ return unless saved_change_to_name?
55
+
56
+ root.update(name: name)
57
+ end
58
+
59
+ def touch_store
60
+ store.touch
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,76 @@
1
+ module Spree
2
+ class MenuItem < Spree::Base
3
+ include Spree::DisplayLink
4
+
5
+ acts_as_nested_set dependent: :destroy
6
+
7
+ belongs_to :menu, touch: true
8
+ belongs_to :linked_resource, polymorphic: true
9
+
10
+ before_create :ensure_item_belongs_to_root
11
+ before_update :reset_link_attributes
12
+ before_save :paremeterize_code
13
+
14
+ after_save :touch_ancestors_and_menu
15
+ after_touch :touch_ancestors_and_menu
16
+
17
+ ITEM_TYPE = %w[Link Container]
18
+
19
+ LINKED_RESOURCE_TYPE = ['URL']
20
+ STATIC_RESOURCE_TYPE = ['Home Page']
21
+ DYNAMIC_RESOURCE_TYPE = ['Spree::Product', 'Spree::Taxon', 'Spree::CmsPage']
22
+
23
+ LINKED_RESOURCE_TYPE.unshift(*STATIC_RESOURCE_TYPE)
24
+ LINKED_RESOURCE_TYPE.push(*DYNAMIC_RESOURCE_TYPE)
25
+
26
+ validates :name, :menu, presence: true
27
+ validates :item_type, inclusion: { in: ITEM_TYPE }
28
+ validates :linked_resource_type, inclusion: { in: LINKED_RESOURCE_TYPE }
29
+
30
+ has_one :icon, as: :viewable, dependent: :destroy, class_name: 'Spree::Icon'
31
+ accepts_nested_attributes_for :icon, reject_if: :all_blank
32
+
33
+ def container?
34
+ item_type == 'Container'
35
+ end
36
+
37
+ def code?(item_code = nil)
38
+ if item_code
39
+ code == item_code
40
+ else
41
+ code.present?
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def reset_link_attributes
48
+ if linked_resource_type_changed? || item_type == 'Container'
49
+ self.linked_resource_id = nil
50
+ self.destination = nil
51
+ self.new_window = false
52
+
53
+ self.linked_resource_type = 'URL' if item_type == 'Container'
54
+ end
55
+ end
56
+
57
+ def ensure_item_belongs_to_root
58
+ if menu.try(:root).present? && parent_id.nil?
59
+ self.parent = menu.root
60
+
61
+ store_new_parent
62
+ end
63
+ end
64
+
65
+ def touch_ancestors_and_menu
66
+ ancestors.update_all(updated_at: Time.current)
67
+ menu.try!(:touch)
68
+ end
69
+
70
+ def paremeterize_code
71
+ return if code.blank?
72
+
73
+ self.code = code.parameterize
74
+ end
75
+ end
76
+ end
@@ -26,7 +26,7 @@ module Spree
26
26
  after_touch :touch_all_products
27
27
 
28
28
  def filter_param
29
- name.titleize.delete(' ').downcase
29
+ name.parameterize
30
30
  end
31
31
 
32
32
  def self.color
@@ -11,6 +11,17 @@ module Spree
11
11
  validates :presentation
12
12
  end
13
13
 
14
+ scope :filterable, lambda {
15
+ joins(:option_type).
16
+ where(OptionType.table_name => { filterable: true }).
17
+ distinct
18
+ }
19
+
20
+ scope :for_products, lambda { |products|
21
+ joins(:variants).
22
+ where(Variant.table_name => { product_id: products.map(&:id) })
23
+ }
24
+
14
25
  after_touch :touch_all_variants
15
26
 
16
27
  delegate :name, :presentation, to: :option_type, prefix: true, allow_nil: true
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class OptionValueVariant < Spree::Base
3
3
  belongs_to :option_value, class_name: 'Spree::OptionValue'
4
- belongs_to :variant, class_name: 'Spree::Variant'
4
+ belongs_to :variant, touch: true, class_name: 'Spree::Variant'
5
5
 
6
6
  validates :option_value, :variant, presence: true
7
7
  validates :option_value_id, uniqueness: { scope: :variant_id }
@@ -2,7 +2,7 @@
2
2
  module Spree
3
3
  class Order < Spree::Base
4
4
  module AddressBook
5
- extend ActiveSupport::Concern
5
+ extend ActiveSupport::Concern # FIXME: this module is not required to be a concern
6
6
 
7
7
  def clone_shipping_address
8
8
  if ship_address
@@ -22,7 +22,6 @@ module Spree
22
22
  address = Spree::Address.find_by(id: id)
23
23
  if address && address.user_id == user_id
24
24
  self['bill_address_id'] = address.id
25
- user.update_attribute(:bill_address_id, address.id)
26
25
  bill_address.reload
27
26
  else
28
27
  self['bill_address_id'] = nil
@@ -31,14 +30,13 @@ module Spree
31
30
 
32
31
  def bill_address_attributes=(attributes)
33
32
  self.bill_address = update_or_create_address(attributes)
34
- user.bill_address = bill_address if user
33
+ user.bill_address = bill_address if user && user.bill_address.nil?
35
34
  end
36
35
 
37
36
  def ship_address_id=(id)
38
37
  address = Spree::Address.find_by(id: id)
39
38
  if address && address.user_id == user_id
40
39
  self['ship_address_id'] = address.id
41
- user.update_attribute(:ship_address_id, address.id)
42
40
  ship_address.reload
43
41
  else
44
42
  self['ship_address_id'] = nil
@@ -47,7 +45,7 @@ module Spree
47
45
 
48
46
  def ship_address_attributes=(attributes)
49
47
  self.ship_address = update_or_create_address(attributes)
50
- user.ship_address = ship_address if user
48
+ user.ship_address = ship_address if user && user.ship_address.nil?
51
49
  end
52
50
 
53
51
  private
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class Order < Spree::Base
3
3
  module CurrencyUpdater
4
- extend ActiveSupport::Concern
4
+ extend ActiveSupport::Concern # FIXME: this module is not required to be a concern
5
5
 
6
6
  included do
7
7
  def homogenize_line_item_currencies
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ class Order < Spree::Base
3
+ module Emails
4
+ extend ActiveSupport::Concern
5
+
6
+ def deliver_order_confirmation_email
7
+ # you can overwrite this method in your application / extension to send out the confirmation email
8
+ # or use `spree_emails` gem
9
+ # YourEmailVendor.deliver_order_confirmation_email(id) # `id` = ID of the Order being sent, you can also pass the entire Order object using `self`
10
+ # update_column(:confirmation_delivered, true) # if you would like to mark that the email was sent
11
+ end
12
+
13
+ # If you would like to also send confirmation email to store owner(s)
14
+ def deliver_store_owner_order_notification_email?
15
+ false
16
+ end
17
+
18
+ def deliver_store_owner_order_notification_email
19
+ # you can overwrite this method in your application / extension to send out the confirmation email
20
+ # or use `spree_emails` gem
21
+ # YourEmailVendor.deliver_store_owner_notification_email(id) # `id` = ID of the Order being sent, you can also pass the entire Order object using `self`
22
+ # update_column(:store_owner_notification_delivered, true) # if you would like to mark that the email was sent
23
+ end
24
+
25
+ def send_cancel_email
26
+ # you can overwrite this method in your application / extension to send out the confirmation email
27
+ # or use `spree_emails` gem
28
+ # YourEmailVendor.deliver_cancel_email(id) # `id` = ID of the Order being sent, you can also pass the entire Order object using `self`
29
+ end
30
+ end
31
+ end
32
+ end