spree_core 5.3.4 → 5.4.0.beta2

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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/orders/find_complete.rb +33 -2
  3. data/app/finders/spree/products/find.rb +1 -28
  4. data/app/finders/spree/stores/find_default.rb +17 -0
  5. data/app/finders/spree/variants/visible_finder.rb +1 -0
  6. data/app/helpers/spree/addresses_helper.rb +1 -2
  7. data/app/helpers/spree/base_helper.rb +6 -58
  8. data/app/mailers/spree/base_mailer.rb +4 -3
  9. data/app/models/concerns/spree/adjustment_source.rb +0 -8
  10. data/app/models/concerns/spree/admin_user_methods.rb +32 -2
  11. data/app/models/concerns/spree/image_methods.rb +4 -0
  12. data/app/models/concerns/spree/metadata.rb +10 -0
  13. data/app/models/concerns/spree/number_as_param.rb +5 -3
  14. data/app/models/concerns/spree/prefixed_id.rb +82 -0
  15. data/app/models/concerns/spree/product_scopes.rb +35 -65
  16. data/app/models/concerns/spree/publishable.rb +47 -47
  17. data/app/models/concerns/spree/{multi_store_resource.rb → store_scoped_resource.rb} +1 -10
  18. data/app/models/concerns/spree/stores/markets.rb +124 -0
  19. data/app/models/concerns/spree/user_methods.rb +7 -7
  20. data/app/models/concerns/spree/user_payment_source.rb +2 -0
  21. data/app/models/concerns/spree/user_roles.rb +1 -0
  22. data/app/models/concerns/spree/vat_price_calculation.rb +2 -2
  23. data/app/models/spree/ability.rb +18 -5
  24. data/app/models/spree/address.rb +33 -2
  25. data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
  26. data/app/models/spree/adjustment.rb +3 -20
  27. data/app/models/spree/api_key.rb +102 -0
  28. data/app/models/spree/asset.rb +2 -0
  29. data/app/models/spree/authentication/strategies/base_strategy.rb +55 -0
  30. data/app/models/spree/authentication/strategies/email_password_strategy.rb +47 -0
  31. data/app/models/spree/base.rb +1 -0
  32. data/app/models/spree/calculator.rb +2 -0
  33. data/app/models/spree/country.rb +60 -0
  34. data/app/models/spree/coupon_code.rb +2 -0
  35. data/app/models/spree/credit_card.rb +2 -27
  36. data/app/models/spree/current.rb +45 -4
  37. data/app/models/spree/customer_group.rb +2 -0
  38. data/app/models/spree/customer_return.rb +2 -0
  39. data/app/models/spree/digital.rb +2 -0
  40. data/app/models/spree/digital_link.rb +2 -0
  41. data/app/models/spree/export.rb +3 -2
  42. data/app/models/spree/exports/products.rb +0 -6
  43. data/app/models/spree/fulfilment_changer.rb +8 -2
  44. data/app/models/spree/gateway/bogus.rb +69 -9
  45. data/app/models/spree/gateway.rb +0 -3
  46. data/app/models/spree/gateway_customer.rb +2 -0
  47. data/app/models/spree/gift_card.rb +2 -0
  48. data/app/models/spree/gift_card_batch.rb +6 -0
  49. data/app/models/spree/image/configuration/active_storage.rb +0 -2
  50. data/app/models/spree/image.rb +25 -31
  51. data/app/models/spree/import.rb +5 -3
  52. data/app/models/spree/import_mapping.rb +2 -0
  53. data/app/models/spree/import_row.rb +2 -0
  54. data/app/models/spree/import_schemas/customers.rb +21 -0
  55. data/app/models/spree/imports/customers.rb +9 -0
  56. data/app/models/spree/integration.rb +2 -0
  57. data/app/models/spree/inventory_unit.rb +2 -0
  58. data/app/models/spree/invitation.rb +6 -6
  59. data/app/models/spree/legacy_admin_user.rb +31 -0
  60. data/app/models/spree/legacy_user.rb +19 -1
  61. data/app/models/spree/line_item.rb +15 -4
  62. data/app/models/spree/log_entry.rb +10 -5
  63. data/app/models/spree/market.rb +83 -0
  64. data/app/models/spree/market_country.rb +25 -0
  65. data/app/models/spree/metafield.rb +2 -0
  66. data/app/models/spree/metafield_definition.rb +2 -0
  67. data/app/models/spree/newsletter_subscriber.rb +2 -0
  68. data/app/models/spree/option_type.rb +2 -0
  69. data/app/models/spree/option_value.rb +2 -0
  70. data/app/models/spree/order/address_book.rb +2 -1
  71. data/app/models/spree/order/checkout.rb +0 -18
  72. data/app/models/spree/order.rb +93 -56
  73. data/app/models/spree/payment/gateway_options.rb +2 -2
  74. data/app/models/spree/payment/processing.rb +5 -5
  75. data/app/models/spree/payment.rb +7 -2
  76. data/app/models/spree/payment_capture_event.rb +2 -0
  77. data/app/models/spree/payment_connection_error.rb +3 -0
  78. data/app/models/spree/payment_method/check.rb +1 -1
  79. data/app/models/spree/payment_method/store_credit.rb +5 -5
  80. data/app/models/spree/payment_method.rb +59 -1
  81. data/app/models/spree/payment_response.rb +70 -0
  82. data/app/models/spree/payment_session.rb +109 -0
  83. data/app/models/spree/payment_sessions/bogus.rb +4 -0
  84. data/app/models/spree/payment_setup_session.rb +79 -0
  85. data/app/models/spree/payment_source.rb +2 -0
  86. data/app/models/spree/permission_sets/default_customer.rb +19 -5
  87. data/app/models/spree/permission_sets/product_display.rb +0 -2
  88. data/app/models/spree/permission_sets/product_management.rb +0 -2
  89. data/app/models/spree/policy.rb +2 -0
  90. data/app/models/spree/price.rb +26 -2
  91. data/app/models/spree/price_list.rb +2 -0
  92. data/app/models/spree/price_rule.rb +2 -0
  93. data/app/models/spree/price_rules/market_rule.rb +19 -0
  94. data/app/models/spree/product.rb +45 -101
  95. data/app/models/spree/promotion/rules/country.rb +1 -1
  96. data/app/models/spree/promotion.rb +5 -15
  97. data/app/models/spree/promotion_action.rb +2 -0
  98. data/app/models/spree/promotion_category.rb +2 -0
  99. data/app/models/spree/promotion_handler/coupon.rb +3 -3
  100. data/app/models/spree/promotion_rule.rb +2 -0
  101. data/app/models/spree/prototype.rb +2 -3
  102. data/app/models/spree/refund.rb +8 -2
  103. data/app/models/spree/refund_reason.rb +2 -0
  104. data/app/models/spree/reimbursement/credit.rb +2 -0
  105. data/app/models/spree/reimbursement.rb +2 -0
  106. data/app/models/spree/reimbursement_type.rb +2 -0
  107. data/app/models/spree/report.rb +3 -1
  108. data/app/models/spree/return_authorization.rb +2 -0
  109. data/app/models/spree/return_authorization_reason.rb +2 -0
  110. data/app/models/spree/return_item.rb +2 -0
  111. data/app/models/spree/role.rb +2 -0
  112. data/app/models/spree/shipment/emails.rb +1 -0
  113. data/app/models/spree/shipment.rb +11 -1
  114. data/app/models/spree/shipping_category.rb +5 -3
  115. data/app/models/spree/shipping_method.rb +2 -0
  116. data/app/models/spree/shipping_method_category.rb +2 -0
  117. data/app/models/spree/shipping_rate.rb +2 -0
  118. data/app/models/spree/state_change.rb +2 -0
  119. data/app/models/spree/stock_item.rb +2 -0
  120. data/app/models/spree/stock_location.rb +2 -0
  121. data/app/models/spree/stock_movement.rb +2 -0
  122. data/app/models/spree/stock_transfer.rb +2 -1
  123. data/app/models/spree/store.rb +111 -219
  124. data/app/models/spree/store_credit.rb +6 -0
  125. data/app/models/spree/store_credit_category.rb +2 -0
  126. data/app/models/spree/store_credit_event.rb +2 -0
  127. data/app/models/spree/store_credit_type.rb +2 -0
  128. data/app/models/spree/store_product.rb +2 -0
  129. data/app/models/spree/tax_category.rb +3 -11
  130. data/app/models/spree/tax_rate.rb +2 -0
  131. data/app/models/spree/taxon.rb +2 -15
  132. data/app/models/spree/taxon_rule.rb +2 -0
  133. data/app/models/spree/taxonomy.rb +2 -0
  134. data/app/models/spree/user_identity.rb +81 -0
  135. data/app/models/spree/variant.rb +15 -43
  136. data/app/models/spree/webhook_delivery.rb +2 -0
  137. data/app/models/spree/webhook_endpoint.rb +2 -0
  138. data/app/models/spree/wished_item.rb +15 -0
  139. data/app/models/spree/wishlist.rb +2 -8
  140. data/app/models/spree/zone.rb +3 -10
  141. data/app/presenters/spree/filters/price_presenter.rb +1 -0
  142. data/app/presenters/spree/filters/price_range_presenter.rb +1 -0
  143. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +1 -0
  144. data/app/presenters/spree/product_summary_presenter.rb +1 -0
  145. data/app/services/spree/addresses/helper.rb +22 -3
  146. data/app/services/spree/cart/add_item.rb +8 -4
  147. data/app/services/spree/cart/associate.rb +19 -6
  148. data/app/services/spree/cart/create.rb +13 -2
  149. data/app/services/spree/checkout/select_shipping_method.rb +13 -1
  150. data/app/services/spree/classifications/reposition.rb +5 -0
  151. data/app/services/spree/imports/row_processors/customer.rb +70 -0
  152. data/app/services/spree/orders/approve.rb +5 -3
  153. data/app/services/spree/orders/cancel.rb +9 -4
  154. data/app/services/spree/products/duplicator.rb +0 -12
  155. data/app/services/spree/products/prepare_nested_attributes.rb +1 -13
  156. data/app/services/spree/sample_data/import_runner.rb +54 -0
  157. data/app/services/spree/sample_data/loader.rb +78 -0
  158. data/app/services/spree/seeds/admin_user.rb +2 -3
  159. data/app/services/spree/seeds/all.rb +1 -0
  160. data/app/services/spree/seeds/api_keys.rb +16 -0
  161. data/app/services/spree/seeds/stores.rb +2 -4
  162. data/app/sorters/spree/orders/sort.rb +4 -0
  163. data/app/subscribers/spree/product_metrics_subscriber.rb +4 -4
  164. data/config/brakeman.ignore +120 -0
  165. data/config/locales/en.yml +23 -21
  166. data/db/migrate/20210914000000_spree_four_three.rb +0 -38
  167. data/db/migrate/20210915064329_add_metadata_to_spree_multiple_tables.rb +0 -1
  168. data/db/migrate/20250923141900_create_spree_user_identities.rb +17 -0
  169. data/db/migrate/20260123000000_create_spree_api_keys.rb +19 -0
  170. data/db/migrate/20260131000000_add_thumbnail_id_to_spree_variants_and_products.rb +9 -0
  171. data/db/migrate/20260213000000_create_spree_payment_sessions.rb +27 -0
  172. data/db/migrate/20260218000000_create_spree_payment_setup_sessions.rb +24 -0
  173. data/db/migrate/20260220000000_create_spree_markets.rb +29 -0
  174. data/db/migrate/20260226000000_add_locale_to_spree_orders.rb +5 -0
  175. data/db/migrate/20260226100000_add_token_digest_to_spree_api_keys.rb +21 -0
  176. data/db/sample_data/customers.csv +21 -0
  177. data/db/sample_data/metafield_definitions.rb +7 -0
  178. data/db/sample_data/orders.rb +131 -0
  179. data/db/sample_data/payment_methods.rb +17 -0
  180. data/db/sample_data/products.csv +1083 -0
  181. data/db/sample_data/promotions.rb +8 -0
  182. data/db/sample_data/shipping_methods.rb +39 -0
  183. data/lib/generators/spree/authentication/devise/devise_generator.rb +2 -2
  184. data/lib/generators/spree/authentication/dummy/dummy_generator.rb +54 -0
  185. data/lib/generators/spree/authentication/dummy/templates/authentication_helpers.rb.tt +52 -0
  186. data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +33 -0
  187. data/lib/generators/spree/cursor_rules/templates/spree_rules.mdc +1 -3
  188. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  189. data/lib/spree/core/configuration.rb +1 -3
  190. data/lib/spree/core/controller_helpers/common.rb +6 -0
  191. data/lib/spree/core/controller_helpers/currency.rb +5 -0
  192. data/lib/spree/core/controller_helpers/order.rb +5 -1
  193. data/lib/spree/core/controller_helpers/store.rb +1 -1
  194. data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -2
  195. data/lib/spree/core/dependencies.rb +3 -11
  196. data/lib/spree/core/engine.rb +17 -17
  197. data/lib/spree/core/pricing/context.rb +6 -3
  198. data/lib/spree/core/pricing/resolver.rb +1 -9
  199. data/lib/spree/core/version.rb +1 -1
  200. data/lib/spree/core.rb +14 -29
  201. data/lib/spree/database_type_utilities.rb +7 -0
  202. data/lib/spree/events.rb +17 -10
  203. data/lib/spree/money.rb +2 -9
  204. data/lib/spree/permitted_attributes.rb +20 -20
  205. data/lib/spree/testing_support/capybara_config.rb +2 -2
  206. data/lib/spree/testing_support/common_rake.rb +15 -4
  207. data/lib/spree/testing_support/factories/api_key_factory.rb +19 -0
  208. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -5
  209. data/lib/spree/testing_support/factories/import_factory.rb +12 -0
  210. data/lib/spree/testing_support/factories/market_factory.rb +35 -0
  211. data/lib/spree/testing_support/factories/order_factory.rb +4 -1
  212. data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -6
  213. data/lib/spree/testing_support/factories/payment_session_factory.rb +47 -0
  214. data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +31 -0
  215. data/lib/spree/testing_support/factories/price_rule_factory.rb +10 -0
  216. data/lib/spree/testing_support/factories/product_factory.rb +0 -7
  217. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -2
  218. data/lib/spree/testing_support/factories/user_identity_factory.rb +15 -0
  219. data/lib/spree/testing_support/store.rb +3 -2
  220. data/lib/spree/webhooks.rb +7 -7
  221. data/lib/tasks/core.rake +0 -265
  222. data/lib/tasks/images.rake +20 -0
  223. data/lib/tasks/markets.rake +40 -0
  224. data/lib/tasks/sample_data.rake +15 -0
  225. data/spec/fixtures/files/customers_import.csv +4 -0
  226. metadata +101 -154
  227. data/LICENSE.md +0 -57
  228. data/app/finders/spree/posts/find.rb +0 -137
  229. data/app/finders/spree/product_properties/find_available.rb +0 -20
  230. data/app/finders/spree/stores/find_current.rb +0 -28
  231. data/app/helpers/spree/mail_helper.rb +0 -27
  232. data/app/mailers/spree/test_mailer.rb +0 -8
  233. data/app/models/action_text/video_embed.rb +0 -13
  234. data/app/models/concerns/spree/has_one_link.rb +0 -42
  235. data/app/models/concerns/spree/linkable.rb +0 -9
  236. data/app/models/concerns/spree/previewable.rb +0 -17
  237. data/app/models/spree/custom_domain.rb +0 -59
  238. data/app/models/spree/data_feed/google.rb +0 -15
  239. data/app/models/spree/data_feed.rb +0 -40
  240. data/app/models/spree/gateway/bogus_simple.rb +0 -24
  241. data/app/models/spree/post.rb +0 -106
  242. data/app/models/spree/post_category.rb +0 -44
  243. data/app/models/spree/product_property.rb +0 -51
  244. data/app/models/spree/property.rb +0 -86
  245. data/app/models/spree/property_prototype.rb +0 -9
  246. data/app/models/spree/store_favicon_image.rb +0 -20
  247. data/app/models/spree/store_logo.rb +0 -4
  248. data/app/models/spree/store_mailer_logo.rb +0 -7
  249. data/app/models/spree/taxon_image/configuration/active_storage.rb +0 -26
  250. data/app/models/spree/taxon_image.rb +0 -20
  251. data/app/presenters/spree/filters/properties_presenter.rb +0 -23
  252. data/app/presenters/spree/filters/property_presenter.rb +0 -42
  253. data/app/serializers/spree/events/asset_serializer.rb +0 -22
  254. data/app/serializers/spree/events/base_serializer.rb +0 -61
  255. data/app/serializers/spree/events/customer_return_serializer.rb +0 -20
  256. data/app/serializers/spree/events/digital_link_serializer.rb +0 -20
  257. data/app/serializers/spree/events/digital_serializer.rb +0 -18
  258. data/app/serializers/spree/events/export_serializer.rb +0 -22
  259. data/app/serializers/spree/events/gift_card_batch_serializer.rb +0 -24
  260. data/app/serializers/spree/events/gift_card_serializer.rb +0 -29
  261. data/app/serializers/spree/events/image_serializer.rb +0 -9
  262. data/app/serializers/spree/events/import_row_serializer.rb +0 -23
  263. data/app/serializers/spree/events/import_serializer.rb +0 -24
  264. data/app/serializers/spree/events/invitation_serializer.rb +0 -28
  265. data/app/serializers/spree/events/line_item_serializer.rb +0 -31
  266. data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +0 -21
  267. data/app/serializers/spree/events/order_serializer.rb +0 -39
  268. data/app/serializers/spree/events/payment_serializer.rb +0 -24
  269. data/app/serializers/spree/events/post_category_serializer.rb +0 -20
  270. data/app/serializers/spree/events/post_serializer.rb +0 -26
  271. data/app/serializers/spree/events/price_serializer.rb +0 -22
  272. data/app/serializers/spree/events/product_serializer.rb +0 -24
  273. data/app/serializers/spree/events/promotion_serializer.rb +0 -32
  274. data/app/serializers/spree/events/refund_serializer.rb +0 -23
  275. data/app/serializers/spree/events/reimbursement_serializer.rb +0 -22
  276. data/app/serializers/spree/events/report_serializer.rb +0 -23
  277. data/app/serializers/spree/events/return_authorization_serializer.rb +0 -22
  278. data/app/serializers/spree/events/return_item_serializer.rb +0 -27
  279. data/app/serializers/spree/events/shipment_serializer.rb +0 -24
  280. data/app/serializers/spree/events/stock_item_serializer.rb +0 -22
  281. data/app/serializers/spree/events/stock_movement_serializer.rb +0 -22
  282. data/app/serializers/spree/events/stock_transfer_serializer.rb +0 -22
  283. data/app/serializers/spree/events/store_credit_serializer.rb +0 -30
  284. data/app/serializers/spree/events/user_serializer.rb +0 -18
  285. data/app/serializers/spree/events/variant_serializer.rb +0 -34
  286. data/app/serializers/spree/events/wished_item_serializer.rb +0 -20
  287. data/app/serializers/spree/events/wishlist_serializer.rb +0 -22
  288. data/app/services/spree/data_feeds/google/optional_attributes.rb +0 -23
  289. data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +0 -21
  290. data/app/services/spree/data_feeds/google/products_list.rb +0 -14
  291. data/app/services/spree/data_feeds/google/required_attributes.rb +0 -68
  292. data/app/services/spree/data_feeds/google/rss.rb +0 -109
  293. data/app/sorters/spree/posts/sort.rb +0 -40
  294. data/app/views/action_text/video_embeds/_thumbnail.html.erb +0 -1
  295. data/app/views/action_text/video_embeds/_video_embed.html.erb +0 -3
  296. data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
  297. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  298. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  299. data/config/initializers/oembed.rb +0 -1
  300. data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +0 -14
  301. data/db/migrate/20230109084253_create_product_property_translations.rb +0 -24
  302. data/db/migrate/20230109105943_create_property_translations.rb +0 -24
  303. data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +0 -5
  304. data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +0 -7
  305. data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +0 -5
  306. data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +0 -5
  307. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +0 -5
  308. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +0 -6
  309. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +0 -33
  310. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +0 -5
  311. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
  312. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +0 -7
  313. data/db/migrate/20250730154601_add_unique_index_on_spree_properties_name.rb +0 -24
  314. data/lib/spree/core/controller_helpers/search.rb +0 -17
  315. data/lib/spree/core/product_filters.rb +0 -204
  316. data/lib/spree/core/query_filters/comparable.rb +0 -46
  317. data/lib/spree/core/query_filters/date.rb +0 -8
  318. data/lib/spree/core/query_filters/number.rb +0 -8
  319. data/lib/spree/core/query_filters/text.rb +0 -32
  320. data/lib/spree/core/query_filters.rb +0 -11
  321. data/lib/spree/core/search/base.rb +0 -144
  322. data/lib/spree/testing_support/factories/favicon_image_factory.rb +0 -9
  323. data/lib/spree/testing_support/factories/google_data_feed_factory.rb +0 -7
  324. data/lib/spree/testing_support/factories/post_category_factory.rb +0 -7
  325. data/lib/spree/testing_support/factories/post_factory.rb +0 -22
  326. data/lib/spree/testing_support/factories/product_property_factory.rb +0 -7
  327. data/lib/spree/testing_support/factories/property_factory.rb +0 -28
  328. data/lib/spree/testing_support/factories/taxon_image_factory.rb +0 -9
  329. data/lib/spree/testing_support/flash.rb +0 -25
  330. data/lib/spree/testing_support/flatpickr_capybara.rb +0 -124
  331. data/lib/tasks/exchanges.rake +0 -66
