spree_core 4.5.0 → 4.7.3

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/countries/find.rb +1 -1
  3. data/app/finders/spree/option_values/find_available.rb +1 -1
  4. data/app/finders/spree/product_properties/find_available.rb +1 -1
  5. data/app/finders/spree/products/find.rb +21 -13
  6. data/app/finders/spree/taxons/find.rb +7 -10
  7. data/app/helpers/spree/base_helper.rb +3 -7
  8. data/app/helpers/spree/products_helper.rb +3 -3
  9. data/app/models/concerns/spree/metadata.rb +7 -2
  10. data/app/models/concerns/spree/named_type.rb +1 -1
  11. data/app/models/concerns/spree/product_scopes.rb +27 -23
  12. data/app/models/concerns/spree/translatable_resource.rb +25 -0
  13. data/app/models/concerns/spree/translatable_resource_scopes.rb +24 -0
  14. data/app/models/concerns/spree/translatable_resource_slug.rb +15 -0
  15. data/app/models/concerns/spree/user_roles.rb +3 -3
  16. data/app/models/spree/address.rb +6 -4
  17. data/app/models/spree/asset.rb +1 -1
  18. data/app/models/spree/base.rb +6 -1
  19. data/app/models/spree/calculator/default_tax.rb +1 -1
  20. data/app/models/spree/cms/sections/image_gallery.rb +1 -7
  21. data/app/models/spree/cms/sections/side_by_side_images.rb +1 -7
  22. data/app/models/spree/cms_page.rb +2 -2
  23. data/app/models/spree/cms_section.rb +1 -1
  24. data/app/models/spree/country.rb +2 -2
  25. data/app/models/spree/credit_card.rb +1 -1
  26. data/app/models/spree/customer_return.rb +2 -2
  27. data/app/models/spree/data_feed/google.rb +15 -0
  28. data/app/models/spree/data_feed.rb +40 -0
  29. data/app/models/spree/digital_link.rb +5 -1
  30. data/app/models/spree/image.rb +2 -2
  31. data/app/models/spree/legacy_user.rb +3 -3
  32. data/app/models/spree/line_item.rb +1 -1
  33. data/app/models/spree/log_entry.rb +5 -1
  34. data/app/models/spree/menu.rb +1 -1
  35. data/app/models/spree/option_type.rb +6 -2
  36. data/app/models/spree/option_value.rb +5 -1
  37. data/app/models/spree/order/store_credit.rb +8 -0
  38. data/app/models/spree/order.rb +9 -9
  39. data/app/models/spree/order_contents.rb +31 -0
  40. data/app/models/spree/payment.rb +7 -15
  41. data/app/models/spree/payment_method.rb +1 -1
  42. data/app/models/spree/payment_source.rb +1 -1
  43. data/app/models/spree/preference.rb +5 -1
  44. data/app/models/spree/price.rb +1 -1
  45. data/app/models/spree/product.rb +64 -25
  46. data/app/models/spree/product_property.rb +13 -4
  47. data/app/models/spree/promotion.rb +2 -2
  48. data/app/models/spree/property.rb +8 -2
  49. data/app/models/spree/prototype.rb +1 -1
  50. data/app/models/spree/refund.rb +1 -1
  51. data/app/models/spree/reimbursement.rb +1 -1
  52. data/app/models/spree/return_authorization.rb +1 -1
  53. data/app/models/spree/return_item.rb +5 -1
  54. data/app/models/spree/role.rb +1 -1
  55. data/app/models/spree/shipment.rb +5 -5
  56. data/app/models/spree/shipping_category.rb +1 -1
  57. data/app/models/spree/shipping_method.rb +1 -1
  58. data/app/models/spree/stock/estimator.rb +1 -1
  59. data/app/models/spree/stock/splitter/weight.rb +1 -1
  60. data/app/models/spree/stock_item.rb +1 -1
  61. data/app/models/spree/stock_location.rb +1 -1
  62. data/app/models/spree/stock_transfer.rb +3 -3
  63. data/app/models/spree/store.rb +22 -3
  64. data/app/models/spree/store_credit.rb +2 -2
  65. data/app/models/spree/taxon.rb +47 -7
  66. data/app/models/spree/taxon_image.rb +2 -2
  67. data/app/models/spree/taxonomy.rb +5 -1
  68. data/app/models/spree/variant.rb +6 -9
  69. data/app/models/spree/wishlist.rb +6 -2
  70. data/app/models/spree/zone.rb +2 -2
  71. data/app/services/spree/data_feeds/google/optional_attributes.rb +23 -0
  72. data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +21 -0
  73. data/app/services/spree/data_feeds/google/products_list.rb +14 -0
  74. data/app/services/spree/data_feeds/google/required_attributes.rb +67 -0
  75. data/app/services/spree/data_feeds/google/rss.rb +107 -0
  76. data/app/services/spree/locales/set_fallback_locale_for_store.rb +16 -0
  77. data/app/services/spree/seeds/countries.rb +12 -27
  78. data/app/services/spree/seeds/states.rb +8 -17
  79. data/app/services/spree/stock_locations/stock_items/create.rb +12 -18
  80. data/app/sorters/spree/products/sort.rb +23 -0
  81. data/app/validators/db_maximum_length_validator.rb +2 -6
  82. data/brakeman.ignore +326 -18
  83. data/config/initializers/friendly_id.rb +2 -0
  84. data/config/initializers/mobility.rb +16 -0
  85. data/config/initializers/rails61_fixes.rb +1 -3
  86. data/config/locales/en.yml +7 -0
  87. data/db/migrate/20220706112554_create_product_name_and_description_translations_for_mobility_table_backend.rb +27 -0
  88. data/db/migrate/20220715083542_create_spree_product_translations_for_mobility.rb +7 -0
  89. data/db/migrate/20220715120222_change_product_name_null_to_true.rb +5 -0
  90. data/db/migrate/20220718100743_create_spree_taxon_name_and_description_translations_for_mobility_table_backend.rb +27 -0
  91. data/db/migrate/20220718100948_change_taxon_name_null_to_true.rb +5 -0
  92. data/db/migrate/20220802070609_add_locale_to_friendly_id_slugs.rb +11 -0
  93. data/db/migrate/20220802073225_create_spree_product_slug_translations_for_mobility_table_backend.rb +5 -0
  94. data/db/migrate/20220804073928_transfer_data_to_translatable_tables.rb +66 -0
  95. data/db/migrate/20221215151408_add_selected_locale_to_spree_users.rb +8 -0
  96. data/db/migrate/20221219123957_add_deleted_at_to_product_translations.rb +6 -0
  97. data/db/migrate/20221220133432_add_uniqueness_constraint_to_product_translations.rb +5 -0
  98. data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +14 -0
  99. data/db/migrate/20230103144439_create_option_type_translations.rb +26 -0
  100. data/db/migrate/20230103151034_create_option_value_translations.rb +26 -0
  101. data/db/migrate/20230109084253_create_product_property_translations.rb +25 -0
  102. data/db/migrate/20230109094907_transfer_options_data_to_translatable_tables.rb +58 -0
  103. data/db/migrate/20230109105943_create_property_translations.rb +26 -0
  104. data/db/migrate/20230109110840_transfer_property_data_to_translatable_tables.rb +59 -0
  105. data/db/migrate/20230110142344_backfill_friendly_id_slug_locale.rb +15 -0
  106. data/db/migrate/20230111121534_add_additional_taxon_translation_fields.rb +8 -0
  107. data/db/migrate/20230111122511_transfer_product_and_taxon_data_to_translatable_tables.rb +82 -0
  108. data/db/migrate/20230117115531_create_taxonomy_translations.rb +24 -0
  109. data/db/migrate/20230117120430_allow_null_taxonomy_name.rb +5 -0
  110. data/db/migrate/20230117121303_transfer_taxonomy_data_to_translatable_tables.rb +11 -0
  111. data/db/migrate/20230210142732_create_store_translations.rb +50 -0
  112. data/db/migrate/20230210142849_transfer_store_data_to_translatable_tables.rb +11 -0
  113. data/db/migrate/20230210230434_add_deleted_at_to_store_translations.rb +6 -0
  114. data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +5 -0
  115. data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +7 -0
  116. data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +5 -0
  117. data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +5 -0
  118. data/db/migrate/20230514162157_add_index_on_locale_and_permalink_to_spree_taxons.rb +5 -0
  119. data/lib/mobility/plugins/store_based_fallbacks.rb +55 -0
  120. data/lib/spree/core/configuration.rb +2 -1
  121. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  122. data/lib/spree/core/controller_helpers/common.rb +5 -5
  123. data/lib/spree/core/controller_helpers/locale.rb +33 -2
  124. data/lib/spree/core/dependencies.rb +70 -94
  125. data/lib/spree/core/dependencies_helper.rb +19 -0
  126. data/lib/spree/core/engine.rb +7 -1
  127. data/lib/spree/core/preferences/preferable_class_methods.rb +1 -1
  128. data/lib/spree/core/product_duplicator.rb +4 -1
  129. data/lib/spree/core/product_filters.rb +7 -4
  130. data/lib/spree/core/search/base.rb +1 -1
  131. data/lib/spree/core/version.rb +1 -1
  132. data/lib/spree/core.rb +2 -0
  133. data/lib/spree/permitted_attributes.rb +1 -1
  134. data/lib/spree/testing_support/controller_requests.rb +10 -10
  135. data/lib/spree/testing_support/factories/google_data_feed_factory.rb +8 -0
  136. data/lib/spree/testing_support/factories/product_factory.rb +6 -0
  137. data/lib/spree/testing_support/factories/product_translation_factory.rb +6 -0
  138. data/lib/spree/testing_support/factories/store_factory.rb +3 -0
  139. data/lib/spree/testing_support/factories/variant_factory.rb +4 -0
  140. data/lib/spree/translation_migrations.rb +40 -0
  141. data/lib/spree_core.rb +1 -0
  142. data/spree_core.gemspec +6 -3
  143. metadata +147 -14
