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
@@ -2,9 +2,7 @@ require 'uri'
2
2
 
3
3
  module Spree
4
4
  class Store < Spree.base_class
5
- RESERVED_CODES = %w(
6
- admin default app api www cdn files assets checkout account auth login user
7
- )
5
+ has_prefix_id :store # Spree-specific: store
8
6
 
9
7
  include FriendlyId
10
8
  include Spree::TranslatableResource
@@ -12,6 +10,7 @@ module Spree
12
10
  include Spree::Metadata
13
11
  include Spree::Stores::Setup
14
12
  include Spree::Stores::Socials
13
+ include Spree::Stores::Markets
15
14
  include Spree::Security::Stores if defined?(Spree::Security::Stores)
16
15
  include Spree::UserManagement
17
16
 
@@ -19,7 +18,7 @@ module Spree
19
18
  # Magic methods
20
19
  #
21
20
  acts_as_paranoid
22
- friendly_id :slug_candidates, use: [:slugged, :history], slug_column: :code, routes: :normal
21
+ friendly_id :code, use: [:slugged], slug_column: :code, routes: :normal
23
22
 
24
23
  #
25
24
  # Translations
@@ -38,6 +37,7 @@ module Spree
38
37
  # Preferences
39
38
  #
40
39
  # general preferences
40
+ preference :admin_locale, :string
41
41
  preference :timezone, :string, default: Time.zone.name
42
42
  preference :weight_unit, :string, default: 'lb'
43
43
  preference :unit_system, :string, default: 'imperial'
@@ -75,7 +75,6 @@ module Spree
75
75
 
76
76
  has_many :store_products, class_name: 'Spree::StoreProduct'
77
77
  has_many :products, through: :store_products, class_name: 'Spree::Product'
78
- has_many :product_properties, through: :products, class_name: 'Spree::ProductProperty'
79
78
  has_many :variants, through: :products, class_name: 'Spree::Variant', source: :variants_including_master
80
79
  has_many :stock_items, through: :variants, class_name: 'Spree::StockItem'
81
80
  has_many :inventory_units, through: :variants, class_name: 'Spree::InventoryUnit'
@@ -93,20 +92,12 @@ module Spree
93
92
 
94
93
  has_many :wishlists, class_name: 'Spree::Wishlist'
95
94
 
96
- has_many :data_feeds, class_name: 'Spree::DataFeed'
97
-
98
95
  belongs_to :default_country, class_name: 'Spree::Country'
99
96
  belongs_to :checkout_zone, class_name: 'Spree::Zone'
100
97
 
101
98
  has_many :reports, class_name: 'Spree::Report'
102
99
  has_many :exports, class_name: 'Spree::Export'
103
100
 
104
- has_many :custom_domains, class_name: 'Spree::CustomDomain', dependent: :destroy
105
- has_one :default_custom_domain, -> { where(default: true) }, class_name: 'Spree::CustomDomain'
106
-
107
- has_many :posts, class_name: 'Spree::Post', dependent: :destroy, inverse_of: :store
108
- has_many :post_categories, class_name: 'Spree::PostCategory', dependent: :destroy, inverse_of: :store
109
-
110
101
  has_many :integrations, class_name: 'Spree::Integration'
111
102
 
112
103
  has_many :gift_cards, class_name: 'Spree::GiftCard', dependent: :destroy
@@ -118,6 +109,9 @@ module Spree
118
109
 
119
110
  has_many :customer_groups, class_name: 'Spree::CustomerGroup', dependent: :destroy, inverse_of: :store
120
111
 
112
+ has_many :api_keys, class_name: 'Spree::ApiKey', dependent: :destroy
113
+
114
+
121
115
  #
122
116
  # ActionText
123
117
  #
@@ -130,20 +124,16 @@ module Spree
130
124
  #
131
125
  # Virtual attributes
132
126
  #
