spree_core 5.4.4 → 5.5.0.rc1
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/helpers/spree/base_helper.rb +0 -82
- data/app/helpers/spree/currency_helper.rb +0 -12
- data/app/helpers/spree/products_helper.rb +0 -8
- data/app/jobs/spree/base_job.rb +18 -0
- data/app/jobs/spree/events/subscriber_job.rb +2 -1
- data/app/jobs/spree/exports/generate_job.rb +11 -0
- data/app/jobs/spree/images/save_from_url_job.rb +23 -8
- data/app/jobs/spree/imports/assign_tags_job.rb +11 -0
- data/app/jobs/spree/imports/base_job.rb +15 -0
- data/app/jobs/spree/imports/create_categories_job.rb +37 -0
- data/app/jobs/spree/imports/create_rows_job.rb +1 -3
- data/app/jobs/spree/imports/process_group_job.rb +8 -6
- data/app/jobs/spree/imports/process_rows_job.rb +1 -3
- data/app/jobs/spree/media/migrate_product_assets_job.rb +83 -0
- data/app/jobs/spree/products/refresh_metrics_job.rb +15 -4
- data/app/jobs/spree/reports/generate_job.rb +11 -0
- data/app/jobs/spree/search_provider/index_job.rb +5 -1
- data/app/jobs/spree/search_provider/remove_job.rb +4 -0
- data/app/jobs/spree/stock_reservations/expire_job.rb +11 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +34 -1
- data/app/models/concerns/spree/display_on.rb +31 -0
- data/app/models/concerns/spree/metafields.rb +167 -5
- data/app/models/concerns/spree/preference_schema.rb +191 -0
- data/app/models/concerns/spree/prefixed_id.rb +94 -11
- data/app/models/concerns/spree/product_scopes.rb +36 -17
- data/app/models/concerns/spree/ransackable_attributes.rb +5 -1
- data/app/models/concerns/spree/search_indexable.rb +8 -7
- data/app/models/concerns/spree/searchable.rb +11 -2
- data/app/models/concerns/spree/stores/channels.rb +20 -0
- data/app/models/concerns/spree/stores/markets.rb +21 -5
- data/app/models/concerns/spree/typed_associations.rb +120 -0
- data/app/models/concerns/spree/user_methods.rb +71 -12
- data/app/models/spree/ability.rb +4 -117
- data/app/models/spree/api_key.rb +53 -0
- data/app/models/spree/asset.rb +28 -5
- data/app/models/spree/authentication/strategy_registry.rb +72 -0
- data/app/models/spree/base.rb +18 -1
- data/app/models/spree/channel.rb +159 -0
- data/app/models/spree/country.rb +2 -0
- data/app/models/spree/current.rb +5 -1
- data/app/models/spree/custom_field.rb +9 -0
- data/app/models/spree/custom_field_definition.rb +7 -0
- data/app/models/spree/customer_group.rb +8 -2
- data/app/models/spree/export.rb +30 -3
- data/app/models/spree/gateway.rb +25 -0
- data/app/models/spree/gift_card.rb +1 -1
- data/app/models/spree/gift_card_batch.rb +4 -1
- data/app/models/spree/import.rb +5 -0
- data/app/models/spree/import_row.rb +12 -0
- data/app/models/spree/line_item.rb +6 -1
- data/app/models/spree/market.rb +32 -1
- data/app/models/spree/metafield.rb +38 -0
- data/app/models/spree/metafield_definition.rb +29 -6
- data/app/models/spree/metafields/json.rb +10 -0
- data/app/models/spree/newsletter_subscriber.rb +19 -3
- data/app/models/spree/option_type.rb +48 -7
- data/app/models/spree/order/checkout.rb +3 -3
- data/app/models/spree/order.rb +102 -6
- data/app/models/spree/order_approval.rb +19 -0
- data/app/models/spree/order_cancellation.rb +19 -0
- data/app/models/spree/order_routing/has_strategy_preference.rb +28 -0
- data/app/models/spree/order_routing/rules/default_location.rb +16 -0
- data/app/models/spree/order_routing/rules/minimize_splits.rb +45 -0
- data/app/models/spree/order_routing/rules/preferred_location.rb +22 -0
- data/app/models/spree/order_routing/strategy/base.rb +47 -0
- data/app/models/spree/order_routing/strategy/legacy.rb +33 -0
- data/app/models/spree/order_routing/strategy/reducer.rb +68 -0
- data/app/models/spree/order_routing/strategy/rules.rb +81 -0
- data/app/models/spree/order_routing_rule.rb +75 -0
- data/app/models/spree/permission_sets/configuration_management.rb +16 -0
- data/app/models/spree/permission_sets/product_display.rb +2 -0
- data/app/models/spree/permission_sets/product_management.rb +2 -0
- data/app/models/spree/price.rb +14 -1
- data/app/models/spree/price_list.rb +129 -17
- data/app/models/spree/price_rule.rb +11 -1
- data/app/models/spree/price_rules/customer_group_rule.rb +15 -1
- data/app/models/spree/price_rules/market_rule.rb +16 -1
- data/app/models/spree/price_rules/user_rule.rb +21 -2
- data/app/models/spree/product/channels.rb +149 -0
- data/app/models/spree/product/legacy_multi_store_support.rb +40 -0
- data/app/models/spree/product/slugs.rb +1 -1
- data/app/models/spree/product.rb +172 -31
- data/app/models/spree/product_publication.rb +43 -0
- data/app/models/spree/promotion/actions/create_adjustment.rb +4 -0
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +4 -0
- data/app/models/spree/promotion/actions/create_line_items.rb +32 -14
- data/app/models/spree/promotion/rules/country.rb +40 -18
- data/app/models/spree/promotion/rules/customer_group.rb +10 -1
- data/app/models/spree/promotion/rules/product.rb +4 -0
- data/app/models/spree/promotion/rules/taxon.rb +24 -1
- data/app/models/spree/promotion/rules/user.rb +21 -0
- data/app/models/spree/promotion/rules/user_logged_in.rb +6 -0
- data/app/models/spree/promotion.rb +22 -1
- data/app/models/spree/promotion_action.rb +17 -11
- data/app/models/spree/promotion_rule.rb +17 -18
- data/app/models/spree/search_provider/meilisearch.rb +12 -2
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +89 -9
- data/app/models/spree/stock_item.rb +36 -0
- data/app/models/spree/stock_location.rb +52 -0
- data/app/models/spree/stock_reservation.rb +38 -0
- data/app/models/spree/stock_reservations/insufficient_stock_error.rb +12 -0
- data/app/models/spree/store.rb +18 -72
- data/app/models/spree/store_credit.rb +0 -8
- data/app/models/spree/store_product.rb +11 -23
- data/app/models/spree/taxon.rb +0 -5
- data/app/models/spree/user_identity.rb +1 -2
- data/app/models/spree/variant.rb +132 -18
- data/app/models/spree/variant_media.rb +46 -0
- data/app/models/spree/webhook_delivery.rb +1 -23
- data/app/models/spree/webhook_endpoint.rb +24 -0
- data/app/models/spree/wished_item.rb +0 -13
- data/app/presenters/spree/csv/product_variant_presenter.rb +23 -3
- data/app/presenters/spree/data_feeds/google_presenter.rb +1 -28
- data/app/presenters/spree/search_provider/product_presenter.rb +11 -4
- data/app/presenters/spree/variant_presenter.rb +4 -3
- data/app/services/spree/addresses/update.rb +6 -8
- data/app/services/spree/cart/add_item.rb +10 -0
- data/app/services/spree/cart/empty.rb +2 -0
- data/app/services/spree/cart/remove_line_item.rb +10 -0
- data/app/services/spree/cart/remove_out_of_stock_items.rb +1 -1
- data/app/services/spree/cart/set_quantity.rb +10 -0
- data/app/services/spree/carts/complete.rb +1 -0
- data/app/services/spree/carts/create.rb +1 -0
- data/app/services/spree/carts/update.rb +18 -2
- data/app/services/spree/carts/upsert_items.rb +6 -6
- data/app/services/spree/imports/row_processors/customer.rb +4 -1
- data/app/services/spree/imports/row_processors/product_variant.rb +95 -57
- data/app/services/spree/newsletter/link_user.rb +53 -0
- data/app/services/spree/newsletter/subscribe.rb +31 -9
- data/app/services/spree/orders/approve.rb +27 -6
- data/app/services/spree/orders/build_shipments.rb +29 -0
- data/app/services/spree/orders/cancel.rb +34 -3
- data/app/services/spree/orders/complete.rb +53 -0
- data/app/services/spree/orders/create.rb +156 -0
- data/app/services/spree/orders/update.rb +51 -0
- data/app/services/spree/orders/upsert_items.rb +70 -0
- data/app/services/spree/prices/bulk_upsert.rb +201 -0
- data/app/services/spree/products/duplicator.rb +1 -1
- data/app/services/spree/products/prepare_nested_attributes.rb +2 -30
- data/app/services/spree/sample_data/loader.rb +30 -0
- data/app/services/spree/stock_reservations/extend.rb +19 -0
- data/app/services/spree/stock_reservations/release.rb +12 -0
- data/app/services/spree/stock_reservations/reserve.rb +103 -0
- data/app/services/spree/taxons/remove_products.rb +7 -1
- data/app/subscribers/spree/product_metrics_subscriber.rb +3 -7
- data/app/views/spree/invitation_mailer/invitation_email.html.erb +4 -0
- data/config/locales/en.yml +27 -10
- data/config/routes.rb +9 -0
- data/db/migrate/20260429000001_create_spree_order_cancellations.rb +25 -0
- data/db/migrate/20260429000002_create_spree_order_approvals.rb +22 -0
- data/db/migrate/20260429000003_add_status_to_spree_orders.rb +6 -0
- data/db/migrate/20260429000004_add_scopes_to_spree_api_keys.rb +11 -0
- data/db/migrate/20260501000001_create_spree_stock_reservations.rb +19 -0
- data/db/migrate/20260507162651_create_spree_variant_media.rb +23 -0
- data/db/migrate/20260508175303_add_pickup_to_spree_stock_locations.rb +12 -0
- data/db/migrate/20260508204040_create_spree_channels.rb +18 -0
- data/db/migrate/20260508204041_create_spree_order_routing_rules.rb +18 -0
- data/db/migrate/20260508204042_add_preferred_stock_location_to_spree_orders.rb +5 -0
- data/db/migrate/20260508204043_add_channel_id_to_spree_orders.rb +10 -0
- data/db/migrate/20260511000001_backfill_status_on_spree_orders.rb +57 -0
- data/db/migrate/20260515000001_add_store_id_to_spree_newsletter_subscribers.rb +25 -0
- data/db/migrate/20260529000001_add_unique_index_to_spree_price_rules.rb +41 -0
- data/db/migrate/20260529000002_add_unique_index_to_spree_promotion_rules.rb +37 -0
- data/db/migrate/20260601000001_create_spree_product_publications.rb +14 -0
- data/db/migrate/20260601000002_add_store_id_to_spree_products.rb +16 -0
- data/db/migrate/20260602000001_add_default_to_spree_channels.rb +14 -0
- data/db/sample_data/channels.rb +12 -0
- data/db/sample_data/orders.rb +1 -1
- data/db/sample_data/products.csv +212 -212
- data/lib/generators/spree/api_resource/api_resource_generator.rb +353 -0
- data/lib/generators/spree/api_resource/templates/admin_controller.rb.tt +23 -0
- data/lib/generators/spree/api_resource/templates/admin_controller_spec.rb.tt +59 -0
- data/lib/generators/spree/api_resource/templates/admin_serializer.rb.tt +11 -0
- data/lib/generators/spree/api_resource/templates/factory.rb.tt +26 -0
- data/lib/generators/spree/api_resource/templates/store_aliased_serializer.rb.tt +12 -0
- data/lib/generators/spree/api_resource/templates/store_controller.rb.tt +31 -0
- data/lib/generators/spree/api_resource/templates/store_controller_spec.rb.tt +61 -0
- data/lib/generators/spree/api_resource/templates/store_serializer.rb.tt +14 -0
- data/lib/generators/spree/controller_decorator/controller_decorator_generator.rb +66 -0
- data/lib/generators/spree/controller_decorator/templates/controller_decorator.rb.tt +25 -0
- data/lib/generators/spree/model/model_generator.rb +73 -7
- data/lib/generators/spree/model/templates/create_table_migration.rb.tt +40 -0
- data/lib/generators/spree/model/templates/model.rb.tt +28 -2
- data/lib/spree/core/configuration.rb +7 -0
- data/lib/spree/core/controller_helpers/auth.rb +0 -12
- data/lib/spree/core/controller_helpers/currency.rb +0 -17
- data/lib/spree/core/controller_helpers/order.rb +0 -19
- data/lib/spree/core/dependencies.rb +5 -2
- data/lib/spree/core/engine.rb +54 -7
- data/lib/spree/core/permission_configuration.rb +15 -0
- data/lib/spree/core/preferences/masking.rb +47 -0
- data/lib/spree/core/preferences/preferable_class_methods.rb +7 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +56 -5
- data/lib/spree/permitted_attributes.rb +9 -7
- data/lib/spree/testing_support/factories/address_factory.rb +16 -9
- data/lib/spree/testing_support/factories/api_key_factory.rb +1 -0
- data/lib/spree/testing_support/factories/channel_factory.rb +8 -0
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -8
- data/lib/spree/testing_support/factories/newsletter_subscriber_factory.rb +2 -0
- data/lib/spree/testing_support/factories/product_factory.rb +16 -7
- data/lib/spree/testing_support/factories/product_publication_factory.rb +6 -0
- data/lib/spree/testing_support/factories/refresh_token_factory.rb +15 -0
- data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
- data/lib/spree/testing_support/factories/stock_reservation_factory.rb +31 -0
- data/lib/spree/testing_support/factories/variant_factory.rb +3 -3
- data/lib/spree/testing_support/order_walkthrough.rb +1 -1
- data/lib/spree/testing_support/store.rb +10 -0
- data/lib/spree/upgrades/5_4_to_5_5/manifest.yml +53 -0
- data/lib/tasks/channels.rake +94 -0
- data/lib/tasks/core.rake +1 -0
- data/lib/tasks/media.rake +27 -0
- data/lib/tasks/products.rake +4 -6
- data/lib/tasks/publications.rake +60 -0
- data/lib/tasks/upgrade.rake +211 -0
- metadata +83 -19
- data/app/finders/spree/variants/visible_finder.rb +0 -23
- data/app/models/concerns/spree/webhook_payload_redaction.rb +0 -88
- data/app/paginators/spree/shared/paginate.rb +0 -30
- data/app/presenters/spree/filters/price_presenter.rb +0 -23
- data/app/presenters/spree/filters/price_range_presenter.rb +0 -30
- data/app/presenters/spree/filters/quantified_price_range_presenter.rb +0 -45
- data/app/presenters/spree/product_summary_presenter.rb +0 -27
- data/app/presenters/spree/variants/options_presenter.rb +0 -82
- data/app/services/spree/classifications/reposition.rb +0 -23
- data/app/sorters/spree/orders/sort.rb +0 -10
- data/lib/spree/core/controller_helpers/common.rb +0 -14
- data/lib/spree/core/token_generator.rb +0 -23
- data/lib/spree/database_type_utilities.rb +0 -22
- data/lib/spree/testing_support/bar_ability.rb +0 -14
- data/lib/spree/testing_support/factories/store_product_factory.rb +0 -6
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Spree
|
|
4
|
-
# Keeps single-use credentials out of the persisted webhook delivery log.
|
|
5
|
-
#
|
|
6
|
-
# Some events must carry a live credential to their subscriber — a storefront
|
|
7
|
-
# that owns its transactional emails needs the real password reset token to
|
|
8
|
-
# build the email. Delivering it over TLS to a merchant-configured endpoint is
|
|
9
|
-
# intended; keeping a readable copy in `spree_webhook_deliveries.payload` is
|
|
10
|
-
# not, because that column is queryable and is served back through the Admin
|
|
11
|
-
# API delivery log.
|
|
12
|
-
#
|
|
13
|
-
# Sensitive values are therefore replaced with {REDACTION_PLACEHOLDER} before
|
|
14
|
-
# the record is written, and re-attached in memory at send time so the
|
|
15
|
-
# outgoing request body is unchanged.
|
|
16
|
-
module WebhookPayloadRedaction
|
|
17
|
-
extend ActiveSupport::Concern
|
|
18
|
-
|
|
19
|
-
# Payload keys under `data` whose values are live credentials.
|
|
20
|
-
SENSITIVE_PAYLOAD_KEYS = %w[reset_token unsubscribe_token].freeze
|
|
21
|
-
|
|
22
|
-
REDACTION_PLACEHOLDER = '[REDACTED]'
|
|
23
|
-
|
|
24
|
-
# Splits a payload into the version safe to persist and the secrets held
|
|
25
|
-
# back from it.
|
|
26
|
-
#
|
|
27
|
-
# @param payload [Hash] the full event payload
|
|
28
|
-
# @return [Array(Hash, Hash)] redacted payload, and the extracted secrets
|
|
29
|
-
# keyed as they appeared under `data`
|
|
30
|
-
def self.split(payload)
|
|
31
|
-
secrets = {}
|
|
32
|
-
|
|
33
|
-
redacted = transform_data_hashes(payload) do |data|
|
|
34
|
-
data.to_h do |key, value|
|
|
35
|
-
if SENSITIVE_PAYLOAD_KEYS.include?(key.to_s) && value.present?
|
|
36
|
-
secrets[secret_key_for(key)] = value
|
|
37
|
-
[key, REDACTION_PLACEHOLDER]
|
|
38
|
-
else
|
|
39
|
-
[key, value]
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
secrets.empty? ? [payload, {}] : [redacted, secrets]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Re-attaches previously extracted secrets to a redacted payload.
|
|
48
|
-
#
|
|
49
|
-
# @param payload [Hash] the redacted payload
|
|
50
|
-
# @param secrets [Hash] secrets returned by {split}
|
|
51
|
-
# @return [Hash] the payload as it should go over the wire
|
|
52
|
-
def self.merge(payload, secrets)
|
|
53
|
-
return payload if secrets.blank?
|
|
54
|
-
|
|
55
|
-
transform_data_hashes(payload) do |data|
|
|
56
|
-
data.to_h do |key, value|
|
|
57
|
-
secret = secrets[secret_key_for(key)]
|
|
58
|
-
[key, secret.presence || value]
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Applies +block+ to every `data` hash on the payload.
|
|
64
|
-
#
|
|
65
|
-
# Both key forms are visited rather than only the first match: a payload
|
|
66
|
-
# carrying `:data` *and* `'data'` would otherwise leave one of them
|
|
67
|
-
# unredacted.
|
|
68
|
-
def self.transform_data_hashes(payload)
|
|
69
|
-
return payload unless payload.is_a?(Hash)
|
|
70
|
-
|
|
71
|
-
[:data, 'data'].reduce(payload) do |result, data_key|
|
|
72
|
-
data = result[data_key]
|
|
73
|
-
next result unless data.is_a?(Hash)
|
|
74
|
-
|
|
75
|
-
result.merge(data_key => yield(data))
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
private_class_method :transform_data_hashes
|
|
79
|
-
|
|
80
|
-
# Secrets are keyed by name alone. They cross an ActiveJob serialization
|
|
81
|
-
# boundary, which coerces symbol keys to strings, so the key form at split
|
|
82
|
-
# time cannot be relied on to still match at merge time.
|
|
83
|
-
def self.secret_key_for(key)
|
|
84
|
-
key.to_s
|
|
85
|
-
end
|
|
86
|
-
private_class_method :secret_key_for
|
|
87
|
-
end
|
|
88
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Shared
|
|
3
|
-
class Paginate
|
|
4
|
-
def initialize(collection, params)
|
|
5
|
-
Spree::Deprecation.warn('Spree::Shared::Paginate is deprecated and will be removed in Spree 5.5. Please use Kaminari instead.')
|
|
6
|
-
|
|
7
|
-
raise 'Kaminari is not installed. Please add it to your Gemfile.' unless defined?(Kaminari)
|
|
8
|
-
|
|
9
|
-
@collection = collection
|
|
10
|
-
@page = params[:page]
|
|
11
|
-
|
|
12
|
-
per_page_limit = Spree::Api::Config[:api_v2_per_page_limit]
|
|
13
|
-
|
|
14
|
-
@per_page = if params[:per_page].to_i.between?(1, per_page_limit)
|
|
15
|
-
params[:per_page]
|
|
16
|
-
else
|
|
17
|
-
Kaminari.config.default_per_page
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def call
|
|
22
|
-
collection.page(page).per(per_page)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
attr_reader :collection, :page, :per_page
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Filters
|
|
3
|
-
class PricePresenter
|
|
4
|
-
def initialize(amount:, currency:)
|
|
5
|
-
Spree::Deprecation.warn('Spree::Filters::PricePresenter is deprecated and will be removed in Spree 5.5.')
|
|
6
|
-
@amount = amount.to_i
|
|
7
|
-
@currency = currency
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def to_i
|
|
11
|
-
amount
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def to_s
|
|
15
|
-
Spree::Money.new(amount, currency: currency, no_cents_if_whole: true).to_s
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
private
|
|
19
|
-
|
|
20
|
-
attr_reader :amount, :currency
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Filters
|
|
3
|
-
class PriceRangePresenter
|
|
4
|
-
def self.from_param(param, currency:)
|
|
5
|
-
prices = param.split('-')
|
|
6
|
-
|
|
7
|
-
new(
|
|
8
|
-
min_price: PricePresenter.new(amount: prices.first, currency: currency),
|
|
9
|
-
max_price: PricePresenter.new(amount: prices.last, currency: currency)
|
|
10
|
-
)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def initialize(min_price:, max_price:)
|
|
14
|
-
Spree::Deprecation.warn('Spree::Filters::PriceRangePresenter is deprecated and will be removed in Spree 5.5.')
|
|
15
|
-
@min_price = min_price
|
|
16
|
-
@max_price = max_price
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
attr_reader :min_price, :max_price
|
|
20
|
-
|
|
21
|
-
def to_param
|
|
22
|
-
"#{min_price.to_i}-#{max_price.to_i}"
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def to_s
|
|
26
|
-
"#{min_price} - #{max_price}"
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Filters
|
|
3
|
-
class QuantifiedPriceRangePresenter
|
|
4
|
-
ALLOWED_QUANTIFIERS = [
|
|
5
|
-
:less_than,
|
|
6
|
-
:more_than
|
|
7
|
-
].freeze
|
|
8
|
-
|
|
9
|
-
def initialize(price:, quantifier:)
|
|
10
|
-
Spree::Deprecation.warn('Spree::Filters::QuantifiedPriceRangePresenter is deprecated and will be removed in Spree 5.5.')
|
|
11
|
-
if ALLOWED_QUANTIFIERS.exclude?(quantifier.to_sym)
|
|
12
|
-
raise ArgumentError, "quantifier must be one of: #{ALLOWED_QUANTIFIERS.join(', ')}"
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
@price = price
|
|
16
|
-
@quantifier = quantifier.to_sym
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def to_param
|
|
20
|
-
case quantifier
|
|
21
|
-
when :less_than
|
|
22
|
-
less_than_param
|
|
23
|
-
when :more_than
|
|
24
|
-
more_than_param
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def to_s
|
|
29
|
-
"#{I18n.t("activerecord.attributes.spree/product.#{quantifier}")} #{price}"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
attr_reader :price, :quantifier
|
|
35
|
-
|
|
36
|
-
def less_than_param
|
|
37
|
-
"0-#{price.to_i}"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def more_than_param
|
|
41
|
-
"#{price.to_i}-Infinity"
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
class ProductSummaryPresenter
|
|
3
|
-
include Rails.application.routes.url_helpers
|
|
4
|
-
|
|
5
|
-
def initialize(product)
|
|
6
|
-
Spree::Deprecation.warn('Spree::ProductSummaryPresenter is deprecated and will be removed in Spree 5.5.')
|
|
7
|
-
@product = product
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def call
|
|
11
|
-
{
|
|
12
|
-
name: @product.name,
|
|
13
|
-
images: images
|
|
14
|
-
}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
def images
|
|
20
|
-
@product.images.map do |image|
|
|
21
|
-
{
|
|
22
|
-
url_product: rails_representation_url(image.url(:product), only_path: true)
|
|
23
|
-
}
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Variants
|
|
3
|
-
class OptionsPresenter
|
|
4
|
-
WORDS_CONNECTOR = ', '.freeze
|
|
5
|
-
|
|
6
|
-
attr_reader :variant
|
|
7
|
-
|
|
8
|
-
delegate :option_values, to: :variant
|
|
9
|
-
|
|
10
|
-
def initialize(variant)
|
|
11
|
-
Spree::Deprecation.warn('Spree::Variants::OptionsPresenter is deprecated and will be removed in Spree 5.5. Please use Spree::Variant#options_text instead.')
|
|
12
|
-
@variant = variant
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def to_sentence
|
|
16
|
-
options = option_values
|
|
17
|
-
options = sort_options(options)
|
|
18
|
-
options = present_options(options)
|
|
19
|
-
|
|
20
|
-
join_options(options)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def to_hash
|
|
24
|
-
options = option_values
|
|
25
|
-
options = sort_options(options)
|
|
26
|
-
options = present_options_as_hash(options)
|
|
27
|
-
|
|
28
|
-
join_hash_options(options)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
def sort_options(options)
|
|
34
|
-
if options.first&.association(:option_type)&.loaded?
|
|
35
|
-
options.sort_by { |o| o.option_type.position }
|
|
36
|
-
else
|
|
37
|
-
options.includes(:option_type).sort_by { |o| o.option_type.position }
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def present_options(options)
|
|
42
|
-
options.map do |ov|
|
|
43
|
-
method = "present_#{ov.option_type.name}_option"
|
|
44
|
-
|
|
45
|
-
respond_to?(method, true) ? send(method, ov) : present_option(ov)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def present_color_option(option)
|
|
50
|
-
"#{option.option_type.presentation}: #{option.presentation}"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def present_option(option)
|
|
54
|
-
"#{option.option_type.presentation}: #{option.presentation}"
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def join_options(options)
|
|
58
|
-
options.to_sentence(words_connector: WORDS_CONNECTOR, two_words_connector: WORDS_CONNECTOR)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def present_options_as_hash(options)
|
|
62
|
-
options.map do |ov|
|
|
63
|
-
method = "present_#{ov.option_type.name}_option_as_hash"
|
|
64
|
-
|
|
65
|
-
respond_to?(method, true) ? send(method, ov) : present_option_as_hash(ov)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def present_option_as_hash(option)
|
|
70
|
-
{}.tap do |hash|
|
|
71
|
-
hash.store(option.option_type.presentation.downcase, option.presentation)
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def join_hash_options(options)
|
|
76
|
-
return {} if options.empty?
|
|
77
|
-
|
|
78
|
-
options.inject(:merge).symbolize_keys
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Classifications
|
|
3
|
-
# @deprecated This service is deprecated and will be removed in Spree 5.5.
|
|
4
|
-
class Reposition
|
|
5
|
-
prepend Spree::ServiceModule::Base
|
|
6
|
-
|
|
7
|
-
def call(classification:, position:)
|
|
8
|
-
Spree::Deprecation.warn(
|
|
9
|
-
"#{self.class.name} is deprecated and will be removed in Spree 5.5.",
|
|
10
|
-
caller_locations(2)
|
|
11
|
-
)
|
|
12
|
-
if position.is_a?(String) && !position.match(/^\d+$/)
|
|
13
|
-
return failure(nil, I18n.t('errors.messages.not_a_number'))
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# Because position we get back is 0-indexed.
|
|
17
|
-
# acts_as_list is 1-indexed.
|
|
18
|
-
classification.insert_at(position.to_i + 1)
|
|
19
|
-
success(classification)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Core
|
|
3
|
-
module ControllerHelpers
|
|
4
|
-
# @deprecated This module is deprecated and will be removed in Spree 5.5.
|
|
5
|
-
module Common
|
|
6
|
-
def self.included(base)
|
|
7
|
-
Spree::Deprecation.warn(
|
|
8
|
-
'Spree::Core::ControllerHelpers::Common is deprecated and will be removed in Spree 5.5.'
|
|
9
|
-
)
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Core
|
|
3
|
-
module TokenGenerator
|
|
4
|
-
def generate_token(model_class = Spree::Order)
|
|
5
|
-
Spree::Deprecation.warn('generate_token is deprecated and will be removed in Spree 5.5. Please use Rails secure token generator: https://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html')
|
|
6
|
-
loop do
|
|
7
|
-
token = "#{random_token}#{unique_ending}"
|
|
8
|
-
break token unless model_class.exists?(token: token)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
14
|
-
def random_token
|
|
15
|
-
SecureRandom.urlsafe_base64(nil, false)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def unique_ending
|
|
19
|
-
(Time.now.to_f * 1000).to_i
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
# @deprecated Use the integer constant directly instead, eg. `2_147_483_647` for 4-byte signed integer max.
|
|
3
|
-
# This module will be removed in Spree 5.5.
|
|
4
|
-
module DatabaseTypeUtilities
|
|
5
|
-
# Maximum value for a 4-byte signed integer (default database integer type)
|
|
6
|
-
INTEGER_MAX = (2**31) - 1
|
|
7
|
-
|
|
8
|
-
def self.maximum_value_for(data_type)
|
|
9
|
-
Spree::Deprecation.warn(
|
|
10
|
-
'Spree::DatabaseTypeUtilities.maximum_value_for is deprecated and will be removed in Spree 5.5. ' \
|
|
11
|
-
'Use the integer constant directly instead, eg. 2_147_483_647 for 4-byte signed integer max.'
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
case data_type
|
|
15
|
-
when :integer
|
|
16
|
-
INTEGER_MAX
|
|
17
|
-
else
|
|
18
|
-
raise ArgumentError, 'Currently only :integer argument is acceptable'
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Fake ability for testing administration
|
|
2
|
-
class BarAbility
|
|
3
|
-
include CanCan::Ability
|
|
4
|
-
|
|
5
|
-
def initialize(user)
|
|
6
|
-
user ||= Spree::User.new
|
|
7
|
-
if user.has_spree_role? 'bar'
|
|
8
|
-
# allow dispatch to :admin, :index, and :show on Spree::Order
|
|
9
|
-
can [:admin, :index, :show], Spree::Order
|
|
10
|
-
# allow dispatch to :index, :show, :create and :update shipments on the admin
|
|
11
|
-
can [:admin, :manage], Spree::Shipment
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|