data/LICENSE.md DELETED
@@ -1,57 +0,0 @@
1
- # License
2
-
3
- Copyright © 2024-present, Vendo Connect Inc.
4
-
5
- Copyright © 2015-2024, Spark Solutions Sp. z o.o.
6
-
7
- Copyright © 2007-2015, Spree Commerce Inc.
8
-
9
- Spree Commerce is a free, open-source eCommerce framework giving you full control and customizability.
10
-
11
- For **Spree Commerce versions 4.10** and later in the [spree/spree](https://github.com/spree/spree) repository two licenses apply simultaneously and users are required to comply with the terms of these two licenses at the same time:
12
-
13
- * [AGPL-3.0](https://opensource.org/license/agpl-v3) - for all contributions from version 4.10 onwards
14
-
15
- * [BSD-3-Clause](https://opensource.org/license/bsd-3-clause) - for all other contributions predating version 4.10
16
- Effectively, for versions 4.10 and upwards **AGPL-3.0** license applies.
17
-
18
- **Spree Commerce versions 4.9** and earlier in the [spree/spree](https://github.com/spree/spree) repository are available under the **BSD-3-Clause** license and users are required to comply with its terms.
19
-
20
- If you’d like to use Spree Commerce without the AGPL-3.0 restrictions e.g. for a **SaaS** business, please talk to us about obtaining a [Commercial License](#commercial-license).
21
-
22
- All third party components incorporated into this software are licensed under the original license provided by the owner of the applicable component.
23
-
24
- Please refer to our [Licensing FAQ](https://spreecommerce.org/why-spree-is-changing-its-open-source-license-to-agpl-3-0-and-introducing-a-commercial-license/) in case of questions.
25
-
26
- ## AGPL-3.0 License - Spree 4.10 upwards
27
-
28
- If you decide to accept the AGPL-3.0 license by using Spree Commerce version 4.10 or later, you must comply with the following terms:
29
-
30
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
31
-
32
- This program is distributed in the hope that it will be useful,
33
- but WITHOUT ANY WARRANTY; without even the implied warranty of
34
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35
- GNU Affero General Public License for more details.
36
-
37
- You should have received a copy of the GNU Affero General Public License
38
- along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
39
-
40
- ## BSD 3-Clause License
41
-
42
- If you decide to accept the BSD-3-Clause license by using Spree Commerce, you must comply with the following terms:
43
-
44
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
45
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
46
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
47
- Neither the name of Spree Commerce Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
48
-
49
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50
-
51
- ## Commercial License
52
-
53
- Should you decide to use Spree Commerce version 4.10 or later for commercial redistribution (eg. SaaS) - also known as Commercial Distribution - you must do so in accordance with the terms and conditions contained in a separate written agreement between you and [Vendo Connect Inc.](https://www.getvendo.com/).
54
-
55
- For more information about the Commercial License (CL) please contact [sales@getvendo.com](mailto:sales@getvendo.com).
56
-
57
- Please refer to our [Licensing FAQ](https://spreecommerce.org/why-spree-is-changing-its-open-source-license-to-agpl-3-0-and-introducing-a-commercial-license/) in case of questions.
@@ -1,137 +0,0 @@
1
- module Spree
2
- module Posts
3
- class Find < Spree::BaseFinder
4
- def initialize(scope:, params:)
5
- super(scope: scope, params: params)
6
- @scope = scope
7
- @query = params[:q].presence&.strip
8
- @ids = String(params.dig(:filter, :ids)).split(',')
9
- @slugs = String(params.dig(:filter, :slugs)).split(',')
10
- @category_ids = String(params.dig(:filter, :category_ids)).split(',')
11
- @author_ids = String(params.dig(:filter, :author_ids)).split(',')
12
- @tags = params.dig(:filter, :tags).to_s.split(',').compact_blank
13
- @sort_by = params[:sort_by]
14
- @published = params.dig(:filter, :published)
15
- end
16
-
17
- def execute
18
- posts = by_ids(scope)
19
- posts = by_slugs(posts)
20
- posts = by_query(posts)
21
- posts = by_category_ids(posts)
22
- posts = by_author_ids(posts)
23
- posts = by_tags(posts)
24
- posts = by_published(posts)
25
- posts = ordered(posts)
26
-
27
- posts.distinct
28
- end
29
-
30
- private
31
-
32
- attr_reader :scope, :query, :ids, :slugs, :category_ids, :author_ids, :tags, :sort_by, :published
33
-
34
- def query?
35
- query.present?
36
- end
37
-
38
- def ids?
39
- ids.present?
40
- end
41
-
42
- def slugs?
43
- slugs.present?
44
- end
45
-
46
- def category_ids?
47
- category_ids.present?
48
- end
49
-
50
- def author_ids?
51
- author_ids.present?
52
- end
53
-
54
- def tags?
55
- tags.present?
56
- end
57
-
58
- def published?
59
- published.present?
60
- end
61
-
62
- def sort_by?
63
- sort_by.present?
64
- end
65
-
66
- def by_query(posts)
67
- return posts unless query?
68
-
69
- posts.search_by_title(query)
70
- end
71
-
72
- def by_ids(posts)
73
- return posts unless ids?
74
-
75
- posts.where(id: ids)
76
- end
77
-
78
- def by_slugs(posts)
79
- return posts unless slugs?
80
-
81
- posts.where(slug: slugs)
82
- end
83
-
84
- def by_category_ids(posts)
85
- return posts unless category_ids?
86
-
87
- posts.where(post_category_id: category_ids)
88
- end
89
-
90
- def by_author_ids(posts)
91
- return posts unless author_ids?
92
-
93
- posts.where(author_id: author_ids)
94
- end
95
-
96
- def by_tags(posts)
97
- return posts if tags.empty?
98
-
99
- posts.tagged_with(tags, any: true)
100
- end
101
-
102
- def by_published(posts)
103
- return posts unless published?
104
-
105
- case published.to_s
106
- when 'true'
107
- posts.published
108
- when 'false'
109
- posts.where(published_at: nil)
110
- else
111
- posts
112
- end
113
- end
114
-
115
- def ordered(posts)
116
- return posts unless sort_by?
117
-
118
- case sort_by
119
- when 'newest-first'
120
- posts.by_newest
121
- when 'oldest-first'
122
- posts.order(created_at: :asc)
123
- when 'published-newest'
124
- posts.order(published_at: :desc)
125
- when 'published-oldest'
126
- posts.order(published_at: :asc)
127
- when 'title-a-z'
128
- posts.order(title: :asc)
129
- when 'title-z-a'
130
- posts.order(title: :desc)
131
- else
132
- posts
133
- end
134
- end
135
- end
136
- end
137
- end
@@ -1,20 +0,0 @@
1
- module Spree
2
- module ProductProperties
3
- class FindAvailable
4
- include ProductFilterable
5
-
6
- def initialize(scope: ProductProperty.spree_base_scopes, products_scope: Product.spree_base_scopes)
7
- @scope = scope
8
- @products_scope = products_scope
9
- end
10
-
11
- def execute
12
- find_available(scope, products_scope).includes(:translations)
13
- end
14
-
15
- private
16
-
17
- attr_reader :scope, :products_scope
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- module Spree
2
- module Stores
3
- class FindCurrent
4
- def initialize(scope: nil, url: nil)
5
- @scope = scope || Spree::Store
6
- @url = url
7
- end
8
-
9
- def execute
10
- store = by_url(scope) || scope.default
11
- return if store.nil?
12
-
13
- Spree::Current.store = store
14
- store
15
- end
16
-
17
- protected
18
-
19
- attr_reader :scope, :url
20
-
21
- def by_url(scope)
22
- return if url.blank?
23
-
24
- scope.by_custom_domain(url).or(scope.by_url(url)).first
25
- end
26
- end
27
- end
28
- end
@@ -1,27 +0,0 @@
1
- module Spree
2
- module MailHelper
3
- include Spree::BaseHelper
4
- include Spree::ImagesHelper
5
-
6
- def variant_image_url(variant)
7
- image = variant.default_image
8
- image.present? && image.attached? ? spree_image_url(image, variant: :mini) : image_url('noimage/small.png')
9
- end
10
-
11
- def name_for(order)
12
- order.name || Spree.t('customer')
13
- end
14
-
15
- def store_logo
16
- @store_logo ||= current_store&.mailer_logo || current_store&.logo
17
- end
18
-
19
- def logo_path
20
- Spree::Deprecation.warn('logo_path is deprecated and will be removed in Spree 5.5. Please use Active Storage URL helpers instead.')
21
-
22
- return main_app.cdn_image_url(store_logo.variant(resize_to_limit: [244, 104])) if store_logo&.variable?
23
-
24
- return main_app.cdn_image_url(store_logo) if store_logo&.image?
25
- end
26
- end
27
- end
@@ -1,8 +0,0 @@
1
- module Spree
2
- class TestMailer < BaseMailer
3
- def test_email(email)
4
- subject = "#{Spree::Store.default.name} #{Spree.t('test_mailer.test_email.subject')}"
5
- mail(to: email, from: from_address, reply_to: reply_to_address, subject: subject)
6
- end
7
- end
8
- end
@@ -1,13 +0,0 @@
1
- module ActionText
2
- class VideoEmbed < ApplicationRecord
3
- include ActionText::Attachable
4
-
5
- validates :url, :raw_html, :thumbnail_url, presence: true
6
-
7
- # `to_partial_path` for the storefront render is by default "action_text/video_embeds/video_embed"
8
-
9
- def to_trix_content_attachment_partial_path
10
- 'action_text/video_embeds/thumbnail'
11
- end
12
- end
13
- end
@@ -1,42 +0,0 @@
1
- module Spree
2
- module HasOneLink
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- has_one :link, ->(ps) { ps.links }, class_name: 'Spree::PageLink', as: :parent, dependent: :destroy, inverse_of: :parent
7
- accepts_nested_attributes_for :link
8
-
9
- def allowed_linkable_types
10
- [
11
- [Spree.t(:page), 'Spree::Page'],
12
- [Spree.t(:product), 'Spree::Product'],
13
- [Spree.t(:post), 'Spree::Post'],
14
- [Spree.t(:taxon), 'Spree::Taxon'],
15
- [Spree.t(:policy), 'Spree::Policy'],
16
- [Spree.t(:url), nil]
17
- ]
18
- end
19
-
20
- def default_linkable_type
21
- 'Spree::Page'
22
- end
23
-
24
- def default_linkable_resource
25
- @default_linkable_resource ||= theme_or_parent.pages.find_by(type: 'Spree::Pages::Homepage')
26
- end
27
-
28
- def default_links
29
- @default_links.presence || [
30
- Spree::PageLink.new(
31
- label: Spree.t(:shop_all),
32
- linkable: theme_or_parent.pages.find_by(type: 'Spree::Pages::ShopAll')
33
- )
34
- ]
35
- end
36
-
37
- def theme_or_parent
38
- theme.preview? ? theme.parent : theme
39
- end
40
- end
41
- end
42
- end
@@ -1,9 +0,0 @@
1
- module Spree
2
- module Linkable
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- has_many :page_links, as: :linkable, class_name: 'Spree::PageLink', dependent: :destroy
7
- end
8
- end
9
- end
@@ -1,17 +0,0 @@
1
- module Spree
2
- module Previewable
3
- extend ActiveSupport::Concern
4
-
5
- included do |base|
6
- belongs_to :parent, class_name: base.name, optional: true, foreign_key: :parent_id
7
- has_many :previews, class_name: base.name, dependent: :destroy_async, foreign_key: :parent_id
8
-
9
- scope :without_previews, -> { where(parent_id: nil) }
10
- scope :only_previews, -> { where.not(parent_id: nil) }
11
- end
12
-
13
- def preview?
14
- parent.present?
15
- end
16
- end
17
- end
@@ -1,59 +0,0 @@
1
- module Spree
2
- class CustomDomain < Spree::Base
3
- include Spree::SingleStoreResource
4
- include Spree::Metafields
5
- include Spree::Metadata
6
-
7
- normalizes :url, with: ->(value) { value&.to_s&.squish&.presence }
8
-
9
- #
10
- # Associations
11
- #
12
- belongs_to :store, class_name: 'Spree::Store', inverse_of: :custom_domains, touch: true
13
-
14
- #
15
- # Validations
16
- #
17
- validates :url, presence: true, uniqueness: true, format: {
18
- with: %r{\A(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\z}i
19
- }, length: { in: 1..63 }
20
- validate :url_is_valid
21
-
22
- #
23
- # Callbacks
24
- #
25
- before_validation :sanitize_url
26
- after_save :ensure_has_one_default
27
- after_validation :ensure_default, on: :create
28
-
29
- def url_is_valid
30
- return if url.blank?
31
- parts = url.split('.')
32
-
33
- errors.add(:url, 'use domain or subdomain') if parts.size > 4 || parts.size < 2
34
- end
35
-
36
- def ensure_default
37
- self.default = store.custom_domains.count.zero?
38
- end
39
-
40
- def ensure_has_one_default
41
- store.custom_domains.where.not(id: id).update_all(default: false) if default?
42
- end
43
-
44
- def active?
45
- true
46
- end
47
-
48
- def name
49
- url
50
- end
51
-
52
- private
53
-
54
- # remove https:// and http:// from the url
55
- def sanitize_url
56
- self.url = url&.gsub(%r{https?://}, '')
57
- end
58
- end
59
- end
@@ -1,15 +0,0 @@
1
- require_dependency 'spree/data_feed'
2
-
3
- module Spree
4
- class DataFeed::Google < DataFeed
5
- class << self
6
- def label
7
- 'Google Merchant Center Feed'
8
- end
9
-
10
- def provider_name
11
- 'google'
12
- end
13
- end
14
- end
15
- end
@@ -1,40 +0,0 @@
1
- module Spree
2
- class DataFeed < Spree.base_class
3
- belongs_to :store, class_name: 'Spree::Store', foreign_key: 'store_id'
4
-
5
- scope :for_store, ->(store) { where(store: store) }
6
-
7
- before_validation :generate_slug
8
-
9
- with_options presence: true do
10
- validates :store
11
- validates :name, uniqueness: true
12
- validates :slug, uniqueness: { scope: :store_id }
13
- end
14
-
15
- def formatted_url
16
- "#{store.formatted_url}/api/v2/data_feeds/#{self.class.provider_name}/#{slug}.rss"
17
- end
18
-
19
- private
20
-
21
- def generate_slug
22
- new_slug = slug.blank? ? SecureRandom.uuid : slug.parameterize
23
- write_attribute(:slug, new_slug)
24
- end
25
-
26
- class << self
27
- def label
28
- raise NotImplementedError
29
- end
30
-
31
- def provider_name
32
- raise NotImplementedError
33
- end
34
-
35
- def available_types
36
- Spree.data_feed_types
37
- end
38
- end
39
- end
40
- end
@@ -1,24 +0,0 @@
1
- # Bogus Gateway that doesn't support payment profiles
2
- module Spree
3
- class Gateway::BogusSimple < Gateway::Bogus
4
- def payment_profiles_supported?
5
- false
6
- end
7
-
8
- def authorize(_money, credit_card, _options = {})
9
- if VALID_CCS.include? credit_card.number
10
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
11
- else
12
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
13
- end
14
- end
15
-
16
- def purchase(_money, credit_card, _options = {})
17
- if VALID_CCS.include? credit_card.number
18
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
19
- else
20
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
21
- end
22
- end
23
- end
24
- end
@@ -1,106 +0,0 @@
1
- module Spree
2
- class Post < Spree.base_class
3
- include Spree::SingleStoreResource
4
- include Spree::Metafields
5
- extend FriendlyId
6
-
7
- publishes_lifecycle_events
8
-
9
- friendly_id :slug_candidates, use: %i[slugged scoped history], scope: %i[store_id deleted?]
10
- acts_as_paranoid
11
- acts_as_taggable_on :tags
12
- acts_as_taggable_tenant :store_id
13
-
14
- if defined?(PgSearch)
15
- include PgSearch::Model
16
- pg_search_scope :search_by_title, against: :title
17
- else
18
- scope :search_by_title, ->(query) { where('title LIKE ?', "%#{query}%") }
19
- end
20
-
21
- #
22
- # Ransack filtering
23
- #
24
- self.whitelisted_ransackable_attributes = %w[author_id post_category_id published_at]
25
- self.whitelisted_ransackable_associations = %w[author post_category]
26
- self.whitelisted_ransackable_scopes = %w[search_by_title]
27
-
28
- #
29
- # Attachments
30
- #
31
- has_one_attached :image, service: Spree.public_storage_service_name
32
-
33
- #
34
- # Rich Text
35
- #
36
- has_rich_text :content
37
- has_rich_text :excerpt
38
-
39
- #
40
- # Associations
41
- #
42
- belongs_to :author, class_name: Spree.admin_user_class.to_s, optional: true
43
- belongs_to :store, class_name: 'Spree::Store', inverse_of: :posts
44
- belongs_to :post_category, class_name: 'Spree::PostCategory', optional: true, touch: true, inverse_of: :posts
45
- alias category post_category
46
-
47
- #
48
- # Validations
49
- #
50
- validates :title, :store, presence: true
51
- validates :slug, presence: true, uniqueness: { scope: :store_id, conditions: -> { where(deleted_at: nil) } }
52
- validates :meta_title, length: { maximum: 160 }, allow_blank: true
53
- validates :meta_description, length: { maximum: 320 }, allow_blank: true
54
- validates :image, content_type: Rails.application.config.active_storage.web_image_content_types
55
-
56
- #
57
- # Scopes
58
- #
59
- scope :published, -> { where(published_at: [..Time.current]) }
60
- scope :by_newest, -> { order(created_at: :desc) }
61
-
62
- delegate :name, to: :author, prefix: true, allow_nil: true
63
- delegate :title, to: :post_category, prefix: true, allow_nil: true
64
-
65
- def should_generate_new_friendly_id?
66
- slug.blank? || (persisted? && title_changed?)
67
- end
68
-
69
- def slug_candidates
70
- [
71
- :title,
72
- [:title, :id]
73
- ]
74
- end
75
-
76
- def published?
77
- published_at.present?
78
- end
79
-
80
- def publish(date = nil)
81
- update(published_at: date || Time.current)
82
- end
83
-
84
- def unpublish
85
- update(published_at: nil)
86
- end
87
-
88
- def description
89
- excerpt.to_plain_text.presence || content.to_plain_text
90
- end
91
-
92
- def shortened_description
93
- desc = excerpt.to_plain_text.presence || content.to_plain_text
94
- desc.length > 320 ? "#{desc[0...320]}..." : desc
95
- end
96
-
97
- def self.to_tom_select_json
98
- pluck(:id, :title).map do |id, title|
99
- {
100
- id: id,
101
- name: title
102
- }
103
- end.as_json
104
- end
105
- end
106
- end
@@ -1,44 +0,0 @@
1
- module Spree
2
- class PostCategory < Spree.base_class
3
- include Spree::SingleStoreResource
4
- include Spree::Metafields
5
- extend FriendlyId
6
-
7
- publishes_lifecycle_events
8
-
9
- friendly_id :slug_candidates, use: %i[slugged scoped history], scope: %i[store_id]
10
-
11
- #
12
- # Associations
13
- #
14
- belongs_to :store, class_name: 'Spree::Store', inverse_of: :post_categories
15
- has_many :posts, class_name: 'Spree::Post', dependent: :nullify, inverse_of: :post_category
16
-
17
- #
18
- # Validations
19
- #
20
- validates :title, :store, presence: true
21
- validates :slug, presence: true, uniqueness: { scope: :store_id }
22
-
23
- #
24
- # ActionText
25
- #
26
- has_rich_text :description
27
-
28
- #
29
- # Ransack
30
- #
31
- self.whitelisted_ransackable_attributes = %w[title slug]
32
-
33
- def should_generate_new_friendly_id?
34
- slug.blank? || title_changed?
35
- end
36
-
37
- def slug_candidates
38
- [
39
- :title,
40
- [:title, :id]
41
- ]
42
- end
43
- end
44
- end