133
- attribute :import_products_from_store_id, :string, default: nil
134
- attribute :import_payment_methods_from_store_id, :string, default: nil
135
- attr_accessor :skip_validate_not_last
136
127
  store_accessor :private_metadata, :storefront_password
137
128
 
138
129
  #
139
130
  # Validations
140
131
  #
141
132
  with_options presence: true do
142
- validates :name, :url, :mail_from_address, :default_currency, :default_country, :code
133
+ validates :name, :url, :mail_from_address, :code
143
134
  end
144
135
  validates :preferred_digital_asset_authorized_clicks, numericality: { only_integer: true, greater_than: 0 }
145
136
  validates :preferred_digital_asset_authorized_days, numericality: { only_integer: true, greater_than: 0 }
146
- validates :code, uniqueness: { case_sensitive: false, conditions: -> { with_deleted } }, exclusion: RESERVED_CODES
147
137
  validates :mail_from_address, email: { allow_blank: false }
148
138
  # FIXME: we should remove this condition in v5
149
139
  if !ENV['SPREE_DISABLE_DB_CONNECTION'] &&
@@ -164,59 +154,60 @@ module Spree
164
154
 
165
155
  #
166
156
  # Callbacks
167
- before_validation :ensure_default_country
168
- before_validation :set_code, on: :create
169
- before_validation :set_url
157
+ before_validation :set_default_code, on: :create
170
158
  before_save :ensure_default_exists_and_is_unique
171
- before_save :ensure_supported_currencies, :ensure_supported_locales
159
+ after_create :ensure_default_market
172
160
  after_create :ensure_default_taxonomies_are_created
173
161
  after_create :ensure_default_automatic_taxons
174
- after_create :ensure_default_post_categories_are_created
175
- after_create :import_products_from_store, if: -> { import_products_from_store_id.present? }
176
- after_create :import_payment_methods_from_store, if: -> { import_payment_methods_from_store_id.present? }
177
162
  after_create :create_default_policies
178
- before_destroy :validate_not_last, unless: :skip_validate_not_last
179
- before_destroy :pass_default_flag_to_other_store
180
- after_commit :clear_cache
181
- after_commit :handle_code_changes, on: :update, if: -> { code_previously_changed? }
182
163
 
183
164
  #
184
165
  # Scopes
185
166
  #
186
167
  default_scope { order(created_at: :asc) }
187
- scope :by_custom_domain, ->(url) { left_joins(:custom_domains).where("#{Spree::CustomDomain.table_name}.url" => url) }
188
- scope :by_url, ->(url) { where(url: url).or(where("#{table_name}.url like ?", "%#{url}%")) }
189
168
 
190
169
  #
191
170
  # Delegations
192
171
  #
193
- delegate :iso, to: :default_country, prefix: true, allow_nil: true
194
172
 
195
- def self.current(url = nil)
196
- if url.present?
197
- Spree.current_store_finder.new(url: url).execute
198
- else
199
- Spree::Current.store
200
- end
173
+ def self.current(_url = nil)
174
+ Spree::Current.store
201
175
  end
202
176
 
203
- # FIXME: we need to drop `or_initialize` in v5
204
- # this behaviour is very buggy and unpredictable
177
+ # @deprecated The or_initialize behavior will be removed in Spree 5.5.
205
178
  def self.default
206
- Rails.cache.fetch('default_store') do
207
- # workaround for Mobility bug with first_or_initialize
208
- if where(default: true).any?
209
- where(default: true).first
210
- else
211
- new(default: true)
212
- end
179
+ # workaround for Mobility bug with first_or_initialize
180
+ if where(default: true).any?
181
+ where(default: true).first
182
+ else
183
+ Spree::Deprecation.warn(
184
+ 'Spree::Store.default returning a new unpersisted store when no default store exists is deprecated ' \
185
+ 'and will be removed in Spree 5.5. Please ensure a default store is created before calling Store.default.'
186
+ )
187
+ new(default: true)
213
188
  end
214
189
  end
215
190
 
216
191
  def self.available_locales
