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.
- checksums.yaml +4 -4
- data/app/finders/spree/orders/find_complete.rb +33 -2
- data/app/finders/spree/products/find.rb +1 -28
- data/app/finders/spree/stores/find_default.rb +17 -0
- data/app/finders/spree/variants/visible_finder.rb +1 -0
- data/app/helpers/spree/addresses_helper.rb +1 -2
- data/app/helpers/spree/base_helper.rb +6 -58
- data/app/mailers/spree/base_mailer.rb +4 -3
- data/app/models/concerns/spree/adjustment_source.rb +0 -8
- data/app/models/concerns/spree/admin_user_methods.rb +32 -2
- data/app/models/concerns/spree/image_methods.rb +4 -0
- data/app/models/concerns/spree/metadata.rb +10 -0
- data/app/models/concerns/spree/number_as_param.rb +5 -3
- data/app/models/concerns/spree/prefixed_id.rb +82 -0
- data/app/models/concerns/spree/product_scopes.rb +35 -65
- data/app/models/concerns/spree/publishable.rb +47 -47
- data/app/models/concerns/spree/{multi_store_resource.rb → store_scoped_resource.rb} +1 -10
- data/app/models/concerns/spree/stores/markets.rb +124 -0
- data/app/models/concerns/spree/user_methods.rb +7 -7
- data/app/models/concerns/spree/user_payment_source.rb +2 -0
- data/app/models/concerns/spree/user_roles.rb +1 -0
- data/app/models/concerns/spree/vat_price_calculation.rb +2 -2
- data/app/models/spree/ability.rb +18 -5
- data/app/models/spree/address.rb +33 -2
- data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
- data/app/models/spree/adjustment.rb +3 -20
- data/app/models/spree/api_key.rb +102 -0
- data/app/models/spree/asset.rb +2 -0
- data/app/models/spree/authentication/strategies/base_strategy.rb +55 -0
- data/app/models/spree/authentication/strategies/email_password_strategy.rb +47 -0
- data/app/models/spree/base.rb +1 -0
- data/app/models/spree/calculator.rb +2 -0
- data/app/models/spree/country.rb +60 -0
- data/app/models/spree/coupon_code.rb +2 -0
- data/app/models/spree/credit_card.rb +2 -27
- data/app/models/spree/current.rb +45 -4
- data/app/models/spree/customer_group.rb +2 -0
- data/app/models/spree/customer_return.rb +2 -0
- data/app/models/spree/digital.rb +2 -0
- data/app/models/spree/digital_link.rb +2 -0
- data/app/models/spree/export.rb +3 -2
- data/app/models/spree/exports/products.rb +0 -6
- data/app/models/spree/fulfilment_changer.rb +8 -2
- data/app/models/spree/gateway/bogus.rb +69 -9
- data/app/models/spree/gateway.rb +0 -3
- data/app/models/spree/gateway_customer.rb +2 -0
- data/app/models/spree/gift_card.rb +2 -0
- data/app/models/spree/gift_card_batch.rb +6 -0
- data/app/models/spree/image/configuration/active_storage.rb +0 -2
- data/app/models/spree/image.rb +25 -31
- data/app/models/spree/import.rb +5 -3
- data/app/models/spree/import_mapping.rb +2 -0
- data/app/models/spree/import_row.rb +2 -0
- data/app/models/spree/import_schemas/customers.rb +21 -0
- data/app/models/spree/imports/customers.rb +9 -0
- data/app/models/spree/integration.rb +2 -0
- data/app/models/spree/inventory_unit.rb +2 -0
- data/app/models/spree/invitation.rb +6 -6
- data/app/models/spree/legacy_admin_user.rb +31 -0
- data/app/models/spree/legacy_user.rb +19 -1
- data/app/models/spree/line_item.rb +15 -4
- data/app/models/spree/log_entry.rb +10 -5
- data/app/models/spree/market.rb +83 -0
- data/app/models/spree/market_country.rb +25 -0
- data/app/models/spree/metafield.rb +2 -0
- data/app/models/spree/metafield_definition.rb +2 -0
- data/app/models/spree/newsletter_subscriber.rb +2 -0
- data/app/models/spree/option_type.rb +2 -0
- data/app/models/spree/option_value.rb +2 -0
- data/app/models/spree/order/address_book.rb +2 -1
- data/app/models/spree/order/checkout.rb +0 -18
- data/app/models/spree/order.rb +93 -56
- data/app/models/spree/payment/gateway_options.rb +2 -2
- data/app/models/spree/payment/processing.rb +5 -5
- data/app/models/spree/payment.rb +7 -2
- data/app/models/spree/payment_capture_event.rb +2 -0
- data/app/models/spree/payment_connection_error.rb +3 -0
- data/app/models/spree/payment_method/check.rb +1 -1
- data/app/models/spree/payment_method/store_credit.rb +5 -5
- data/app/models/spree/payment_method.rb +59 -1
- data/app/models/spree/payment_response.rb +70 -0
- data/app/models/spree/payment_session.rb +109 -0
- data/app/models/spree/payment_sessions/bogus.rb +4 -0
- data/app/models/spree/payment_setup_session.rb +79 -0
- data/app/models/spree/payment_source.rb +2 -0
- data/app/models/spree/permission_sets/default_customer.rb +19 -5
- data/app/models/spree/permission_sets/product_display.rb +0 -2
- data/app/models/spree/permission_sets/product_management.rb +0 -2
- data/app/models/spree/policy.rb +2 -0
- data/app/models/spree/price.rb +26 -2
- data/app/models/spree/price_list.rb +2 -0
- data/app/models/spree/price_rule.rb +2 -0
- data/app/models/spree/price_rules/market_rule.rb +19 -0
- data/app/models/spree/product.rb +45 -101
- data/app/models/spree/promotion/rules/country.rb +1 -1
- data/app/models/spree/promotion.rb +5 -15
- data/app/models/spree/promotion_action.rb +2 -0
- data/app/models/spree/promotion_category.rb +2 -0
- data/app/models/spree/promotion_handler/coupon.rb +3 -3
- data/app/models/spree/promotion_rule.rb +2 -0
- data/app/models/spree/prototype.rb +2 -3
- data/app/models/spree/refund.rb +8 -2
- data/app/models/spree/refund_reason.rb +2 -0
- data/app/models/spree/reimbursement/credit.rb +2 -0
- data/app/models/spree/reimbursement.rb +2 -0
- data/app/models/spree/reimbursement_type.rb +2 -0
- data/app/models/spree/report.rb +3 -1
- data/app/models/spree/return_authorization.rb +2 -0
- data/app/models/spree/return_authorization_reason.rb +2 -0
- data/app/models/spree/return_item.rb +2 -0
- data/app/models/spree/role.rb +2 -0
- data/app/models/spree/shipment/emails.rb +1 -0
- data/app/models/spree/shipment.rb +11 -1
- data/app/models/spree/shipping_category.rb +5 -3
- data/app/models/spree/shipping_method.rb +2 -0
- data/app/models/spree/shipping_method_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +2 -0
- data/app/models/spree/state_change.rb +2 -0
- data/app/models/spree/stock_item.rb +2 -0
- data/app/models/spree/stock_location.rb +2 -0
- data/app/models/spree/stock_movement.rb +2 -0
- data/app/models/spree/stock_transfer.rb +2 -1
- data/app/models/spree/store.rb +111 -219
- data/app/models/spree/store_credit.rb +6 -0
- data/app/models/spree/store_credit_category.rb +2 -0
- data/app/models/spree/store_credit_event.rb +2 -0
- data/app/models/spree/store_credit_type.rb +2 -0
- data/app/models/spree/store_product.rb +2 -0
- data/app/models/spree/tax_category.rb +3 -11
- data/app/models/spree/tax_rate.rb +2 -0
- data/app/models/spree/taxon.rb +2 -15
- data/app/models/spree/taxon_rule.rb +2 -0
- data/app/models/spree/taxonomy.rb +2 -0
- data/app/models/spree/user_identity.rb +81 -0
- data/app/models/spree/variant.rb +15 -43
- data/app/models/spree/webhook_delivery.rb +2 -0
- data/app/models/spree/webhook_endpoint.rb +2 -0
- data/app/models/spree/wished_item.rb +15 -0
- data/app/models/spree/wishlist.rb +2 -8
- data/app/models/spree/zone.rb +3 -10
- data/app/presenters/spree/filters/price_presenter.rb +1 -0
- data/app/presenters/spree/filters/price_range_presenter.rb +1 -0
- data/app/presenters/spree/filters/quantified_price_range_presenter.rb +1 -0
- data/app/presenters/spree/product_summary_presenter.rb +1 -0
- data/app/services/spree/addresses/helper.rb +22 -3
- data/app/services/spree/cart/add_item.rb +8 -4
- data/app/services/spree/cart/associate.rb +19 -6
- data/app/services/spree/cart/create.rb +13 -2
- data/app/services/spree/checkout/select_shipping_method.rb +13 -1
- data/app/services/spree/classifications/reposition.rb +5 -0
- data/app/services/spree/imports/row_processors/customer.rb +70 -0
- data/app/services/spree/orders/approve.rb +5 -3
- data/app/services/spree/orders/cancel.rb +9 -4
- data/app/services/spree/products/duplicator.rb +0 -12
- data/app/services/spree/products/prepare_nested_attributes.rb +1 -13
- data/app/services/spree/sample_data/import_runner.rb +54 -0
- data/app/services/spree/sample_data/loader.rb +78 -0
- data/app/services/spree/seeds/admin_user.rb +2 -3
- data/app/services/spree/seeds/all.rb +1 -0
- data/app/services/spree/seeds/api_keys.rb +16 -0
- data/app/services/spree/seeds/stores.rb +2 -4
- data/app/sorters/spree/orders/sort.rb +4 -0
- data/app/subscribers/spree/product_metrics_subscriber.rb +4 -4
- data/config/brakeman.ignore +120 -0
- data/config/locales/en.yml +23 -21
- data/db/migrate/20210914000000_spree_four_three.rb +0 -38
- data/db/migrate/20210915064329_add_metadata_to_spree_multiple_tables.rb +0 -1
- data/db/migrate/20250923141900_create_spree_user_identities.rb +17 -0
- data/db/migrate/20260123000000_create_spree_api_keys.rb +19 -0
- data/db/migrate/20260131000000_add_thumbnail_id_to_spree_variants_and_products.rb +9 -0
- data/db/migrate/20260213000000_create_spree_payment_sessions.rb +27 -0
- data/db/migrate/20260218000000_create_spree_payment_setup_sessions.rb +24 -0
- data/db/migrate/20260220000000_create_spree_markets.rb +29 -0
- data/db/migrate/20260226000000_add_locale_to_spree_orders.rb +5 -0
- data/db/migrate/20260226100000_add_token_digest_to_spree_api_keys.rb +21 -0
- data/db/sample_data/customers.csv +21 -0
- data/db/sample_data/metafield_definitions.rb +7 -0
- data/db/sample_data/orders.rb +131 -0
- data/db/sample_data/payment_methods.rb +17 -0
- data/db/sample_data/products.csv +1083 -0
- data/db/sample_data/promotions.rb +8 -0
- data/db/sample_data/shipping_methods.rb +39 -0
- data/lib/generators/spree/authentication/devise/devise_generator.rb +2 -2
- data/lib/generators/spree/authentication/dummy/dummy_generator.rb +54 -0
- data/lib/generators/spree/authentication/dummy/templates/authentication_helpers.rb.tt +52 -0
- data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +33 -0
- data/lib/generators/spree/cursor_rules/templates/spree_rules.mdc +1 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
- data/lib/spree/core/configuration.rb +1 -3
- data/lib/spree/core/controller_helpers/common.rb +6 -0
- data/lib/spree/core/controller_helpers/currency.rb +5 -0
- data/lib/spree/core/controller_helpers/order.rb +5 -1
- data/lib/spree/core/controller_helpers/store.rb +1 -1
- data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -2
- data/lib/spree/core/dependencies.rb +3 -11
- data/lib/spree/core/engine.rb +17 -17
- data/lib/spree/core/pricing/context.rb +6 -3
- data/lib/spree/core/pricing/resolver.rb +1 -9
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +14 -29
- data/lib/spree/database_type_utilities.rb +7 -0
- data/lib/spree/events.rb +17 -10
- data/lib/spree/money.rb +2 -9
- data/lib/spree/permitted_attributes.rb +20 -20
- data/lib/spree/testing_support/capybara_config.rb +2 -2
- data/lib/spree/testing_support/common_rake.rb +15 -4
- data/lib/spree/testing_support/factories/api_key_factory.rb +19 -0
- data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -5
- data/lib/spree/testing_support/factories/import_factory.rb +12 -0
- data/lib/spree/testing_support/factories/market_factory.rb +35 -0
- data/lib/spree/testing_support/factories/order_factory.rb +4 -1
- data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -6
- data/lib/spree/testing_support/factories/payment_session_factory.rb +47 -0
- data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +31 -0
- data/lib/spree/testing_support/factories/price_rule_factory.rb +10 -0
- data/lib/spree/testing_support/factories/product_factory.rb +0 -7
- data/lib/spree/testing_support/factories/prototype_factory.rb +0 -2
- data/lib/spree/testing_support/factories/user_identity_factory.rb +15 -0
- data/lib/spree/testing_support/store.rb +3 -2
- data/lib/spree/webhooks.rb +7 -7
- data/lib/tasks/core.rake +0 -265
- data/lib/tasks/images.rake +20 -0
- data/lib/tasks/markets.rake +40 -0
- data/lib/tasks/sample_data.rake +15 -0
- data/spec/fixtures/files/customers_import.csv +4 -0
- metadata +101 -154
- data/LICENSE.md +0 -57
- data/app/finders/spree/posts/find.rb +0 -137
- data/app/finders/spree/product_properties/find_available.rb +0 -20
- data/app/finders/spree/stores/find_current.rb +0 -28
- data/app/helpers/spree/mail_helper.rb +0 -27
- data/app/mailers/spree/test_mailer.rb +0 -8
- data/app/models/action_text/video_embed.rb +0 -13
- data/app/models/concerns/spree/has_one_link.rb +0 -42
- data/app/models/concerns/spree/linkable.rb +0 -9
- data/app/models/concerns/spree/previewable.rb +0 -17
- data/app/models/spree/custom_domain.rb +0 -59
- data/app/models/spree/data_feed/google.rb +0 -15
- data/app/models/spree/data_feed.rb +0 -40
- data/app/models/spree/gateway/bogus_simple.rb +0 -24
- data/app/models/spree/post.rb +0 -106
- data/app/models/spree/post_category.rb +0 -44
- data/app/models/spree/product_property.rb +0 -51
- data/app/models/spree/property.rb +0 -86
- data/app/models/spree/property_prototype.rb +0 -9
- data/app/models/spree/store_favicon_image.rb +0 -20
- data/app/models/spree/store_logo.rb +0 -4
- data/app/models/spree/store_mailer_logo.rb +0 -7
- data/app/models/spree/taxon_image/configuration/active_storage.rb +0 -26
- data/app/models/spree/taxon_image.rb +0 -20
- data/app/presenters/spree/filters/properties_presenter.rb +0 -23
- data/app/presenters/spree/filters/property_presenter.rb +0 -42
- data/app/serializers/spree/events/asset_serializer.rb +0 -22
- data/app/serializers/spree/events/base_serializer.rb +0 -61
- data/app/serializers/spree/events/customer_return_serializer.rb +0 -20
- data/app/serializers/spree/events/digital_link_serializer.rb +0 -20
- data/app/serializers/spree/events/digital_serializer.rb +0 -18
- data/app/serializers/spree/events/export_serializer.rb +0 -22
- data/app/serializers/spree/events/gift_card_batch_serializer.rb +0 -24
- data/app/serializers/spree/events/gift_card_serializer.rb +0 -29
- data/app/serializers/spree/events/image_serializer.rb +0 -9
- data/app/serializers/spree/events/import_row_serializer.rb +0 -23
- data/app/serializers/spree/events/import_serializer.rb +0 -24
- data/app/serializers/spree/events/invitation_serializer.rb +0 -28
- data/app/serializers/spree/events/line_item_serializer.rb +0 -31
- data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +0 -21
- data/app/serializers/spree/events/order_serializer.rb +0 -39
- data/app/serializers/spree/events/payment_serializer.rb +0 -24
- data/app/serializers/spree/events/post_category_serializer.rb +0 -20
- data/app/serializers/spree/events/post_serializer.rb +0 -26
- data/app/serializers/spree/events/price_serializer.rb +0 -22
- data/app/serializers/spree/events/product_serializer.rb +0 -24
- data/app/serializers/spree/events/promotion_serializer.rb +0 -32
- data/app/serializers/spree/events/refund_serializer.rb +0 -23
- data/app/serializers/spree/events/reimbursement_serializer.rb +0 -22
- data/app/serializers/spree/events/report_serializer.rb +0 -23
- data/app/serializers/spree/events/return_authorization_serializer.rb +0 -22
- data/app/serializers/spree/events/return_item_serializer.rb +0 -27
- data/app/serializers/spree/events/shipment_serializer.rb +0 -24
- data/app/serializers/spree/events/stock_item_serializer.rb +0 -22
- data/app/serializers/spree/events/stock_movement_serializer.rb +0 -22
- data/app/serializers/spree/events/stock_transfer_serializer.rb +0 -22
- data/app/serializers/spree/events/store_credit_serializer.rb +0 -30
- data/app/serializers/spree/events/user_serializer.rb +0 -18
- data/app/serializers/spree/events/variant_serializer.rb +0 -34
- data/app/serializers/spree/events/wished_item_serializer.rb +0 -20
- data/app/serializers/spree/events/wishlist_serializer.rb +0 -22
- data/app/services/spree/data_feeds/google/optional_attributes.rb +0 -23
- data/app/services/spree/data_feeds/google/optional_sub_attributes.rb +0 -21
- data/app/services/spree/data_feeds/google/products_list.rb +0 -14
- data/app/services/spree/data_feeds/google/required_attributes.rb +0 -68
- data/app/services/spree/data_feeds/google/rss.rb +0 -109
- data/app/sorters/spree/posts/sort.rb +0 -40
- data/app/views/action_text/video_embeds/_thumbnail.html.erb +0 -1
- data/app/views/action_text/video_embeds/_video_embed.html.erb +0 -3
- data/app/views/layouts/action_text/contents/_content.html.erb +0 -3
- data/app/views/spree/test_mailer/test_email.html.erb +0 -40
- data/app/views/spree/test_mailer/test_email.text.erb +0 -4
- data/config/initializers/oembed.rb +0 -1
- data/db/migrate/20221229132350_create_spree_data_feed_settings.rb +0 -14
- data/db/migrate/20230109084253_create_product_property_translations.rb +0 -24
- data/db/migrate/20230109105943_create_property_translations.rb +0 -24
- data/db/migrate/20230415155958_rename_data_feed_settings_table.rb +0 -5
- data/db/migrate/20230415160828_rename_data_feed_table_columns.rb +0 -7
- data/db/migrate/20230415161226_add_indexes_to_data_feeds_table.rb +0 -5
- data/db/migrate/20230512094803_rename_data_feeds_column_provider_to_type.rb +0 -5
- data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +0 -5
- data/db/migrate/20240915144935_add_position_to_spree_properties.rb +0 -6
- data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +0 -33
- data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +0 -5
- data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
- data/db/migrate/20250305121657_remove_spree_posts_indices.rb +0 -7
- data/db/migrate/20250730154601_add_unique_index_on_spree_properties_name.rb +0 -24
- data/lib/spree/core/controller_helpers/search.rb +0 -17
- data/lib/spree/core/product_filters.rb +0 -204
- data/lib/spree/core/query_filters/comparable.rb +0 -46
- data/lib/spree/core/query_filters/date.rb +0 -8
- data/lib/spree/core/query_filters/number.rb +0 -8
- data/lib/spree/core/query_filters/text.rb +0 -32
- data/lib/spree/core/query_filters.rb +0 -11
- data/lib/spree/core/search/base.rb +0 -144
- data/lib/spree/testing_support/factories/favicon_image_factory.rb +0 -9
- data/lib/spree/testing_support/factories/google_data_feed_factory.rb +0 -7
- data/lib/spree/testing_support/factories/post_category_factory.rb +0 -7
- data/lib/spree/testing_support/factories/post_factory.rb +0 -22
- data/lib/spree/testing_support/factories/product_property_factory.rb +0 -7
- data/lib/spree/testing_support/factories/property_factory.rb +0 -28
- data/lib/spree/testing_support/factories/taxon_image_factory.rb +0 -9
- data/lib/spree/testing_support/flash.rb +0 -25
- data/lib/spree/testing_support/flatpickr_capybara.rb +0 -124
- data/lib/tasks/exchanges.rake +0 -66
data/app/models/spree/store.rb
CHANGED
|
@@ -2,9 +2,7 @@ require 'uri'
|
|
|
2
2
|
|
|
3
3
|
module Spree
|
|
4
4
|
class Store < Spree.base_class
|
|
5
|
-
|
|
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 :
|
|
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, :
|
|
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 :
|
|
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
|
-
|
|
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(
|
|
196
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
new
|
|
212
|
-
|
|
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.
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
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
|
-
|
|
278
|
+
url
|
|
311
279
|
end
|
|
312
280
|
|
|
313
281
|
def formatted_url_or_custom_domain
|
|
314
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
|
410
|
-
|
|
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
|
-
|
|
426
|
-
return
|
|
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
|
-
|
|
431
|
-
end
|
|
385
|
+
iso_country = ISO3166::Country[country.iso]
|
|
432
386
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
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
|
-
|
|
565
|
-
|
|
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
|
-
|
|
580
|
-
|
|
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 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
|
-
|
|
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
|
data/app/models/spree/taxon.rb
CHANGED
|
@@ -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
|