spree_core 4.4.0 → 4.6.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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/option_values/find_available.rb +1 -1
  3. data/app/finders/spree/product_properties/find_available.rb +1 -1
  4. data/app/finders/spree/products/find.rb +21 -15
  5. data/app/finders/spree/taxons/find.rb +11 -8
  6. data/app/helpers/spree/base_helper.rb +14 -11
  7. data/app/helpers/spree/locale_helper.rb +6 -2
  8. data/app/helpers/spree/products_helper.rb +9 -4
  9. data/app/jobs/spree/variants/remove_from_incomplete_orders_job.rb +9 -0
  10. data/app/jobs/spree/variants/remove_line_item_job.rb +9 -0
  11. data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
  12. data/app/models/concerns/spree/display_link.rb +17 -29
  13. data/app/models/concerns/spree/image_methods.rb +21 -9
  14. data/app/models/concerns/spree/metadata.rb +2 -2
  15. data/app/models/concerns/spree/product_scopes.rb +34 -28
  16. data/app/models/concerns/spree/translatable_resource.rb +25 -0
  17. data/app/models/concerns/spree/translatable_resource_scopes.rb +24 -0
  18. data/app/models/concerns/spree/translatable_resource_slug.rb +17 -0
  19. data/app/models/spree/address.rb +7 -1
  20. data/app/models/spree/asset/support/active_storage.rb +3 -2
  21. data/app/models/spree/asset.rb +3 -0
  22. data/app/models/spree/base.rb +1 -0
  23. data/app/models/spree/cms_page.rb +4 -0
  24. data/app/models/spree/cms_section.rb +12 -12
  25. data/app/models/spree/cms_section_image.rb +15 -0
  26. data/app/models/spree/cms_section_image_one.rb +4 -0
  27. data/app/models/spree/cms_section_image_three.rb +4 -0
  28. data/app/models/spree/cms_section_image_two.rb +4 -0
  29. data/app/models/spree/credit_card.rb +10 -4
  30. data/app/models/spree/customer_return.rb +3 -0
  31. data/app/models/spree/data_feed/google.rb +15 -0
  32. data/app/models/spree/data_feed.rb +40 -0
  33. data/app/models/spree/digital.rb +4 -0
  34. data/app/models/spree/digital_link.rb +7 -0
  35. data/app/models/spree/fulfilment_changer.rb +1 -1
  36. data/app/models/spree/gateway/bogus.rb +1 -1
  37. data/app/models/spree/icon.rb +5 -1
  38. data/app/models/spree/image/configuration/active_storage.rb +5 -1
  39. data/app/models/spree/image.rb +3 -3
  40. data/app/models/spree/inventory_unit.rb +5 -2
  41. data/app/models/spree/legacy_user.rb +1 -2
  42. data/app/models/spree/line_item.rb +4 -1
  43. data/app/models/spree/linkable/homepage.rb +3 -0
  44. data/app/models/spree/linkable/uri.rb +3 -0
  45. data/app/models/spree/log_entry.rb +9 -1
  46. data/app/models/spree/menu.rb +3 -0
  47. data/app/models/spree/menu_item.rb +7 -11
  48. data/app/models/spree/option_type.rb +8 -0
  49. data/app/models/spree/option_value.rb +9 -0
  50. data/app/models/spree/order/address_book.rb +1 -0
  51. data/app/models/spree/order.rb +12 -3
  52. data/app/models/spree/order_merger.rb +1 -1
  53. data/app/models/spree/payment/processing.rb +1 -1
  54. data/app/models/spree/payment.rb +7 -1
  55. data/app/models/spree/payment_capture_event.rb +4 -0
  56. data/app/models/spree/payment_method/store_credit.rb +1 -1
  57. data/app/models/spree/payment_method.rb +3 -0
  58. data/app/models/spree/payment_source.rb +10 -0
  59. data/app/models/spree/preference.rb +4 -0
  60. data/app/models/spree/price.rb +3 -0
  61. data/app/models/spree/product.rb +97 -24
  62. data/app/models/spree/product_property.rb +13 -3
  63. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  64. data/app/models/spree/promotion.rb +6 -0
  65. data/app/models/spree/promotion_rule.rb +1 -1
  66. data/app/models/spree/promotion_rule_user.rb +1 -1
  67. data/app/models/spree/property.rb +10 -1
  68. data/app/models/spree/prototype.rb +3 -0
  69. data/app/models/spree/refund.rb +8 -0
  70. data/app/models/spree/reimbursement.rb +3 -0
  71. data/app/models/spree/return_authorization.rb +3 -0
  72. data/app/models/spree/return_item.rb +4 -0
  73. data/app/models/spree/role.rb +1 -1
  74. data/app/models/spree/role_user.rb +1 -1
  75. data/app/models/spree/shipment.rb +8 -1
  76. data/app/models/spree/shipping_category.rb +3 -0
  77. data/app/models/spree/shipping_method.rb +6 -0
  78. data/app/models/spree/state_change.rb +1 -1
  79. data/app/models/spree/stock/availability_validator.rb +9 -3
  80. data/app/models/spree/stock/content_item.rb +1 -1
  81. data/app/models/spree/stock/quantifier.rb +1 -1
  82. data/app/models/spree/stock_item.rb +5 -0
  83. data/app/models/spree/stock_location.rb +19 -5
  84. data/app/models/spree/stock_movement.rb +4 -0
  85. data/app/models/spree/stock_transfer.rb +3 -0
  86. data/app/models/spree/store.rb +39 -15
  87. data/app/models/spree/store_credit.rb +4 -1
  88. data/app/models/spree/store_favicon_image.rb +17 -0
  89. data/app/models/spree/store_logo.rb +9 -0
  90. data/app/models/spree/store_mailer_logo.rb +13 -0
  91. data/app/models/spree/tax_category.rb +6 -0
  92. data/app/models/spree/tax_rate.rb +6 -1
  93. data/app/models/spree/taxon.rb +26 -7
  94. data/app/models/spree/taxon_image/configuration/active_storage.rb +5 -1
  95. data/app/models/spree/taxon_image.rb +3 -2
  96. data/app/models/spree/taxonomy.rb +8 -1
  97. data/app/models/spree/variant.rb +47 -21
  98. data/app/models/spree/wished_item.rb +4 -0
  99. data/app/models/spree/wishlist.rb +4 -1
  100. data/app/models/spree/zone.rb +3 -0
  101. data/app/services/spree/addresses/create.rb +1 -1
  102. data/app/services/spree/addresses/update.rb +7 -2
  103. data/app/services/spree/cart/remove_line_item.rb +1 -0
  104. data/app/services/spree/data_feeds/google/optional_attributes.rb +23 -0
  105. data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +21 -0
  106. data/app/services/spree/data_feeds/google/products_list.rb +14 -0
  107. data/app/services/spree/data_feeds/google/required_attributes.rb +67 -0
  108. data/app/services/spree/data_feeds/google/rss.rb +107 -0
  109. data/app/services/spree/variants/remove_line_items.rb +15 -0
  110. data/app/sorters/spree/products/sort.rb +23 -0
  111. data/brakeman.ignore +326 -18
  112. data/config/initializers/friendly_id.rb +2 -0
  113. data/config/initializers/mobility.rb +18 -0
  114. data/config/locales/en.yml +6 -2
  115. data/config/routes.rb +43 -0
  116. data/db/migrate/20211201202851_update_linkable_resource_types.rb +10 -0
  117. data/db/migrate/20211203082008_add_settings_to_payment_methods.rb +11 -0
  118. data/db/migrate/20211229162122_disable_propagate_all_variants_by_default.rb +5 -0
  119. data/db/migrate/20220103082046_add_status_and_make_active_at_to_spree_products.rb +7 -0
  120. data/db/migrate/20220106230929_add_internal_note_to_spree_orders.rb +5 -0
  121. data/db/migrate/20220113052823_create_payment_sources.rb +22 -0
  122. data/db/migrate/20220117100333_add_make_active_at_to_spree_products.rb +17 -0
  123. data/db/migrate/20220120092821_add_metadata_to_spree_tax_rates.rb +13 -0
  124. data/db/migrate/20220201103922_add_first_name_and_last_name_to_spree_users.rb +9 -0
  125. data/db/migrate/20220222083546_add_barcode_to_spree_variants.rb +6 -0
  126. data/db/migrate/20220329113557_fix_cms_pages_unique_indexes.rb +8 -0
  127. data/db/migrate/20220613133029_add_metadata_to_spree_stock_items.rb +13 -0
  128. data/db/migrate/20220706112554_create_product_name_and_description_translations_for_mobility_table_backend.rb +27 -0
  129. data/db/migrate/20220715083542_create_spree_product_translations_for_mobility.rb +7 -0
  130. data/db/migrate/20220715120222_change_product_name_null_to_true.rb +5 -0
  131. data/db/migrate/20220718100743_create_spree_taxon_name_and_description_translations_for_mobility_table_backend.rb +27 -0
  132. data/db/migrate/20220718100948_change_taxon_name_null_to_true.rb +5 -0
  133. data/db/migrate/20220802070609_add_locale_to_friendly_id_slugs.rb +11 -0
  134. data/db/migrate/20220802073225_create_spree_product_slug_translations_for_mobility_table_backend.rb +5 -0
  135. data/db/migrate/20220804073928_transfer_data_to_translatable_tables.rb +66 -0
  136. data/db/migrate/20221215151408_add_selected_locale_to_spree_users.rb +8 -0
  137. data/db/migrate/20221219123957_add_deleted_at_to_product_translations.rb +6 -0
  138. data/db/migrate/20221220133432_add_uniqueness_constraint_to_product_translations.rb +5 -0
  139. data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +14 -0
  140. data/db/migrate/20230103144439_create_option_type_translations.rb +26 -0
  141. data/db/migrate/20230103151034_create_option_value_translations.rb +26 -0
  142. data/db/migrate/20230109084253_create_product_property_translations.rb +25 -0
  143. data/db/migrate/20230109094907_transfer_options_data_to_translatable_tables.rb +58 -0
  144. data/db/migrate/20230109105943_create_property_translations.rb +26 -0
  145. data/db/migrate/20230109110840_transfer_property_data_to_translatable_tables.rb +59 -0
  146. data/db/migrate/20230110142344_backfill_friendly_id_slug_locale.rb +15 -0
  147. data/db/migrate/20230111121534_add_additional_taxon_translation_fields.rb +8 -0
  148. data/db/migrate/20230111122511_transfer_product_and_taxon_data_to_translatable_tables.rb +82 -0
  149. data/db/migrate/20230117115531_create_taxonomy_translations.rb +24 -0
  150. data/db/migrate/20230117120430_allow_null_taxonomy_name.rb +5 -0
  151. data/db/migrate/20230117121303_transfer_taxonomy_data_to_translatable_tables.rb +11 -0
  152. data/db/migrate/20230210142732_create_store_translations.rb +50 -0
  153. data/db/migrate/20230210142849_transfer_store_data_to_translatable_tables.rb +11 -0
  154. data/db/migrate/20230210230434_add_deleted_at_to_store_translations.rb +6 -0
  155. data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +5 -0
  156. data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +7 -0
  157. data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +5 -0
  158. data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +5 -0
  159. data/db/migrate/20230514162157_add_index_on_locale_and_permalink_to_spree_taxons.rb +5 -0
  160. data/lib/friendly_id/paranoia.rb +4 -0
  161. data/lib/generators/spree/dummy/dummy_generator.rb +13 -2
  162. data/lib/generators/spree/dummy/templates/package.json +12 -0
  163. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  164. data/lib/spree/core/configuration.rb +91 -0
  165. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  166. data/lib/spree/core/controller_helpers/currency.rb +7 -5
  167. data/lib/spree/core/controller_helpers/locale.rb +34 -8
  168. data/lib/spree/core/controller_helpers/order.rb +4 -2
  169. data/lib/spree/core/controller_helpers/search.rb +1 -1
  170. data/lib/spree/core/controller_helpers/store.rb +5 -3
  171. data/lib/spree/core/dependencies.rb +106 -0
  172. data/lib/spree/core/dependencies_helper.rb +19 -0
  173. data/lib/spree/core/engine.rb +53 -38
  174. data/{app/models/spree → lib/spree/core}/preferences/configuration.rb +3 -0
  175. data/{app/models/spree → lib/spree/core}/preferences/preferable.rb +3 -0
  176. data/lib/spree/core/product_duplicator.rb +1 -1
  177. data/lib/spree/core/product_filters.rb +7 -4
  178. data/lib/spree/core/search/base.rb +10 -6
  179. data/lib/spree/core/version.rb +1 -1
  180. data/lib/spree/core.rb +27 -5
  181. data/lib/spree/permitted_attributes.rb +9 -7
  182. data/lib/spree/testing_support/common_rake.rb +1 -0
  183. data/lib/spree/testing_support/factories/favicon_image_factory.rb +9 -0
  184. data/lib/spree/testing_support/factories/google_data_feed_factory.rb +8 -0
  185. data/lib/spree/testing_support/factories/icon_factory.rb +3 -1
  186. data/lib/spree/testing_support/factories/image_factory.rb +3 -1
  187. data/lib/spree/testing_support/factories/menu_item_factory.rb +1 -1
  188. data/lib/spree/testing_support/factories/order_factory.rb +2 -1
  189. data/lib/spree/testing_support/factories/product_factory.rb +12 -1
  190. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -0
  191. data/lib/spree/testing_support/factories/product_translation_factory.rb +6 -0
  192. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  193. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  194. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  195. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  196. data/lib/spree/testing_support/factories/stock_location_factory.rb +3 -2
  197. data/lib/spree/testing_support/factories/store_factory.rb +2 -1
  198. data/lib/spree/testing_support/factories/taxon_image_factory.rb +3 -1
  199. data/lib/spree/testing_support/factories/user_factory.rb +4 -0
  200. data/lib/spree/testing_support/factories/variant_factory.rb +8 -0
  201. data/lib/spree/translation_migrations.rb +40 -0
  202. data/lib/spree_core.rb +2 -1
  203. data/lib/tasks/core.rake +12 -0
  204. data/spree_core.gemspec +5 -3
  205. metadata +152 -52
  206. data/app/models/friendly_id/slug_decorator.rb +0 -9
  207. data/app/models/spree/app_configuration.rb +0 -86
  208. data/lib/friendly_id/slug_rails5_patch.rb +0 -11
  209. data/lib/spree/core/app_dependencies.rb +0 -126
  210. /data/{app/models/spree → lib/spree/core}/preferences/preferable_class_methods.rb +0 -0
  211. /data/{app/models/spree → lib/spree/core}/preferences/scoped_store.rb +0 -0
  212. /data/{app/models/spree → lib/spree/core}/preferences/store.rb +0 -0