@@ -0,0 +1,14 @@
1
+ class CreateSpreeDataFeedSettings < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :spree_data_feed_settings do |t|
4
+ t.references :spree_store
5
+
6
+ t.string :name
7
+ t.string :provider
8
+ t.string :uuid, unique: true
9
+ t.boolean :enabled, default: true
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ class CreateOptionTypeTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists? 'spree_option_type_translations'
4
+ # manually check for index since Rails if_exists does not always work correctly
5
+ if ActiveRecord::Migration.connection.index_exists?(:spree_option_type_translations, :spree_option_type_id)
6
+ remove_index :spree_option_type_translations, name: "index_spree_option_type_translations_on_spree_option_type_id", if_exists: true
7
+ end
8
+ else
9
+ create_table :spree_option_type_translations do |t|
10
+
11
+ # Translated attribute(s)
12
+ t.string :name
13
+ t.string :presentation
14
+
15
+ t.string :locale, null: false
16
+ t.references :spree_option_type, null: false, foreign_key: true, index: false
17
+
18
+ t.timestamps
19
+ end
20
+
21
+ add_index :spree_option_type_translations, :locale, name: :index_spree_option_type_translations_on_locale
22
+ end
23
+
24
+ add_index :spree_option_type_translations, [:spree_option_type_id, :locale], name: :unique_option_type_id_per_locale, unique: true
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ class CreateOptionValueTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists? 'spree_option_value_translations'
4
+ # manually check for index since Rails if_exists does not always work correctly
5
+ if ActiveRecord::Migration.connection.index_exists?(:spree_option_value_translations, :spree_option_value_id)
6
+ remove_index :spree_option_value_translations, column: :spree_option_value_id, if_exists: true
7
+ end
8
+ else
9
+ create_table :spree_option_value_translations do |t|
10
+
11
+ # Translated attribute(s)
12
+ t.string :name
13
+ t.string :presentation
14
+
15
+ t.string :locale, null: false
16
+ t.references :spree_option_value, null: false, foreign_key: true, index: false
17
+
18
+ t.timestamps
19
+ end
20
+
21
+ add_index :spree_option_value_translations, :locale, name: :index_spree_option_value_translations_on_locale
22
+ end
23
+
24
+ add_index :spree_option_value_translations, [:spree_option_value_id, :locale], name: :unique_option_value_id_per_locale, unique: true
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ class CreateProductPropertyTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists? 'spree_product_property_translations'
4
+ # manually check for index since Rails if_exists does not always work correctly
5
+ if ActiveRecord::Migration.connection.index_exists?(:spree_product_property_translations, :spree_product_property_id)
6
+ remove_index :spree_product_property_translations, column: :spree_product_property_id, if_exists: true
7
+ end
8
+ else
9
+ create_table :spree_product_property_translations do |t|
10
+ # Translated attribute(s)
11
+ t.string :value
12
+ t.string :filter_param
13
+
14
+ t.string :locale, null: false
15
+ t.references :spree_product_property, null: false, foreign_key: true, index: false
16
+
17
+ t.timestamps
18
+ end
19
+
20
+ add_index :spree_product_property_translations, :locale, name: :index_spree_product_property_translations_on_locale
21
+ end
22
+
23
+ add_index :spree_product_property_translations, [:spree_product_property_id, :locale], name: :unique_product_property_id_per_locale, unique: true
24
+ end
25
+ end
@@ -0,0 +1,58 @@
1
+ class TransferOptionsDataToTranslatableTables < ActiveRecord::Migration[6.1]
2
+ DEFAULT_LOCALE = 'en'
3
+
4
+ def up
5
+ # Only transfer data if translation tables are being newly created / no translations exist
6
+ # Otherwise, assume translation data is already in place from spree_globalize
7
+
8
+ # Option Types
9
+ if not Spree::OptionType::Translation.exists?
10
+ ActiveRecord::Base.connection.execute("
11
+ INSERT INTO spree_option_type_translations (name, presentation, locale, spree_option_type_id, created_at, updated_at)
12
+ SELECT name, presentation, '#{DEFAULT_LOCALE}', id, created_at, updated_at
13
+ FROM spree_option_types;
14
+ ")
15
+ ActiveRecord::Base.connection.execute("
16
+ UPDATE spree_option_types
17
+ SET name=null, presentation=null;
18
+ ")
19
+ end
20
+
21
+ # Option Values
22
+ if not Spree::OptionValue::Translation.exists?
23
+ ActiveRecord::Base.connection.execute("
24
+ INSERT INTO spree_option_value_translations (name, presentation, locale, spree_option_value_id, created_at, updated_at)
25
+ SELECT name, presentation, '#{DEFAULT_LOCALE}', id, created_at, updated_at
26
+ FROM spree_option_values;
27
+ ")
28
+ ActiveRecord::Base.connection.execute("
29
+ UPDATE spree_option_values
30
+ SET name=null, presentation=null;
31
+ ")
32
+ end
33
+ end
34
+
35
+ def down
36
+ # Option Types
37
+ ActiveRecord::Base.connection.execute("
38
+ UPDATE spree_option_types as option_types
39
+ SET (name, presentation) = (t_option_types.name, t_option_types.presentation)
40
+ FROM spree_option_type_translations AS t_option_types
41
+ WHERE t_option_types.spree_option_type_id = option_types.id;
42
+ ")
43
+ ActiveRecord::Base.connection.execute("
44
+ TRUNCATE TABLE spree_option_type_translations;
45
+ ")
46
+
47
+ # Option Values
48
+ ActiveRecord::Base.connection.execute("
49
+ UPDATE spree_option_values as option_values
50
+ SET (name, presentation) = (t_option_values.name, t_option_values.presentation)
51
+ FROM spree_option_value_translations AS t_option_values
52
+ WHERE t_option_values.spree_option_value_id = option_values.id;
53
+ ")
54
+ ActiveRecord::Base.connection.execute("
55
+ TRUNCATE TABLE spree_option_value_translations;
56
+ ")
57
+ end
58
+ end
@@ -0,0 +1,26 @@
1
+ class CreatePropertyTranslations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ if ActiveRecord::Base.connection.table_exists?('spree_property_translations')
4
+ # manually check for index since Rails if_exists does not always work correctly
5
+ if ActiveRecord::Migration.connection.index_exists?(:spree_property_translations, :spree_property_id)
6
+ remove_index :spree_property_translations, column: :spree_property_id, if_exists: true
7
+ end
8
+ else
9
+ create_table :spree_property_translations do |t|
10
+ # Translated attribute(s)
11
+ t.string :name
12
+ t.string :presentation
13
+ t.string :filter_param
14
+
15
+ t.string :locale, null: false
16
+ t.references :spree_property, null: false, foreign_key: true, index: false
17
+
18
+ t.timestamps
19
+ end
20
+
21
+ add_index :spree_property_translations, :locale, name: :index_spree_property_translations_on_locale
22
+ end
23
+
24
+ add_index :spree_property_translations, [:spree_property_id, :locale], name: :unique_property_id_per_locale, unique: true
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ class TransferPropertyDataToTranslatableTables < ActiveRecord::Migration[6.1]
2
+ DEFAULT_LOCALE = 'en'
3
+
4
+ def up
5
+ # Properties
6
+ change_column_null :spree_properties, :presentation, true
7
+
8
+ if not Spree::Property::Translation.exists?
9
+ ActiveRecord::Base.connection.execute("
10
+ INSERT INTO spree_property_translations (name, presentation, filter_param, locale, spree_property_id, created_at, updated_at)
11
+ SELECT name, presentation, filter_param, '#{DEFAULT_LOCALE}', id, created_at, updated_at
12
+ FROM spree_properties;
13
+ ")
14
+ ActiveRecord::Base.connection.execute("
15
+ UPDATE spree_properties
16
+ SET name=null, presentation=null, filter_param=null;
17
+ ")
18
+ end
19
+
20
+ # Product Properties
21
+ if not Spree::ProductProperty::Translation.exists?
22
+ ActiveRecord::Base.connection.execute("
23
+ INSERT INTO spree_product_property_translations (value, filter_param, locale, spree_product_property_id, created_at, updated_at)
24
+ SELECT value, filter_param, '#{DEFAULT_LOCALE}', id, created_at, updated_at
25
+ FROM spree_product_properties;
26
+ ")
27
+ ActiveRecord::Base.connection.execute("
28
+ UPDATE spree_product_properties
29
+ SET value=null, filter_param=null;
30
+ ")
31
+ end
32
+ end
33
+
34
+ def down
35
+ # Properties
36
+ change_column_null :spree_properties, :presentation, false
37
+
38
+ ActiveRecord::Base.connection.execute("
39
+ UPDATE spree_properties AS properties
40
+ SET (name, presentation, filter_param) = (t_properties.name, t_properties.presentation, t_properties.filter_param)
41
+ FROM spree_property_translations AS t_properties
42
+ WHERE t_properties.spree_property_id = properties.id;
43
+ ")
44
+ ActiveRecord::Base.connection.execute("
45
+ TRUNCATE TABLE spree_property_translations;
46
+ ")
47
+
48
+ # Product Properties
49
+ ActiveRecord::Base.connection.execute("
50
+ UPDATE spree_product_properties AS product_properties
51
+ SET (value, filter_param) = (t_product_properties.value, t_product_properties.filter_param)
52
+ FROM spree_product_property_translations AS t_product_properties
53
+ WHERE t_product_properties.spree_product_property_id = product_properties.id;
54
+ ")
55
+ ActiveRecord::Base.connection.execute("
56
+ TRUNCATE TABLE spree_product_property_translations;
57
+ ")
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ class BackfillFriendlyIdSlugLocale < ActiveRecord::Migration[6.1]
2
+ DEFAULT_LOCALE = 'en'
3
+
4
+ def up
5
+ ActiveRecord::Base.connection.execute("
6
+ UPDATE friendly_id_slugs SET locale = '#{DEFAULT_LOCALE}'
7
+ ")
8
+ end
9
+
10
+ def down
11
+ ActiveRecord::Base.connection.execute("
12
+ UPDATE friendly_id_slugs SET locale = NULL
13
+ ")
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class AddAdditionalTaxonTranslationFields < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :spree_taxon_translations, :meta_title, :string, if_not_exists: true
4
+ add_column :spree_taxon_translations, :meta_description, :string, if_not_exists: true
5
+ add_column :spree_taxon_translations, :meta_keywords, :string, if_not_exists: true
6
+ add_column :spree_taxon_translations, :permalink, :string, if_not_exists: true
7
+ end
8
+ end
@@ -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,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'concurrent'
4
+ require 'mobility'
5
+
6
+ # The default implementation in the Mobility gem requires fallbacks to be defined when booting the application.
7
+ # This patch allows to dynamically reconfigure translations fallbacks, by setting Mobility.store_based_fallbacks attribute.
8
+ # The implementation is based on the default fallbacks plugin, with some changes around fetching the list of fallbacks to be used.
9
+ # https://github.com/shioyama/mobility/blob/master/lib/mobility/plugins/fallbacks.rb
10
+ module Mobility
11
+ @store_based_fallbacks = Concurrent::ThreadLocalVar.new(I18n::Locale::Fallbacks.new)
12
+
13
+ class << self
14
+ def store_based_fallbacks
15
+ @store_based_fallbacks.value
16
+ end
17
+
18
+ def store_based_fallbacks=(value)
19
+ @store_based_fallbacks.value = value
20
+ end
21
+ end
22
+
23
+ module Plugins
24
+ module StoreBasedFallbacks
25
+ extend ::Mobility::Plugin
26
+
27
+ default true
28
+ requires :backend, include: :before
29
+
30
+ # Applies fallbacks plugin to attributes. Completely disables fallbacks
31
+ # on model if option is +false+.
32
+ included_hook do |_, backend_class|
33
+ unless options[:fallbacks] == false
34
+ backend_class.include(BackendInstanceMethods)
35
+ end
36
+ end
37
+
38
+ module BackendInstanceMethods
39
+ def read(locale, fallback: true, **kwargs)
40
+ return super(locale, **kwargs) if !fallback || kwargs[:locale]
41
+
42
+ locales = Mobility.store_based_fallbacks[locale]
43
+ locales.each do |fallback_locale|
44
+ value = super(fallback_locale, **kwargs)
45
+ return value if Util.present?(value)
46
+ end
47
+
48
+ super(locale, **kwargs)
49
+ end
50
+ end
51
+ end
52
+
53
+ register_plugin(:store_based_fallbacks, StoreBasedFallbacks)
54
+ end
55
+ end
@@ -65,6 +65,7 @@ module Spree
65
65
  preference :show_raw_product_description, :boolean, deprecated: true
66
66
  preference :tax_using_ship_address, :boolean, default: true
67
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
68
69
 
69
70
  # Store credits configurations
70
71
  preference :non_expiring_credit_types, :array, default: []
@@ -75,7 +76,7 @@ module Spree
75
76
 
76
77
  # searcher_class allows spree extension writers to provide their own Search class
77
78
  def searcher_class
78
- ActiveSupport::Deprecation.warn('`Spree::Config.searcher_class` is deprecated and will be removed in Spree v5, please use `Spree.searcher_class` instead.')
79
+ Spree::Deprecation.warn('`Spree::Config.searcher_class` is deprecated and will be removed in Spree v5, please use `Spree.searcher_class` instead.')
79
80
  @searcher_class ||= Spree.searcher_class
80
81
  end
81
82
 
@@ -75,7 +75,7 @@ module Spree
75
75
  # Override this method in your controllers if you want to have special behavior in case the user is not authorized
76
76
  # to access the requested action. For example, a popup window might simply close itself.
77
77
  def redirect_unauthorized_access
78
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
78
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
79
79
  Core::ControllerHelpers#redirect_unauthorized_access is deprecated and will be removed in Spree 5.0.
80
80
  This method is implemented differently for Storefront and Admin
81
81
  DEPRECATION
@@ -17,7 +17,7 @@ module Spree
17
17
  attr_writer :title
18
18
 
19
19
  def title
20
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
20
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
21
21
  ControllerHelpers::Common is deprecated and will be removed in Spree 5.0.
22
22
  DEPRECATION
23
23
  title_string = @title.present? ? @title : accurate_title
@@ -33,7 +33,7 @@ module Spree
33
33
  end
34
34
 
35
35
  def default_title
36
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
36
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
37
37
  ControllerHelpers::Common is deprecated and will be removed in Spree 5.0.
38
38
  DEPRECATION
39
39
  current_store.name
@@ -41,7 +41,7 @@ module Spree
41
41
 
42
42
  # this is a hook for subclasses to provide title
43
43
  def accurate_title
44
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
44
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
45
45
  ControllerHelpers::Common is deprecated and will be removed in Spree 5.0.
46
46
  DEPRECATION
47
47
  current_store.seo_title
@@ -50,7 +50,7 @@ module Spree
50
50
  private
51
51
 
52
52
  def set_user_language
53
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
53
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
54
54
  ControllerHelpers::Common#set_user_language is deprecated and will be removed in Spree 5.0.
55
55
  Please use `before_action :set_locale` instead
56
56
  DEPRECATION
@@ -65,7 +65,7 @@ module Spree
65
65
  # Default layout is: +app/views/spree/layouts/spree_application+
66
66
  #
67
67
  def get_layout
68
- ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
68
+ Spree::Deprecation.warn(<<-DEPRECATION, caller)
69
69
  ControllerHelpers::Common is deprecated and will be removed in Spree 5.0.
70
70
  DEPRECATION
71
71
  return unless defined?(Spree::Frontend)