217
- Spree::Store.all.map(&:supported_locales_list).flatten.uniq
192
+ Spree::Store.default&.supported_locales_list || []
218
193
  end
219
194
 
195
+ # @deprecated Use Markets instead. Will be removed in Spree 5.5.
196
+ def checkout_zone
197
+ Spree::Deprecation.warn('Store#checkout_zone is deprecated and will be removed in Spree 5.5. Use Markets instead.')
198
+ super
199
+ end
200
+
201
+ # @deprecated Use Markets instead. Will be removed in Spree 5.5.
202
+ def checkout_zone=(zone)
203
+ Spree::Deprecation.warn('Store#checkout_zone= is deprecated and will be removed in Spree 5.5. Use Markets instead.')
204
+ super
205
+ end
206
+
207
+ # Virtual attribute — sets the country for the default market created on store creation.
208
+ # Not persisted on the store itself; only used by the after_create callback.
209
+ attr_reader :default_country_iso
210
+
220
211
  def default_country_iso=(iso)
221
212
  return if iso.blank?
222
213
 
@@ -224,10 +215,11 @@ module Spree
224
215
 
225
216
  country = Spree::Country.by_iso(iso)
226
217
 
227
- if country.present?
228
- self.default_country = country
229
- elsif iso_country = ::Country[iso]
230
- new_country = Spree::Country.create!(
218
+ unless country
219
+ iso_country = ::Country[iso]
220
+ return unless iso_country
221
+
222
+ country = Spree::Country.create!(
231
223
  iso_name: iso_country.local_name&.upcase,
232
224
  iso: iso_country.alpha2,
233
225
  iso3: iso_country.alpha3,
@@ -236,15 +228,9 @@ module Spree
236
228
  states_required: Spree::Address::STATES_REQUIRED.include?(iso),
237
229
  zipcode_required: !Spree::Address::NO_ZIPCODE_ISO_CODES.include?(iso)
238
230
  )
239
-
240
- self.default_country = new_country
241
231
  end
242
- end
243
232
 
244
- def supported_currencies_list
245
- @supported_currencies_list ||= ([default_currency] + read_attribute(:supported_currencies).to_s.split(',')).uniq.map(&:to_s).map do |code|
246
- ::Money::Currency.find(code.strip)
247
- end.compact.sort_by { |currency| currency.iso_code == default_currency ? 0 : 1 }
233
+ @default_country_for_market = country
248
234
  end
249
235
 
250
236
  def seo_meta_description
@@ -257,10 +243,6 @@ module Spree
257
243
  end
258
244
  end
259
245
 
260
- def supported_locales_list
261
- @supported_locales_list ||= (read_attribute(:supported_locales).to_s.split(',') << default_locale).compact.uniq.sort
262
- end
263
-
264
246
  def unique_name
265
247
  @unique_name ||= "#{name} (#{code})"
266
248
  end
@@ -292,51 +274,61 @@ module Spree
292
274
  end
293
275
  end
294
276
 
295
- def formatted_custom_domain
296
- return unless default_custom_domain
297
-
298
- @formatted_custom_domain ||= if Rails.env.development? || Rails.env.test?
299
- URI::Generic.build(
300
- scheme: Rails.application.routes.default_url_options[:protocol] || 'http',
301
- host: default_custom_domain.url,
302
- port: Rails.application.routes.default_url_options[:port]
303
- ).to_s
304
- else
305
- URI::HTTPS.build(host: default_custom_domain.url).to_s
306
- end
307
- end
308
-
309
277
  def url_or_custom_domain
310
- default_custom_domain&.url || url
278
+ url
311
279
  end
312
280
 
313
281
  def formatted_url_or_custom_domain
314
- formatted_custom_domain || formatted_url
315
- end
316
-
317
- # Returns the countries available for checkout for the store or creates a new one if it doesn't exist
318
- # @return [Array<Spree::Country>]
319
- def countries_available_for_checkout
320
- @countries_available_for_checkout ||= Rails.cache.fetch(countries_available_for_checkout_cache_key) do
321
- (checkout_zone.try(:country_list) || Spree::Country.all).to_a
322
- end
282
+ formatted_url
323
283
  end
324
284
 
325
- # Returns the states available for checkout for the store or creates a new one if it doesn't exist
285
+ # Returns the states available for checkout for the store
326
286
  # @param country [Spree::Country] the country to get the states for
327
287
  # @return [Array<Spree::State>]
328
288
  def states_available_for_checkout(country)
329
- Rails.cache.fetch(states_available_for_checkout_cache_key(country)) do
330
- (checkout_zone.try(:state_list_for, country) || country.states).to_a
331
- end
289
+ country.states.to_a
332
290
  end
333
291
 
292
+ # @deprecated Use {Spree::Zone.all} or {#countries_with_shipping_coverage} instead.
293
+ # Will be removed in Spree 5.5.
334
294
  def supported_shipping_zones
335
- @supported_shipping_zones ||= if checkout_zone.present?
336
- [checkout_zone]
337
- else
338
- Spree::Zone.includes(zone_members: :zoneable).all
339
- end
295
+ Spree::Deprecation.warn(
296
+ 'Store#supported_shipping_zones is deprecated and will be removed in Spree 5.5. ' \
297
+ 'Use Spree::Zone.all or Store#countries_with_shipping_coverage instead.'
298
+ )
299
+ zone = Spree::Zone.find_by(id: read_attribute(:checkout_zone_id))
300
+ if zone.present?
301
+ [zone]
302
+ else
303
+ Spree::Zone.includes(zone_members: :zoneable).all
304
+ end
305
+ end
306
+
307
+ # Returns countries covered by at least one shipping zone
308
+ # that has an active shipping method attached.
309
+ # Handles both country-type zones (direct membership) and
310
+ # state-type zones (country inferred from state).
311
+ #
312
+ # @return [ActiveRecord::Relation<Spree::Country>]
313
+ def countries_with_shipping_coverage
314
+ zone_ids = Spree::Zone
315
+ .joins(:shipping_methods)
316
+ .select(:id)
317
+
318
+ country_zone_country_ids = Spree::ZoneMember
319
+ .where(zone_id: zone_ids, zoneable_type: 'Spree::Country')
320
+ .select(:zoneable_id)
321
+
322
+ state_zone_country_ids = Spree::State
323
+ .where(id: Spree::ZoneMember
324
+ .where(zone_id: zone_ids, zoneable_type: 'Spree::State')
325
+ .select(:zoneable_id))
326
+ .select(:country_id)
327
+
328
+ Spree::Country
329
+ .where(id: country_zone_country_ids)
330
+ .or(Spree::Country.where(id: state_zone_country_ids))
331
+ .order(:name)
340
332
  end
341
333
 
342
334
  # Returns the default stock location for the store or creates a new one if it doesn't exist
@@ -362,10 +354,6 @@ module Spree
362
354
  favicon_image.variant(resize_to_limit: [32, 32])
363
355
  end
364
356
 
365
- def can_be_deleted?
366
- self.class.where.not(id: id).any?
367
- end
368
-
369
357
  def metric_unit_system?
370
358
  preferred_unit_system == 'metric'
371
359
  end
@@ -378,24 +366,6 @@ module Spree
378
366
  @digital_shipping_category ||= ShippingCategory.find_or_create_by(name: 'Digital')
379
367
  end
380
368
 
381
- def import_products_from_store
382
- store = Store.find(import_products_from_store_id)
383
- product_ids = store.products.pluck(:id)
384
-
385
- return if product_ids.empty?
386
-
387
- StoreProduct.insert_all(product_ids.map { |product_id| { store_id: id, product_id: product_id } })
388
- end
389
-
390
- def import_payment_methods_from_store
391
- store = Store.find(import_payment_methods_from_store_id)
392
- payment_method_ids = store.payment_method_ids
393
-
394
- return if payment_method_ids.empty?
395
-
396
- StorePaymentMethod.insert_all(payment_method_ids.map { |payment_method_id| { store_id: id, payment_method_id: payment_method_id } })
397
- end
398
-
399
369
  %w[customer_terms_of_service customer_privacy_policy customer_returns_policy customer_shipping_policy].each do |policy_method|
400
370
  define_method policy_method do
401
371
  Spree::Deprecation.warn("Store##{policy_method} is deprecated and will be removed in Spree 5.5. Please use Store#policies instead.")
@@ -406,66 +376,25 @@ module Spree
406
376
 
407
377
  private
408
378
 
409
- def countries_available_for_checkout_cache_key
410
- "#{cache_key_with_version}/#{checkout_zone&.cache_key_with_version}/countries_available_for_checkout"
411
- end
412
-
413
- def states_available_for_checkout_cache_key(country)
414
- "#{cache_key_with_version}/#{checkout_zone&.cache_key_with_version}/states_available_for_checkout/#{country&.cache_key_with_version}"
415
- end
416
-
417
- def ensure_default_exists_and_is_unique
418
- if default
419
- Store.where.not(id: id).update_all(default: false)
420
- elsif Store.where(default: true).count.zero?
421
- self.default = true
422
- end
423
- end
379
+ def ensure_default_market
380
+ return if markets.exists?
424
381
 
425
- def ensure_supported_locales
426
- return unless attributes.keys.include?('supported_locales')
427
- return if supported_locales.present?
428
- return if default_locale.blank?
382
+ country = @default_country_for_market
383
+ return if country.blank?
429
384
 
430
- self.supported_locales = default_locale
431
- end
385
+ iso_country = ISO3166::Country[country.iso]
432
386
 
433
- def ensure_supported_currencies
434
- return unless attributes.keys.include?('supported_currencies')
435
- return if supported_currencies.present?
436
- return if default_currency.blank?
437
-
438
- self.supported_currencies = default_currency
439
- end
440
-
441
- def validate_not_last
442
- unless can_be_deleted?
443
- errors.add(:base, :cannot_destroy_only_store)
444
- throw(:abort)
445
- end
446
- end
447
-
448
- def pass_default_flag_to_other_store
449
- if default? && can_be_deleted?
450
- self.class.where.not(id: id).first.update!(default: true)
451
- self.default = false
387
+ Spree::Events.disable do
388
+ markets.create!(
389
+ name: country.name,
390
+ currency: iso_country&.currency_code || read_attribute(:default_currency) || 'USD',
391
+ default_locale: iso_country&.languages_official&.first || read_attribute(:default_locale) || 'en',
392
+ default: true,
393
+ countries: [country]
394
+ )
452
395
  end
453
396
  end
454
397
 
455
- def clear_cache
456
- Rails.cache.delete('default_store')
457
- end
458
-
459
- def ensure_default_country
460
- return if default_country.present? && (checkout_zone.blank? || checkout_zone.country_list.blank? || checkout_zone.country_list.include?(default_country))
461
-
462
- self.default_country = if checkout_zone.present? && checkout_zone.country_list.any?
463
- checkout_zone.country_list.first
464
- else
465
- Country.find_by(iso: 'US') || Country.first
466
- end
467
- end
468
-
469
398
  def ensure_default_taxonomies_are_created
470
399
  Spree::Events.disable do
471
400
  [
@@ -510,21 +439,6 @@ module Spree
510
439
  end
511
440
  end
512
441
 
513
- def ensure_default_post_categories_are_created
514
- Spree::Events.disable do
515
- [
516
- translate_with_store_locale_fallback('spree.default_post_categories.resources'),
517
- translate_with_store_locale_fallback('spree.default_post_categories.articles'),
518
- translate_with_store_locale_fallback('spree.default_post_categories.news')
519
- ].each do |category_title|
520
- # Use exists?/create pattern for safety
521
- next if post_categories.where(title: category_title).exists?
522
-
523
- post_categories.create(title: category_title)
524
- end
525
- end
526
- end
527
-
528
442
  def create_default_policies
529
443
  Spree::Events.disable do
530
444
  [
@@ -547,42 +461,20 @@ module Spree
547
461
  I18n.t(key, locale: locale, default: I18n.t(key, locale: :en))
548
462
  end
549
463
 
550
- # code is slug, so we don't want to generate new slug when code changes
551
- # we use friendlyId only for history feature
552
- def should_generate_new_friendly_id?
553
- false
554
- end
555
-
556
- def slug_candidates
557
- []
558
- end
559
-
560
- def handle_code_changes
561
- # implement your custom logic here
464
+ def ensure_default_exists_and_is_unique
465
+ if default
466
+ Spree::Store.where.not(id: id).update_all(default: false)
467
+ elsif Spree::Store.where(default: true).count.zero?
468
+ self.default = true
469
+ end
562
470
  end
563
471
 
564
- # This FriendlyId method is overwitten to keep our logic for generating code
565
- # there is no option for own format
566
- def set_code
567
- self.code = if code.present?
568
- code.parameterize.strip
569
- elsif name.present?
570
- name.parameterize.strip
571
- end
572
-
573
- return if self.code.blank?
574
-
575
- # ensure code is unique
576
- self.code = [name.parameterize, rand(9999)].join('-') while Spree::Store.with_deleted.where(code: self.code).exists?
472
+ def should_generate_new_friendly_id?
473
+ false
577
474
  end
578
475
 
579
- # auto-assign internal URL for stores
580
- def set_url
581
- return if url_changed?
582
- return unless code_changed?
583
- return unless Spree.root_domain.present?
584
-
585
- self.url = [code, Spree.root_domain].join('.')
476
+ def set_default_code
477
+ self.code = 'default' if code.blank?
586
478
  end
587
479
  end
588
480
  end
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class StoreCredit < Spree.base_class
3
+ has_prefix_id :credit
4
+
3
5
  include Spree::SingleStoreResource
4
6
  include Spree::Metafields
5
7
  include Spree::Metadata
@@ -52,6 +54,10 @@ module Spree
52
54
  extend Spree::DisplayMoney
53
55
  money_methods :amount, :amount_used, :amount_remaining, :amount_authorized
54
56
 
57
+ def amount=(amount)
58
+ self[:amount] = Spree::LocalizedNumber.parse(amount)
59
+ end
60
+
55
61
  self.whitelisted_ransackable_attributes = %w[user_id created_by_id amount currency type_id]
56
62
  self.whitelisted_ransackable_associations = %w[type user created_by]
57
63
 
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class StoreCreditCategory < Spree.base_class
3
+ has_prefix_id :sccat
4
+
3
5
  validates :name, presence: true
4
6
 
5
7
  before_destroy :validate_not_used
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class StoreCreditEvent < Spree.base_class
3
+ has_prefix_id :scevt
4
+
3
5
  acts_as_paranoid
4
6
 
5
7
  #
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class StoreCreditType < Spree.base_class
3
+ has_prefix_id :sctype
4
+
3
5
  DEFAULT_TYPE_NAME = 'Expiring'.freeze
4
6
  has_many :store_credits, class_name: 'Spree::StoreCredit', foreign_key: 'type_id'
5
7
 
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class StoreProduct < Spree.base_class
3
+ has_prefix_id :sp
4
+
3
5
  self.table_name = 'spree_products_stores'
4
6
 
5
7
  belongs_to :store, class_name: 'Spree::Store', touch: true
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class TaxCategory < Spree.base_class
3
+ has_prefix_id :taxcat
4
+
3
5
  acts_as_paranoid
4
6
  validates :name, presence: true, uniqueness: { case_sensitive: false, scope: spree_base_uniqueness_scope + [:deleted_at] }
5
7
 
@@ -8,15 +10,11 @@ module Spree
8
10
  has_many :variants, dependent: :nullify
9
11
 
10
12
  before_save :set_default_category
11
- after_update :delete_cache
12
- after_create :delete_cache
13
13
 
14
14
  self.whitelisted_ransackable_attributes = %w[name is_default tax_code]
15
15
 
16
16
  def self.default
17
- Rails.cache.fetch('default_tax_category') do
18
- find_by(is_default: true)
19
- end
17
+ find_by(is_default: true)
20
18
  end
21
19
 
22
20
  def set_default_category
@@ -26,11 +24,5 @@ module Spree
26
24
  tax_category.update_columns(is_default: false, updated_at: Time.current)
27
25
  end
28
26
  end
29
-
30
- private
31
-
32
- def delete_cache
33
- Rails.cache.delete('default_tax_category')
34
- end
35
27
  end
36
28
  end
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class TaxRate < Spree.base_class
3
+ has_prefix_id :tax
4
+
3
5
  acts_as_paranoid
4
6
 
5
7
  include Spree::CalculatedAdjustments
@@ -2,6 +2,8 @@ require 'stringex'
2
2
 
3
3
  module Spree
4
4
  class Taxon < Spree.base_class
5
+ has_prefix_id :txn # Spree-specific: taxon
6
+
5
7
  RULES_MATCH_POLICIES = %w[all any].freeze
6
8
  SORT_ORDERS = %w[
7
9
  manual
@@ -36,7 +38,6 @@ module Spree
36
38
  has_one :store, through: :taxonomy
37
39
  has_many :classifications, -> { order(:position) }, dependent: :destroy_async, inverse_of: :taxon
38
40
  has_many :products, through: :classifications
39
- has_one :icon, as: :viewable, dependent: :destroy, class_name: 'Spree::TaxonImage' # TODO: remove this as this is deprecated
40
41
 
41
42
  has_many :prototype_taxons, class_name: 'Spree::PrototypeTaxon', dependent: :destroy
42
43
  has_many :prototypes, through: :prototype_taxons, class_name: 'Spree::Prototype'
@@ -57,7 +58,6 @@ module Spree
57
58
  validates :taxonomy, presence: true
58
59
  validates :permalink, uniqueness: { case_sensitive: false, scope: [:parent_id, :taxonomy_id] }
59
60
  validates :hide_from_nav, inclusion: { in: [true, false] }
60
- validates_associated :icon
61
61
  validate :check_for_root, on: :create
62
62
  validate :parent_belongs_to_same_taxonomy
63
63
  with_options length: { maximum: 255 }, allow_blank: true do
@@ -309,19 +309,6 @@ module Spree
309
309
  end
310
310
  end
311
311
 
312
- # indicate which filters should be used for a taxon
313
- # this method should be customized to your own site
314
- def applicable_filters
315
- Spree::Deprecation.warn('applicable_filters is deprecated and will be removed in Spree 5.5')
316
- fs = []
317
- # fs << ProductFilters.taxons_below(self)
318
- ## unless it's a root taxon? left open for demo purposes
319
-
320
- fs << Spree::Core::ProductFilters.price_filter if Spree::Core::ProductFilters.respond_to?(:price_filter)
321
- fs << Spree::Core::ProductFilters.brand_filter if Spree::Core::ProductFilters.respond_to?(:brand_filter)
322
- fs
323
- end
324
-
325
312
  # Return meta_title if set otherwise generates from taxon name
326
313
  def seo_title
327
314
  meta_title.blank? ? name : meta_title
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class TaxonRule < Spree.base_class
3
+ has_prefix_id :txrule
4
+
3
5
  MATCH_POLICIES = %w[
4
6
  is_equal_to
5
7
  is_not_equal_to
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class Taxonomy < Spree.base_class
3
+ has_prefix_id :txnmy # Spree-specific: taxonomy
4
+
3
5
  include Spree::TranslatableResource
4
6
  include Spree::Metafields
5
7
  include Spree::Metadata