@@ -0,0 +1,82 @@
1
+ class TransferProductAndTaxonDataToTranslatableTables < ActiveRecord::Migration[6.1]
2
+ DEFAULT_LOCALE = 'en'
3
+ PRODUCTS_TABLE = 'spree_products'
4
+ PRODUCT_TRANSLATIONS_TABLE = 'spree_product_translations'
5
+ TAXONS_TABLE = 'spree_taxons'
6
+ TAXON_TRANSLATIONS_TABLE = 'spree_taxon_translations'
7
+
8
+ def up
9
+ # Only transfer data if translation tables are being newly created / no translations exist
10
+ # Otherwise, assume translation data is already in place from spree_globalize
11
+
12
+ # Products
13
+ if not Spree::Product::Translation.exists?
14
+ ActiveRecord::Base.connection.execute("
15
+ INSERT INTO #{PRODUCT_TRANSLATIONS_TABLE} (name, description, locale, spree_product_id, created_at, updated_at, meta_description, meta_keywords, meta_title, slug)
16
+ SELECT name, description, '#{DEFAULT_LOCALE}' as locale, id, created_at, updated_at, meta_description, meta_keywords, meta_title, slug FROM #{PRODUCTS_TABLE};
17
+ ")
18
+ ActiveRecord::Base.connection.execute("
19
+ UPDATE #{PRODUCTS_TABLE}
20
+ SET name=null, description=null, meta_description=null, meta_keywords=null, meta_title=null, slug=null;
21
+ ")
22
+ end
23
+
24
+ # Taxons
25
+ if not Spree::Taxon::Translation.exists?
26
+ ActiveRecord::Base.connection.execute("
27
+ INSERT INTO #{TAXON_TRANSLATIONS_TABLE} (name, description, meta_title, meta_description, meta_keywords, permalink, locale, spree_taxon_id, created_at, updated_at)
28
+ SELECT name, description, meta_title, meta_description, meta_keywords, permalink, '#{DEFAULT_LOCALE}' as locale, id, created_at, updated_at FROM #{TAXONS_TABLE};
29
+ ")
30
+ ActiveRecord::Base.connection.execute("
31
+ UPDATE #{TAXONS_TABLE}
32
+ SET name=null, description=null, meta_title=null, meta_description=null, meta_keywords=null, permalink=null;
33
+ ")
34
+ end
35
+ end
36
+
37
+ def down
38
+ ActiveRecord::Base.connection.execute("
39
+ UPDATE #{PRODUCTS_TABLE} as products
40
+ SET (name,
41
+ description,
42
+ meta_description,
43
+ meta_keywords,
44
+ meta_title,
45
+ slug) =
46
+ (t_products.name,
47
+ t_products.description,
48
+ t_products.meta_description,
49
+ t_products.meta_keywords,
50
+ t_products.meta_title,
51
+ t_products.slug)
52
+ FROM #{PRODUCT_TRANSLATIONS_TABLE} AS t_products
53
+ WHERE t_products.spree_product_id = products.id
54
+ ")
55
+
56
+ ActiveRecord::Base.connection.execute("
57
+ TRUNCATE TABLE #{PRODUCT_TRANSLATIONS_TABLE}
58
+ ")
59
+
60
+ ActiveRecord::Base.connection.execute("
61
+ UPDATE #{TAXONS_TABLE} as taxons
62
+ SET (name,
63
+ description,
64
+ meta_title,
65
+ meta_description,
66
+ meta_keywords,
67
+ permalink) =
68
+ (t_taxons.name,
69
+ t_taxons.description,
70
+ t_taxons.meta_title,
71
+ t_taxons.meta_description,
72
+ t_taxons.meta_keywords,
73
+ t_taxons.permalink)
74
+ FROM #{TAXON_TRANSLATIONS_TABLE} AS t_taxons
75
+ WHERE t_taxons.spree_taxon_id = taxons.id
76
+ ")
77
+
78
+ ActiveRecord::Base.connection.execute("
79
+ TRUNCATE TABLE #{TAXON_TRANSLATIONS_TABLE}
80
+ ")
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ class CreateTaxonomyTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists?('spree_taxonomy_translations')
4
+ # manually check for index since Rails if_exists does not always work correctly
5
+ if ActiveRecord::Migration.connection.index_exists?(:spree_taxonomy_translations, :spree_taxonomy_id)
6
+ remove_index :spree_taxonomy_translations, column: :spree_taxonomy_id, if_exists: true
7
+ end
8
+ else
9
+ create_table :spree_taxonomy_translations do |t|
10
+ # Translated attribute(s)
11
+ t.string :name
12
+
13
+ t.string :locale, null: false
14
+ t.references :spree_taxonomy, null: false, foreign_key: true, index: false
15
+
16
+ t.timestamps null: false
17
+ end
18
+
19
+ add_index :spree_taxonomy_translations, :locale, name: :index_spree_taxonomy_translations_on_locale
20
+ end
21
+
22
+ add_index :spree_taxonomy_translations, [:spree_taxonomy_id, :locale], name: :index_spree_taxonomy_translations_on_spree_taxonomy_id_locale, unique: true
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ class AllowNullTaxonomyName < ActiveRecord::Migration[6.1]
2
+ def change
3
+ change_column_null :spree_taxonomies, :name, true
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class TransferTaxonomyDataToTranslatableTables < ActiveRecord::Migration[6.1]
2
+ TRANSLATION_MIGRATION = Spree::TranslationMigrations.new(Spree::Taxonomy, 'en')
3
+
4
+ def up
5
+ TRANSLATION_MIGRATION.transfer_translation_data
6
+ end
7
+
8
+ def down
9
+ TRANSLATION_MIGRATION.revert_translation_data_transfer
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ class CreateStoreTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists?('spree_store_translations')
4
+ add_new_translation_columns_to_globalize_table
5
+ else
6
+ create_table :spree_store_translations do |t|
7
+ # Translated attribute(s)
8
+ t.string :name
9
+ t.text :meta_description
10
+ t.text :meta_keywords
11
+ t.string :seo_title
12
+ t.string :facebook
13
+ t.string :twitter
14
+ t.string :instagram
15
+ t.string :customer_support_email
16
+ t.text :description
17
+ t.text :address
18
+ t.string :contact_phone
19
+ t.string :new_order_notifications_email
20
+
21
+ t.string :locale, null: false
22
+ t.references :spree_store, null: false, foreign_key: true, index: false
23
+
24
+ t.timestamps null: false
25
+ end
26
+
27
+ add_index :spree_store_translations, :locale, name: :index_spree_store_translations_on_locale
28
+ end
29
+
30
+ add_index :spree_store_translations, [:spree_store_id, :locale], name: :index_spree_store_translations_on_spree_store_id_locale, unique: true
31
+ end
32
+
33
+ private
34
+
35
+ def add_new_translation_columns_to_globalize_table
36
+ # manually check for index since Rails if_exists does not always work correctly
37
+ if ActiveRecord::Migration.connection.index_exists?(:spree_store_translations, :spree_store_id)
38
+ remove_index :spree_store_translations, column: :spree_store_id, if_exists: true
39
+ end
40
+
41
+ add_column :spree_store_translations, :facebook, :string
42
+ add_column :spree_store_translations, :twitter, :string
43
+ add_column :spree_store_translations, :instagram, :string
44
+ add_column :spree_store_translations, :customer_support_email, :string
45
+ add_column :spree_store_translations, :description, :text
46
+ add_column :spree_store_translations, :address, :text
47
+ add_column :spree_store_translations, :contact_phone, :string
48
+ add_column :spree_store_translations, :new_order_notifications_email, :string
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ class TransferStoreDataToTranslatableTables < ActiveRecord::Migration[6.1]
2
+ TRANSLATION_MIGRATION = Spree::TranslationMigrations.new(Spree::Store, 'en')
3
+
4
+ def up
5
+ TRANSLATION_MIGRATION.transfer_translation_data
6
+ end
7
+
8
+ def down
9
+ TRANSLATION_MIGRATION.revert_translation_data_transfer
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class AddDeletedAtToStoreTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :spree_store_translations, :deleted_at, :datetime
4
+ add_index :spree_store_translations, :deleted_at
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class RenameDataFeedSettingsTable < ActiveRecord::Migration[6.1]
2
+ def change
3
+ rename_table :spree_data_feed_settings, :spree_data_feeds
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class RenameDataFeedTableColumns < ActiveRecord::Migration[6.1]
2
+ def change
3
+ rename_column :spree_data_feeds, :spree_store_id, :store_id
4
+ rename_column :spree_data_feeds, :enabled, :active
5
+ rename_column :spree_data_feeds, :uuid, :slug
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddIndexesToDataFeedsTable < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_index :spree_data_feeds, [:store_id, :slug, :provider]
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RenameDataFeedsColumnProviderToType < ActiveRecord::Migration[6.1]
2
+ def change
3
+ rename_column :spree_data_feeds, :provider, :type
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIndexOnLocaleAndPermalinkToSpreeTaxons < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_index :spree_taxon_translations, [:locale, :permalink], unique: true, name: 'unique_permalink_per_locale', if_not_exists: true
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ require 'friendly_id'
2
+ require 'paranoia'
3
+
4
+ FriendlyId::Slug.acts_as_paranoid
@@ -38,13 +38,12 @@ module Spree
38
38
  opts[:skip_rc] = true
39
39
  opts[:skip_spring] = true
40
40
  opts[:skip_test] = true
41
- opts[:skip_yarn] = true
42
- opts[:skip_javascript] = true
43
41
  opts[:skip_bootsnap] = true
44
42
 
45
43
  puts 'Generating dummy Rails application...'
46
44
  invoke Rails::Generators::AppGenerator,
47
45
  [File.expand_path(dummy_path, destination_root)], opts
46
+ inject_yaml_permitted_classes
48
47
  end
49
48
 
50
49
  def test_dummy_config
@@ -58,6 +57,10 @@ module Spree
58
57
  template 'rails/test.rb', "#{dummy_path}/config/environments/test.rb", force: true
59
58
  template 'rails/script/rails', "#{dummy_path}/spec/dummy/script/rails", force: true
60
59
  template 'initializers/devise.rb', "#{dummy_path}/config/initializers/devise.rb", force: true
60
+
61
+ if lib_name == 'spree/backend'
62
+ template 'package.json', "#{dummy_path}/package.json", force: true
63
+ end
61
64
  end
62
65
 
63
66
  def test_dummy_inject_extension_requirements
@@ -114,6 +117,14 @@ end
114
117
  ], before: /require '#{@lib_name}'/, verbose: true
115
118
  end
116
119
 
120
+ def inject_yaml_permitted_classes
121
+ inside dummy_path do
122
+ inject_into_file 'config/application.rb', %Q[
123
+ config.active_record.yaml_column_permitted_classes = [Symbol, BigDecimal, ActiveSupport::HashWithIndifferentAccess]
124
+ ], after: /config\.load_defaults.*$/, verbose: true
125
+ end
126
+ end
127
+
117
128
  def dummy_path
118
129
  ENV['DUMMY_PATH'] || 'spec/dummy'
119
130
  end
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "app",
3
+ "private": "true",
4
+ "dependencies": {
5
+ "@hotwired/turbo-rails": "^7.2.0",
6
+ "@spree/dashboard": "^0.2.1",
7
+ "esbuild": "^0.15.10"
8
+ },
9
+ "scripts": {
10
+ "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds"
11
+ }
12
+ }
@@ -37,4 +37,6 @@ Dummy::Application.configure do
37
37
  config.active_job.queue_adapter = :test
38
38
 
39
39
  config.cache_store = :redis_cache_store
40
+
41
+ routes.default_url_options = { host: 'localhost', port: 3000 }
40
42
  end
@@ -0,0 +1,91 @@
1
+ # This is the primary location for defining spree preferences
2
+ #
3
+ # The expectation is that this is created once and stored in
4
+ # the spree environment
5
+ #
6
+ # setters:
7
+ # a.color = :blue
8
+ # a[:color] = :blue
9
+ # a.set :color = :blue
10
+ # a.preferred_color = :blue
11
+ #
12
+ # getters:
13
+ # a.color
14
+ # a[:color]
15
+ # a.get :color
16
+ # a.preferred_color
17
+ #
18
+ require 'spree/core/search/base'
19
+ require 'spree/core/preferences/configuration'
20
+
21
+ module Spree
22
+ module Core
23
+ class Configuration < Preferences::Configuration
24
+ # Alphabetized to more easily lookup particular preferences
25
+ preference :address_requires_state, :boolean, default: true # should state/state_name be required
26
+ preference :address_requires_phone, :boolean, default: true # Determines whether we require phone in address
27
+ preference :admin_path, :string, deprecated: true
28
+ preference :admin_products_per_page, :integer, deprecated: true
29
+ preference :admin_orders_per_page, :integer, deprecated: true
30
+ preference :admin_properties_per_page, :integer, deprecated: true
31
+ preference :admin_promotions_per_page, :integer, deprecated: true
32
+ preference :admin_customer_returns_per_page, :integer, deprecated: true
33
+ preference :admin_users_per_page, :integer, deprecated: true
34
+ preference :admin_show_version, :boolean, deprecated: true
35
+ preference :allow_checkout_on_gateway_error, :boolean, default: false
36
+ preference :allow_guest_checkout, :boolean, default: true
37
+ preference :alternative_shipping_phone, :boolean, default: false # Request extra phone for ship addr
38
+ preference :always_include_confirm_step, :boolean, default: false # Ensures confirmation step is always in checkout_progress bar, but does not force a confirm step if your payment methods do not support it.
39
+ preference :always_put_site_name_in_title, :boolean, deprecated: true
40
+ preference :title_site_name_separator, :string, deprecated: true
41
+ preference :auto_capture, :boolean, default: false # automatically capture the credit card (as opposed to just authorize and capture later)
42
+ preference :auto_capture_on_dispatch, :boolean, default: false # Captures payment for each shipment in Shipment#after_ship callback, and makes Shipment.ready when payment authorized.
43
+ preference :binary_inventory_cache, :boolean, default: false # only invalidate product cache when a stock item changes whether it is in_stock
44
+ preference :checkout_zone, :string, default: nil, deprecated: true # replace with the name of a zone if you would like to limit the countries
45
+ preference :company, :boolean, default: false # Request company field for billing and shipping addr
46
+ preference :currency, :string, default: 'USD', deprecated: true
47
+ preference :default_country_id, :integer, deprecated: true
48
+ preference :disable_sku_validation, :boolean, default: false # when turned off disables the built-in SKU uniqueness validation
49
+ preference :disable_store_presence_validation, :boolean, default: false # when turned off disables Store presence validation for Products and Payment Methods
50
+ preference :expedited_exchanges, :boolean, default: false # NOTE this requires payment profiles to be supported on your gateway of choice as well as a delayed job handler to be configured with activejob. kicks off an exchange shipment upon return authorization save. charge customer if they do not return items within timely manner.
51
+ preference :expedited_exchanges_days_window, :integer, default: 14 # the amount of days the customer has to return their item after the expedited exchange is shipped in order to avoid being charged
52
+ preference :layout, :string, deprecated: 'Please use Spree::Frontend::Config[:layout] instead'
53
+ preference :logo, :string, deprecated: true
54
+ preference :mailer_logo, :string, deprecated: true
55
+ preference :max_level_in_taxons_menu, :integer, deprecated: true
56
+ preference :products_per_page, :integer, default: 12
57
+ preference :require_master_price, :boolean, default: true
58
+ preference :restock_inventory, :boolean, default: true # Determines if a return item is restocked automatically once it has been received
59
+ preference :return_eligibility_number_of_days, :integer, default: 365
60
+ preference :send_core_emails, :boolean, default: true # Default mail headers settings
61
+ preference :shipping_instructions, :boolean, deprecated: true
62
+ preference :show_only_complete_orders_by_default, :boolean, deprecated: true
63
+ preference :show_variant_full_price, :boolean, default: false # Displays variant full price or difference with product price. Default false to be compatible with older behavior
64
+ preference :show_products_without_price, :boolean, default: false
65
+ preference :show_raw_product_description, :boolean, deprecated: true
66
+ preference :tax_using_ship_address, :boolean, default: true
67
+ preference :track_inventory_levels, :boolean, default: true # Determines whether to track on_hand values for variants / products.
68
+ preference :use_user_locale, :boolean, default: true
69
+
70
+ # Store credits configurations
71
+ preference :non_expiring_credit_types, :array, default: []
72
+ preference :credit_to_new_allocation, :boolean, default: false
73
+
74
+ # Multi store configurations
75
+ preference :show_store_selector, :boolean, deprecated: true
76
+
77
+ # searcher_class allows spree extension writers to provide their own Search class
78
+ def searcher_class
79
+ ActiveSupport::Deprecation.warn('`Spree::Config.searcher_class` is deprecated and will be removed in Spree v5, please use `Spree.searcher_class` instead.')
80
+ @searcher_class ||= Spree.searcher_class
81
+ end
82
+
83
+ # Sets the path used for products, taxons and pages.
84
+ preference :storefront_products_path, :string, default: 'products'
85
+ preference :storefront_taxons_path, :string, default: 't'
86
+ preference :storefront_pages_path, :string, default: 'pages'
87
+
88
+ attr_writer :searcher_class
89
+ end
90
+ end
91
+ end
@@ -7,7 +7,9 @@ module Spree
7
7
 
8
8
  included do
9
9
  before_action :set_token
10
- helper_method :try_spree_current_user
10
+ if defined?(helper_method)
11
+ helper_method :try_spree_current_user
12
+ end
11
13
 
12
14
  rescue_from CanCan::AccessDenied do |_exception|
13
15
  redirect_unauthorized_access
@@ -5,11 +5,13 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- helper_method :supported_currencies
9
- helper_method :supported_currencies_for_all_stores
10
- helper_method :current_currency
11
- helper_method :supported_currency?
12
- helper_method :currency_param
8
+ if defined?(helper_method)
9
+ helper_method :supported_currencies
10
+ helper_method :supported_currencies_for_all_stores
11
+ helper_method :current_currency
12
+ helper_method :supported_currency?
13
+ helper_method :currency_param
14
+ end
13
15
  end
14
16
 
15
17
  def current_currency
@@ -7,12 +7,14 @@ module Spree
7
7
  included do
8
8
  before_action :set_locale
9
9
 
10
- helper_method :supported_locales
11
- helper_method :supported_locales_for_all_stores
12
- helper_method :current_locale
13
- helper_method :supported_locale?
14
- helper_method :available_locales
15
- helper_method :locale_param
10
+ if defined?(helper_method)
11
+ helper_method :supported_locales
12
+ helper_method :supported_locales_for_all_stores
13
+ helper_method :current_locale
14
+ helper_method :supported_locale?
15
+ helper_method :available_locales
16
+ helper_method :locale_param
17
+ end
16
18
  end
17
19
 
18
20
  def set_locale
@@ -20,15 +22,29 @@ module Spree
20
22
  end
21
23
 
22
24
  def current_locale
23
- @current_locale ||= if params[:locale].present? && supported_locale?(params[:locale])
25
+ @current_locale ||= if user_locale?
26
+ try_spree_current_user.selected_locale
27
+ elsif params_locale?
24
28
  params[:locale]
25
- elsif respond_to?(:config_locale, true) && config_locale.present?
29
+ elsif config_locale?
26
30
  config_locale
27
31
  else
28
32
  current_store&.default_locale || Rails.application.config.i18n.default_locale || I18n.default_locale
29
33
  end
30
34
  end
31
35
 
36
+ def config_locale?
37
+ respond_to?(:config_locale, true) && config_locale.present?
38
+ end
39
+
40
+ def params_locale?
41
+ params[:locale].present? && supported_locale?(params[:locale])
42
+ end
43
+
44
+ def user_locale?
45
+ Spree::Config.use_user_locale && try_spree_current_user && supported_locale?(try_spree_current_user.selected_locale)
46
+ end
47
+
32
48
  def supported_locales
33
49
  @supported_locales ||= current_store&.supported_locales_list
34
50
  end
@@ -52,6 +68,16 @@ module Spree
52
68
 
53
69
  I18n.locale.to_s
54
70
  end
71
+
72
+ def find_with_fallback_default_locale(&block)
73
+ result = begin
74
+ block.call
75
+ rescue ActiveRecord::RecordNotFound => _e
76
+ nil
77
+ end
78
+
79
+ result || Mobility.with_locale(current_store.default_locale) { block.call }
80
+ end
55
81
  end
56
82
  end
57
83
  end
@@ -5,8 +5,10 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- helper_method :current_order
9
- helper_method :simple_current_order
8
+ if defined?(helper_method)
9
+ helper_method :current_order
10
+ helper_method :simple_current_order
11
+ end
10
12
  end
11
13
 
12
14
  # Used in the link_to_cart helper.
@@ -3,7 +3,7 @@ module Spree
3
3
  module ControllerHelpers
4
4
  module Search
5
5
  def build_searcher(params)
6
- Spree::Config.searcher_class.new(params).tap do |searcher|
6
+ Spree.searcher_class.new(params).tap do |searcher|
7
7
  searcher.current_user = try_spree_current_user
8
8
  searcher.current_currency = current_currency&.upcase
9
9
  searcher.current_store = current_store
@@ -5,9 +5,11 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- helper_method :current_store
9
- helper_method :current_price_options
10
- helper_method :available_menus
8
+ if defined?(helper_method)
9
+ helper_method :current_store
10
+ helper_method :current_price_options
11
+ helper_method :available_menus
12
+ end
11
13
  end
12
14
 
13
15
  def current_store
@@ -0,0 +1,106 @@
1
+ require_relative 'dependencies_helper'
2
+
3
+ module Spree
4
+ module Core
5
+ class Dependencies
6
+ INJECTION_POINTS_WITH_DEFAULTS = {
7
+ # ability
8
+ ability_class: 'Spree::Ability',
9
+
10
+ # cart
11
+ cart_compare_line_items_service: 'Spree::CompareLineItems',
12
+ cart_create_service: 'Spree::Cart::Create',
13
+ cart_add_item_service: 'Spree::Cart::AddItem',
14
+ cart_update_service: 'Spree::Cart::Update',
15
+ cart_recalculate_service: 'Spree::Cart::Recalculate',
16
+ cart_remove_item_service: 'Spree::Cart::RemoveItem',
17
+ cart_remove_line_item_service: 'Spree::Cart::RemoveLineItem',
18
+ cart_set_item_quantity_service: 'Spree::Cart::SetQuantity',
19
+ cart_estimate_shipping_rates_service: 'Spree::Cart::EstimateShippingRates',
20
+ cart_empty_service: 'Spree::Cart::Empty',
21
+ cart_destroy_service: 'Spree::Cart::Destroy',
22
+ cart_associate_service: 'Spree::Cart::Associate',
23
+ cart_change_currency_service: 'Spree::Cart::ChangeCurrency',
24
+
25
+ # checkout
26
+ checkout_next_service: 'Spree::Checkout::Next',
27
+ checkout_advance_service: 'Spree::Checkout::Advance',
28
+ checkout_update_service: 'Spree::Checkout::Update',
29
+ checkout_complete_service: 'Spree::Checkout::Complete',
30
+ checkout_add_store_credit_service: 'Spree::Checkout::AddStoreCredit',
31
+ checkout_remove_store_credit_service: 'Spree::Checkout::RemoveStoreCredit',
32
+ checkout_get_shipping_rates_service: 'Spree::Checkout::GetShippingRates',
33
+ checkout_select_shipping_method_service: 'Spree::Checkout::SelectShippingMethod',
34
+
35
+ # order
36
+ order_approve_service: 'Spree::Orders::Approve',
37
+ order_cancel_service: 'Spree::Orders::Cancel',
38
+
39
+ # shipment
40
+ shipment_change_state_service: 'Spree::Shipments::ChangeState',
41
+ shipment_create_service: 'Spree::Shipments::Create',
42
+ shipment_update_service: 'Spree::Shipments::Update',
43
+ shipment_add_item_service: 'Spree::Shipments::AddItem',
44
+ shipment_remove_item_service: 'Spree::Shipments::RemoveItem',
45
+
46
+ # sorter
47
+ collection_sorter: 'Spree::BaseSorter',
48
+ order_sorter: 'Spree::BaseSorter',
49
+ products_sorter: 'Spree::Products::Sort',
50
+
51
+ # paginator
52
+ collection_paginator: 'Spree::Shared::Paginate',
53
+
54
+ # coupons
55
+ # TODO: we should split this service into 2 separate - Add and Remove
56
+ coupon_handler: 'Spree::PromotionHandler::Coupon',
57
+
58
+ # account
59
+ account_create_service: 'Spree::Account::Create',
60
+ account_update_service: 'Spree::Account::Update',
61
+
62
+ # addresses
63
+ address_create_service: 'Spree::Addresses::Create',
64
+ address_update_service: 'Spree::Addresses::Update',
65
+
66
+ # credit cards
67
+ credit_cards_destroy_service: 'Spree::CreditCards::Destroy',
68
+
69
+ # classifications
70
+ classification_reposition_service: 'Spree::Classifications::Reposition',
71
+
72
+ # line items
73
+ line_item_create_service: 'Spree::LineItems::Create',
74
+ line_item_update_service: 'Spree::LineItems::Update',
75
+ line_item_destroy_service: 'Spree::LineItems::Destroy',
76
+
77
+ payment_create_service: 'Spree::Payments::Create',
78
+
79
+ # errors
80
+ error_handler: 'Spree::ErrorReporter',
81
+
82
+ # data feeds
83
+ data_feeds_google_rss_service: 'Spree::DataFeeds::Google::Rss',
84
+ data_feeds_google_optional_attributes_service: 'Spree::DataFeeds::Google::OptionalAttributes',
85
+ data_feeds_google_required_attributes_service: 'Spree::DataFeeds::Google::RequiredAttributes',
86
+ data_feeds_google_optional_sub_attributes_service: 'Spree::DataFeeds::Google::OptionalSubAttributes',
87
+ data_feeds_google_products_list: 'Spree::DataFeeds::Google::ProductsList',
88
+
89
+ # finders
90
+ address_finder: 'Spree::Addresses::Find',
91
+ country_finder: 'Spree::Countries::Find',
92
+ cms_page_finder: 'Spree::CmsPages::Find',
93
+ menu_finder: 'Spree::Menus::Find',
94
+ current_order_finder: 'Spree::Orders::FindCurrent',
95
+ current_store_finder: 'Spree::Stores::FindCurrent',
96
+ completed_order_finder: 'Spree::Orders::FindComplete',
97
+ credit_card_finder: 'Spree::CreditCards::Find',
98
+ products_finder: 'Spree::Products::Find',
99
+ taxon_finder: 'Spree::Taxons::Find',
100
+ line_item_by_variant_finder: 'Spree::LineItems::FindByVariant'
101
+ }.freeze
102
+
103
+ include Spree::DependenciesHelper
104
+ end
105
+ end
106
+ end