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/LICENSE.md
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# License
|
|
2
|
-
|
|
3
|
-
Copyright © 2024-present, Vendo Connect Inc.
|
|
4
|
-
|
|
5
|
-
Copyright © 2015-2024, Spark Solutions Sp. z o.o.
|
|
6
|
-
|
|
7
|
-
Copyright © 2007-2015, Spree Commerce Inc.
|
|
8
|
-
|
|
9
|
-
Spree Commerce is a free, open-source eCommerce framework giving you full control and customizability.
|
|
10
|
-
|
|
11
|
-
For **Spree Commerce versions 4.10** and later in the [spree/spree](https://github.com/spree/spree) repository two licenses apply simultaneously and users are required to comply with the terms of these two licenses at the same time:
|
|
12
|
-
|
|
13
|
-
* [AGPL-3.0](https://opensource.org/license/agpl-v3) - for all contributions from version 4.10 onwards
|
|
14
|
-
|
|
15
|
-
* [BSD-3-Clause](https://opensource.org/license/bsd-3-clause) - for all other contributions predating version 4.10
|
|
16
|
-
Effectively, for versions 4.10 and upwards **AGPL-3.0** license applies.
|
|
17
|
-
|
|
18
|
-
**Spree Commerce versions 4.9** and earlier in the [spree/spree](https://github.com/spree/spree) repository are available under the **BSD-3-Clause** license and users are required to comply with its terms.
|
|
19
|
-
|
|
20
|
-
If you’d like to use Spree Commerce without the AGPL-3.0 restrictions e.g. for a **SaaS** business, please talk to us about obtaining a [Commercial License](#commercial-license).
|
|
21
|
-
|
|
22
|
-
All third party components incorporated into this software are licensed under the original license provided by the owner of the applicable component.
|
|
23
|
-
|
|
24
|
-
Please refer to our [Licensing FAQ](https://spreecommerce.org/why-spree-is-changing-its-open-source-license-to-agpl-3-0-and-introducing-a-commercial-license/) in case of questions.
|
|
25
|
-
|
|
26
|
-
## AGPL-3.0 License - Spree 4.10 upwards
|
|
27
|
-
|
|
28
|
-
If you decide to accept the AGPL-3.0 license by using Spree Commerce version 4.10 or later, you must comply with the following terms:
|
|
29
|
-
|
|
30
|
-
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
31
|
-
|
|
32
|
-
This program is distributed in the hope that it will be useful,
|
|
33
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
34
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
35
|
-
GNU Affero General Public License for more details.
|
|
36
|
-
|
|
37
|
-
You should have received a copy of the GNU Affero General Public License
|
|
38
|
-
along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
|
|
39
|
-
|
|
40
|
-
## BSD 3-Clause License
|
|
41
|
-
|
|
42
|
-
If you decide to accept the BSD-3-Clause license by using Spree Commerce, you must comply with the following terms:
|
|
43
|
-
|
|
44
|
-
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
45
|
-
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
46
|
-
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
47
|
-
Neither the name of Spree Commerce Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
|
48
|
-
|
|
49
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
50
|
-
|
|
51
|
-
## Commercial License
|
|
52
|
-
|
|
53
|
-
Should you decide to use Spree Commerce version 4.10 or later for commercial redistribution (eg. SaaS) - also known as Commercial Distribution - you must do so in accordance with the terms and conditions contained in a separate written agreement between you and [Vendo Connect Inc.](https://www.getvendo.com/).
|
|
54
|
-
|
|
55
|
-
For more information about the Commercial License (CL) please contact [sales@getvendo.com](mailto:sales@getvendo.com).
|
|
56
|
-
|
|
57
|
-
Please refer to our [Licensing FAQ](https://spreecommerce.org/why-spree-is-changing-its-open-source-license-to-agpl-3-0-and-introducing-a-commercial-license/) in case of questions.
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Posts
|
|
3
|
-
class Find < Spree::BaseFinder
|
|
4
|
-
def initialize(scope:, params:)
|
|
5
|
-
super(scope: scope, params: params)
|
|
6
|
-
@scope = scope
|
|
7
|
-
@query = params[:q].presence&.strip
|
|
8
|
-
@ids = String(params.dig(:filter, :ids)).split(',')
|
|
9
|
-
@slugs = String(params.dig(:filter, :slugs)).split(',')
|
|
10
|
-
@category_ids = String(params.dig(:filter, :category_ids)).split(',')
|
|
11
|
-
@author_ids = String(params.dig(:filter, :author_ids)).split(',')
|
|
12
|
-
@tags = params.dig(:filter, :tags).to_s.split(',').compact_blank
|
|
13
|
-
@sort_by = params[:sort_by]
|
|
14
|
-
@published = params.dig(:filter, :published)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def execute
|
|
18
|
-
posts = by_ids(scope)
|
|
19
|
-
posts = by_slugs(posts)
|
|
20
|
-
posts = by_query(posts)
|
|
21
|
-
posts = by_category_ids(posts)
|
|
22
|
-
posts = by_author_ids(posts)
|
|
23
|
-
posts = by_tags(posts)
|
|
24
|
-
posts = by_published(posts)
|
|
25
|
-
posts = ordered(posts)
|
|
26
|
-
|
|
27
|
-
posts.distinct
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
attr_reader :scope, :query, :ids, :slugs, :category_ids, :author_ids, :tags, :sort_by, :published
|
|
33
|
-
|
|
34
|
-
def query?
|
|
35
|
-
query.present?
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def ids?
|
|
39
|
-
ids.present?
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def slugs?
|
|
43
|
-
slugs.present?
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def category_ids?
|
|
47
|
-
category_ids.present?
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def author_ids?
|
|
51
|
-
author_ids.present?
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def tags?
|
|
55
|
-
tags.present?
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def published?
|
|
59
|
-
published.present?
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def sort_by?
|
|
63
|
-
sort_by.present?
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def by_query(posts)
|
|
67
|
-
return posts unless query?
|
|
68
|
-
|
|
69
|
-
posts.search_by_title(query)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def by_ids(posts)
|
|
73
|
-
return posts unless ids?
|
|
74
|
-
|
|
75
|
-
posts.where(id: ids)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def by_slugs(posts)
|
|
79
|
-
return posts unless slugs?
|
|
80
|
-
|
|
81
|
-
posts.where(slug: slugs)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def by_category_ids(posts)
|
|
85
|
-
return posts unless category_ids?
|
|
86
|
-
|
|
87
|
-
posts.where(post_category_id: category_ids)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def by_author_ids(posts)
|
|
91
|
-
return posts unless author_ids?
|
|
92
|
-
|
|
93
|
-
posts.where(author_id: author_ids)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def by_tags(posts)
|
|
97
|
-
return posts if tags.empty?
|
|
98
|
-
|
|
99
|
-
posts.tagged_with(tags, any: true)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def by_published(posts)
|
|
103
|
-
return posts unless published?
|
|
104
|
-
|
|
105
|
-
case published.to_s
|
|
106
|
-
when 'true'
|
|
107
|
-
posts.published
|
|
108
|
-
when 'false'
|
|
109
|
-
posts.where(published_at: nil)
|
|
110
|
-
else
|
|
111
|
-
posts
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def ordered(posts)
|
|
116
|
-
return posts unless sort_by?
|
|
117
|
-
|
|
118
|
-
case sort_by
|
|
119
|
-
when 'newest-first'
|
|
120
|
-
posts.by_newest
|
|
121
|
-
when 'oldest-first'
|
|
122
|
-
posts.order(created_at: :asc)
|
|
123
|
-
when 'published-newest'
|
|
124
|
-
posts.order(published_at: :desc)
|
|
125
|
-
when 'published-oldest'
|
|
126
|
-
posts.order(published_at: :asc)
|
|
127
|
-
when 'title-a-z'
|
|
128
|
-
posts.order(title: :asc)
|
|
129
|
-
when 'title-z-a'
|
|
130
|
-
posts.order(title: :desc)
|
|
131
|
-
else
|
|
132
|
-
posts
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module ProductProperties
|
|
3
|
-
class FindAvailable
|
|
4
|
-
include ProductFilterable
|
|
5
|
-
|
|
6
|
-
def initialize(scope: ProductProperty.spree_base_scopes, products_scope: Product.spree_base_scopes)
|
|
7
|
-
@scope = scope
|
|
8
|
-
@products_scope = products_scope
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def execute
|
|
12
|
-
find_available(scope, products_scope).includes(:translations)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
attr_reader :scope, :products_scope
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Stores
|
|
3
|
-
class FindCurrent
|
|
4
|
-
def initialize(scope: nil, url: nil)
|
|
5
|
-
@scope = scope || Spree::Store
|
|
6
|
-
@url = url
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def execute
|
|
10
|
-
store = by_url(scope) || scope.default
|
|
11
|
-
return if store.nil?
|
|
12
|
-
|
|
13
|
-
Spree::Current.store = store
|
|
14
|
-
store
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
protected
|
|
18
|
-
|
|
19
|
-
attr_reader :scope, :url
|
|
20
|
-
|
|
21
|
-
def by_url(scope)
|
|
22
|
-
return if url.blank?
|
|
23
|
-
|
|
24
|
-
scope.by_custom_domain(url).or(scope.by_url(url)).first
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module MailHelper
|
|
3
|
-
include Spree::BaseHelper
|
|
4
|
-
include Spree::ImagesHelper
|
|
5
|
-
|
|
6
|
-
def variant_image_url(variant)
|
|
7
|
-
image = variant.default_image
|
|
8
|
-
image.present? && image.attached? ? spree_image_url(image, variant: :mini) : image_url('noimage/small.png')
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def name_for(order)
|
|
12
|
-
order.name || Spree.t('customer')
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def store_logo
|
|
16
|
-
@store_logo ||= current_store&.mailer_logo || current_store&.logo
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def logo_path
|
|
20
|
-
Spree::Deprecation.warn('logo_path is deprecated and will be removed in Spree 5.5. Please use Active Storage URL helpers instead.')
|
|
21
|
-
|
|
22
|
-
return main_app.cdn_image_url(store_logo.variant(resize_to_limit: [244, 104])) if store_logo&.variable?
|
|
23
|
-
|
|
24
|
-
return main_app.cdn_image_url(store_logo) if store_logo&.image?
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module ActionText
|
|
2
|
-
class VideoEmbed < ApplicationRecord
|
|
3
|
-
include ActionText::Attachable
|
|
4
|
-
|
|
5
|
-
validates :url, :raw_html, :thumbnail_url, presence: true
|
|
6
|
-
|
|
7
|
-
# `to_partial_path` for the storefront render is by default "action_text/video_embeds/video_embed"
|
|
8
|
-
|
|
9
|
-
def to_trix_content_attachment_partial_path
|
|
10
|
-
'action_text/video_embeds/thumbnail'
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module HasOneLink
|
|
3
|
-
extend ActiveSupport::Concern
|
|
4
|
-
|
|
5
|
-
included do
|
|
6
|
-
has_one :link, ->(ps) { ps.links }, class_name: 'Spree::PageLink', as: :parent, dependent: :destroy, inverse_of: :parent
|
|
7
|
-
accepts_nested_attributes_for :link
|
|
8
|
-
|
|
9
|
-
def allowed_linkable_types
|
|
10
|
-
[
|
|
11
|
-
[Spree.t(:page), 'Spree::Page'],
|
|
12
|
-
[Spree.t(:product), 'Spree::Product'],
|
|
13
|
-
[Spree.t(:post), 'Spree::Post'],
|
|
14
|
-
[Spree.t(:taxon), 'Spree::Taxon'],
|
|
15
|
-
[Spree.t(:policy), 'Spree::Policy'],
|
|
16
|
-
[Spree.t(:url), nil]
|
|
17
|
-
]
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def default_linkable_type
|
|
21
|
-
'Spree::Page'
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def default_linkable_resource
|
|
25
|
-
@default_linkable_resource ||= theme_or_parent.pages.find_by(type: 'Spree::Pages::Homepage')
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def default_links
|
|
29
|
-
@default_links.presence || [
|
|
30
|
-
Spree::PageLink.new(
|
|
31
|
-
label: Spree.t(:shop_all),
|
|
32
|
-
linkable: theme_or_parent.pages.find_by(type: 'Spree::Pages::ShopAll')
|
|
33
|
-
)
|
|
34
|
-
]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def theme_or_parent
|
|
38
|
-
theme.preview? ? theme.parent : theme
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
module Previewable
|
|
3
|
-
extend ActiveSupport::Concern
|
|
4
|
-
|
|
5
|
-
included do |base|
|
|
6
|
-
belongs_to :parent, class_name: base.name, optional: true, foreign_key: :parent_id
|
|
7
|
-
has_many :previews, class_name: base.name, dependent: :destroy_async, foreign_key: :parent_id
|
|
8
|
-
|
|
9
|
-
scope :without_previews, -> { where(parent_id: nil) }
|
|
10
|
-
scope :only_previews, -> { where.not(parent_id: nil) }
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def preview?
|
|
14
|
-
parent.present?
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
class CustomDomain < Spree::Base
|
|
3
|
-
include Spree::SingleStoreResource
|
|
4
|
-
include Spree::Metafields
|
|
5
|
-
include Spree::Metadata
|
|
6
|
-
|
|
7
|
-
normalizes :url, with: ->(value) { value&.to_s&.squish&.presence }
|
|
8
|
-
|
|
9
|
-
#
|
|
10
|
-
# Associations
|
|
11
|
-
#
|
|
12
|
-
belongs_to :store, class_name: 'Spree::Store', inverse_of: :custom_domains, touch: true
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
# Validations
|
|
16
|
-
#
|
|
17
|
-
validates :url, presence: true, uniqueness: true, format: {
|
|
18
|
-
with: %r{\A(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\z}i
|
|
19
|
-
}, length: { in: 1..63 }
|
|
20
|
-
validate :url_is_valid
|
|
21
|
-
|
|
22
|
-
#
|
|
23
|
-
# Callbacks
|
|
24
|
-
#
|
|
25
|
-
before_validation :sanitize_url
|
|
26
|
-
after_save :ensure_has_one_default
|
|
27
|
-
after_validation :ensure_default, on: :create
|
|
28
|
-
|
|
29
|
-
def url_is_valid
|
|
30
|
-
return if url.blank?
|
|
31
|
-
parts = url.split('.')
|
|
32
|
-
|
|
33
|
-
errors.add(:url, 'use domain or subdomain') if parts.size > 4 || parts.size < 2
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def ensure_default
|
|
37
|
-
self.default = store.custom_domains.count.zero?
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def ensure_has_one_default
|
|
41
|
-
store.custom_domains.where.not(id: id).update_all(default: false) if default?
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def active?
|
|
45
|
-
true
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def name
|
|
49
|
-
url
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
|
|
54
|
-
# remove https:// and http:// from the url
|
|
55
|
-
def sanitize_url
|
|
56
|
-
self.url = url&.gsub(%r{https?://}, '')
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
class DataFeed < Spree.base_class
|
|
3
|
-
belongs_to :store, class_name: 'Spree::Store', foreign_key: 'store_id'
|
|
4
|
-
|
|
5
|
-
scope :for_store, ->(store) { where(store: store) }
|
|
6
|
-
|
|
7
|
-
before_validation :generate_slug
|
|
8
|
-
|
|
9
|
-
with_options presence: true do
|
|
10
|
-
validates :store
|
|
11
|
-
validates :name, uniqueness: true
|
|
12
|
-
validates :slug, uniqueness: { scope: :store_id }
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def formatted_url
|
|
16
|
-
"#{store.formatted_url}/api/v2/data_feeds/#{self.class.provider_name}/#{slug}.rss"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
def generate_slug
|
|
22
|
-
new_slug = slug.blank? ? SecureRandom.uuid : slug.parameterize
|
|
23
|
-
write_attribute(:slug, new_slug)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
class << self
|
|
27
|
-
def label
|
|
28
|
-
raise NotImplementedError
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def provider_name
|
|
32
|
-
raise NotImplementedError
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def available_types
|
|
36
|
-
Spree.data_feed_types
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Bogus Gateway that doesn't support payment profiles
|
|
2
|
-
module Spree
|
|
3
|
-
class Gateway::BogusSimple < Gateway::Bogus
|
|
4
|
-
def payment_profiles_supported?
|
|
5
|
-
false
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def authorize(_money, credit_card, _options = {})
|
|
9
|
-
if VALID_CCS.include? credit_card.number
|
|
10
|
-
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
|
|
11
|
-
else
|
|
12
|
-
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def purchase(_money, credit_card, _options = {})
|
|
17
|
-
if VALID_CCS.include? credit_card.number
|
|
18
|
-
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
|
|
19
|
-
else
|
|
20
|
-
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
data/app/models/spree/post.rb
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
class Post < Spree.base_class
|
|
3
|
-
include Spree::SingleStoreResource
|
|
4
|
-
include Spree::Metafields
|
|
5
|
-
extend FriendlyId
|
|
6
|
-
|
|
7
|
-
publishes_lifecycle_events
|
|
8
|
-
|
|
9
|
-
friendly_id :slug_candidates, use: %i[slugged scoped history], scope: %i[store_id deleted?]
|
|
10
|
-
acts_as_paranoid
|
|
11
|
-
acts_as_taggable_on :tags
|
|
12
|
-
acts_as_taggable_tenant :store_id
|
|
13
|
-
|
|
14
|
-
if defined?(PgSearch)
|
|
15
|
-
include PgSearch::Model
|
|
16
|
-
pg_search_scope :search_by_title, against: :title
|
|
17
|
-
else
|
|
18
|
-
scope :search_by_title, ->(query) { where('title LIKE ?', "%#{query}%") }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
#
|
|
22
|
-
# Ransack filtering
|
|
23
|
-
#
|
|
24
|
-
self.whitelisted_ransackable_attributes = %w[author_id post_category_id published_at]
|
|
25
|
-
self.whitelisted_ransackable_associations = %w[author post_category]
|
|
26
|
-
self.whitelisted_ransackable_scopes = %w[search_by_title]
|
|
27
|
-
|
|
28
|
-
#
|
|
29
|
-
# Attachments
|
|
30
|
-
#
|
|
31
|
-
has_one_attached :image, service: Spree.public_storage_service_name
|
|
32
|
-
|
|
33
|
-
#
|
|
34
|
-
# Rich Text
|
|
35
|
-
#
|
|
36
|
-
has_rich_text :content
|
|
37
|
-
has_rich_text :excerpt
|
|
38
|
-
|
|
39
|
-
#
|
|
40
|
-
# Associations
|
|
41
|
-
#
|
|
42
|
-
belongs_to :author, class_name: Spree.admin_user_class.to_s, optional: true
|
|
43
|
-
belongs_to :store, class_name: 'Spree::Store', inverse_of: :posts
|
|
44
|
-
belongs_to :post_category, class_name: 'Spree::PostCategory', optional: true, touch: true, inverse_of: :posts
|
|
45
|
-
alias category post_category
|
|
46
|
-
|
|
47
|
-
#
|
|
48
|
-
# Validations
|
|
49
|
-
#
|
|
50
|
-
validates :title, :store, presence: true
|
|
51
|
-
validates :slug, presence: true, uniqueness: { scope: :store_id, conditions: -> { where(deleted_at: nil) } }
|
|
52
|
-
validates :meta_title, length: { maximum: 160 }, allow_blank: true
|
|
53
|
-
validates :meta_description, length: { maximum: 320 }, allow_blank: true
|
|
54
|
-
validates :image, content_type: Rails.application.config.active_storage.web_image_content_types
|
|
55
|
-
|
|
56
|
-
#
|
|
57
|
-
# Scopes
|
|
58
|
-
#
|
|
59
|
-
scope :published, -> { where(published_at: [..Time.current]) }
|
|
60
|
-
scope :by_newest, -> { order(created_at: :desc) }
|
|
61
|
-
|
|
62
|
-
delegate :name, to: :author, prefix: true, allow_nil: true
|
|
63
|
-
delegate :title, to: :post_category, prefix: true, allow_nil: true
|
|
64
|
-
|
|
65
|
-
def should_generate_new_friendly_id?
|
|
66
|
-
slug.blank? || (persisted? && title_changed?)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def slug_candidates
|
|
70
|
-
[
|
|
71
|
-
:title,
|
|
72
|
-
[:title, :id]
|
|
73
|
-
]
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def published?
|
|
77
|
-
published_at.present?
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def publish(date = nil)
|
|
81
|
-
update(published_at: date || Time.current)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def unpublish
|
|
85
|
-
update(published_at: nil)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def description
|
|
89
|
-
excerpt.to_plain_text.presence || content.to_plain_text
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def shortened_description
|
|
93
|
-
desc = excerpt.to_plain_text.presence || content.to_plain_text
|
|
94
|
-
desc.length > 320 ? "#{desc[0...320]}..." : desc
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def self.to_tom_select_json
|
|
98
|
-
pluck(:id, :title).map do |id, title|
|
|
99
|
-
{
|
|
100
|
-
id: id,
|
|
101
|
-
name: title
|
|
102
|
-
}
|
|
103
|
-
end.as_json
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
module Spree
|
|
2
|
-
class PostCategory < Spree.base_class
|
|
3
|
-
include Spree::SingleStoreResource
|
|
4
|
-
include Spree::Metafields
|
|
5
|
-
extend FriendlyId
|
|
6
|
-
|
|
7
|
-
publishes_lifecycle_events
|
|
8
|
-
|
|
9
|
-
friendly_id :slug_candidates, use: %i[slugged scoped history], scope: %i[store_id]
|
|
10
|
-
|
|
11
|
-
#
|
|
12
|
-
# Associations
|
|
13
|
-
#
|
|
14
|
-
belongs_to :store, class_name: 'Spree::Store', inverse_of: :post_categories
|
|
15
|
-
has_many :posts, class_name: 'Spree::Post', dependent: :nullify, inverse_of: :post_category
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
# Validations
|
|
19
|
-
#
|
|
20
|
-
validates :title, :store, presence: true
|
|
21
|
-
validates :slug, presence: true, uniqueness: { scope: :store_id }
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
# ActionText
|
|
25
|
-
#
|
|
26
|
-
has_rich_text :description
|
|
27
|
-
|
|
28
|
-
#
|
|
29
|
-
# Ransack
|
|
30
|
-
#
|
|
31
|
-
self.whitelisted_ransackable_attributes = %w[title slug]
|
|
32
|
-
|
|
33
|
-
def should_generate_new_friendly_id?
|
|
34
|
-
slug.blank? || title_changed?
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def slug_candidates
|
|
38
|
-
[
|
|
39
|
-
:title,
|
|
40
|
-
[:title, :id]
|
|
41
|
-
]
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|