solidus_core 1.0.7 → 1.1.0.beta1
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/controllers/spree/base_controller.rb +1 -2
- data/app/helpers/spree/base_helper.rb +4 -5
- data/app/helpers/spree/products_helper.rb +0 -8
- data/app/mailers/spree/carton_mailer.rb +17 -5
- data/app/mailers/spree/order_mailer.rb +12 -4
- data/app/models/concerns/spree/adjustment_source.rb +7 -8
- data/app/models/concerns/spree/default_price.rb +8 -2
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +28 -0
- data/app/models/concerns/spree/user_address_book.rb +125 -0
- data/app/models/concerns/spree/user_api_authentication.rb +6 -2
- data/app/models/concerns/spree/user_methods.rb +5 -6
- data/app/models/spree/ability.rb +1 -38
- data/app/models/spree/address.rb +79 -36
- data/app/models/spree/adjustment.rb +74 -25
- data/app/models/spree/adjustment_reason.rb +1 -1
- data/app/models/spree/app_configuration.rb +35 -0
- data/app/models/spree/carton.rb +3 -3
- data/app/models/spree/country.rb +7 -1
- data/app/models/spree/credit_card.rb +5 -1
- data/app/models/spree/gateway.rb +0 -8
- data/app/models/spree/inventory_unit.rb +1 -1
- data/app/models/spree/item_adjustments.rb +1 -1
- data/app/models/spree/line_item_action.rb +1 -1
- data/app/models/spree/option_type.rb +3 -2
- data/app/models/spree/option_value.rb +1 -1
- data/app/models/spree/option_values_variant.rb +1 -1
- data/app/models/spree/order.rb +28 -56
- data/app/models/spree/order/checkout.rb +18 -20
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_promotion.rb +1 -1
- data/app/models/spree/order_shipping.rb +6 -12
- data/app/models/spree/order_stock_location.rb +1 -1
- data/app/models/spree/payment.rb +3 -14
- data/app/models/spree/payment/processing.rb +7 -14
- data/app/models/spree/payment_method.rb +5 -5
- data/app/models/spree/permission_sets/default_customer.rb +31 -0
- data/app/models/spree/permission_sets/order_display.rb +4 -0
- data/app/models/spree/permission_sets/order_management.rb +3 -0
- data/app/models/spree/permission_sets/promotion_display.rb +2 -1
- data/app/models/spree/permission_sets/restricted_stock_display.rb +16 -0
- data/app/models/spree/permission_sets/restricted_stock_management.rb +16 -0
- data/app/models/spree/permission_sets/restricted_stock_transfer_display.rb +17 -0
- data/app/models/spree/permission_sets/restricted_stock_transfer_management.rb +51 -0
- data/app/models/spree/permission_sets/stock_display.rb +1 -1
- data/app/models/spree/permission_sets/stock_management.rb +1 -2
- data/app/models/spree/permission_sets/stock_transfer_display.rb +10 -0
- data/app/models/spree/permission_sets/stock_transfer_management.rb +11 -0
- data/app/models/spree/permission_sets/super_user.rb +9 -0
- data/app/models/spree/product.rb +66 -28
- data/app/models/spree/product/scopes.rb +7 -22
- data/app/models/spree/product_option_type.rb +1 -1
- data/app/models/spree/product_promotion_rule.rb +6 -0
- data/app/models/spree/product_property.rb +2 -20
- data/app/models/spree/promotion/rules/product.rb +2 -1
- data/app/models/spree/refund.rb +0 -10
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/return_item.rb +5 -3
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +13 -4
- data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +2 -2
- data/app/models/spree/return_reason.rb +1 -1
- data/app/models/spree/role.rb +1 -1
- data/app/models/spree/role_user.rb +1 -1
- data/app/models/spree/shipment.rb +13 -4
- data/app/models/spree/shipping_manifest.rb +9 -3
- data/app/models/spree/shipping_method.rb +2 -3
- data/app/models/spree/shipping_method_zone.rb +6 -0
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock_item.rb +15 -3
- data/app/models/spree/stock_movement.rb +1 -1
- data/app/models/spree/store.rb +3 -0
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/store_credit_category.rb +1 -1
- data/app/models/spree/store_credit_event.rb +1 -1
- data/app/models/spree/store_credit_type.rb +1 -1
- data/app/models/spree/store_credit_update_reason.rb +1 -1
- data/app/models/spree/store_payment_method.rb +6 -0
- data/app/models/spree/tax_rate.rb +3 -10
- data/app/models/spree/taxonomy.rb +1 -1
- data/app/models/spree/transfer_item.rb +1 -1
- data/app/models/spree/unit_cancel.rb +2 -2
- data/app/models/spree/user_address.rb +21 -0
- data/app/models/spree/user_stock_location.rb +1 -1
- data/app/models/spree/variant.rb +28 -13
- data/app/models/spree/variant_property_rule.rb +42 -0
- data/app/models/spree/variant_property_rule_condition.rb +8 -0
- data/app/models/spree/variant_property_rule_value.rb +8 -0
- data/app/models/spree/zone.rb +4 -2
- data/app/views/spree/carton_mailer/shipped_email.text.erb +1 -1
- data/config/locales/en.yml +13 -0
- data/db/default/spree/store_credit.rb +0 -1
- data/db/default/spree/zones.rb +1 -1
- data/db/migrate/20130228210442_create_shipping_method_zone.rb +1 -1
- data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +6 -0
- data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +9 -5
- data/db/migrate/20150731201146_add_spree_user_addresses.rb +16 -0
- data/db/migrate/20150811210350_remove_mandatory_from_adjustments.rb +5 -0
- data/db/migrate/20150811211025_add_finalized_to_spree_adjustments.rb +11 -0
- data/db/migrate/20150820160821_add_store_payment_methods.rb +10 -0
- data/db/migrate/20150824213633_convert_habtm_to_hmt_for_shipping_methods_zones.rb +17 -0
- data/db/migrate/20150824214129_convert_habtm_to_hmt_for_products_promotion_rules.rb +17 -0
- data/db/migrate/20150825204216_drop_spree_gateways.rb +20 -0
- data/db/migrate/20150909123605_create_variant_properties_and_rules.rb +28 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
- data/lib/generators/spree/install/templates/config/initializers/spree.rb +4 -3
- data/lib/spree/core.rb +4 -0
- data/lib/spree/core/controller_helpers/payment_parameters.rb +67 -0
- data/lib/spree/core/delegate_belongs_to.rb +1 -0
- data/lib/spree/core/engine.rb +9 -1
- data/lib/spree/core/importer/order.rb +1 -1
- data/lib/spree/core/role_configuration.rb +1 -1
- data/lib/spree/core/search/variant.rb +20 -2
- data/lib/spree/core/unreturned_item_charger.rb +21 -16
- data/lib/spree/i18n.rb +6 -24
- data/lib/spree/mailer_previews/carton_preview.rb +10 -0
- data/lib/spree/mailer_previews/order_preview.rb +18 -0
- data/lib/spree/permitted_attributes.rb +4 -1
- data/lib/spree/testing_support/capybara_ext.rb +2 -1
- data/lib/spree/testing_support/factories/address_factory.rb +9 -1
- data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -0
- data/lib/spree/testing_support/factories/image_factory.rb +5 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +4 -8
- data/lib/spree/testing_support/factories/user_factory.rb +8 -2
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +6 -0
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +16 -0
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +6 -0
- data/lib/tasks/migrations/migrate_user_addresses.rake +29 -0
- data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
- metadata +40 -238
- data/CHANGELOG.md +0 -1
- data/Gemfile +0 -3
- data/Rakefile +0 -16
- data/app/models/concerns/spree/user_address.rb +0 -30
- data/app/models/spree/permission_sets/restricted_transfer_management.rb +0 -35
- data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +0 -19
- data/lib/spree/i18n/base.rb +0 -17
- data/lib/spree/i18n/initializer.rb +0 -1
- data/lib/spree/testing_support/mail.rb +0 -20
- data/script/rails +0 -9
- data/solidus_core.gemspec +0 -48
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spec/helpers/base_helper_spec.rb +0 -173
- data/spec/helpers/order_helper_spec.rb +0 -12
- data/spec/helpers/products_helper_spec.rb +0 -220
- data/spec/helpers/taxons_helper_spec.rb +0 -17
- data/spec/lib/calculated_adjustments_spec.rb +0 -7
- data/spec/lib/i18n_spec.rb +0 -123
- data/spec/lib/search/base_spec.rb +0 -86
- data/spec/lib/search/variant_spec.rb +0 -92
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -66
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -92
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -16
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
- data/spec/lib/spree/core/current_store_spec.rb +0 -36
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
- data/spec/lib/spree/core/importer/order_spec.rb +0 -431
- data/spec/lib/spree/core/role_configuration_spec.rb +0 -138
- data/spec/lib/spree/core/validators/email_spec.rb +0 -48
- data/spec/lib/spree/localized_number_spec.rb +0 -38
- data/spec/lib/spree/migrations_spec.rb +0 -36
- data/spec/lib/spree/money_spec.rb +0 -127
- data/spec/lib/tasks/exchanges_spec.rb +0 -231
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +0 -115
- data/spec/lib/tasks/order_capturing_spec.rb +0 -56
- data/spec/mailers/carton_mailer_spec.rb +0 -43
- data/spec/mailers/order_mailer_spec.rb +0 -122
- data/spec/mailers/reimbursement_mailer_spec.rb +0 -40
- data/spec/mailers/test_mailer_spec.rb +0 -15
- data/spec/models/spree/ability_spec.rb +0 -276
- data/spec/models/spree/address_spec.rb +0 -250
- data/spec/models/spree/adjustment_reason_spec.rb +0 -13
- data/spec/models/spree/adjustment_spec.rb +0 -177
- data/spec/models/spree/app_configuration_spec.rb +0 -20
- data/spec/models/spree/asset_spec.rb +0 -24
- data/spec/models/spree/calculator/default_tax_spec.rb +0 -127
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
- data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
- data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
- data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -51
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -30
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -36
- data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -47
- data/spec/models/spree/calculator_spec.rb +0 -36
- data/spec/models/spree/carton_spec.rb +0 -133
- data/spec/models/spree/classification_spec.rb +0 -15
- data/spec/models/spree/concerns/display_money_spec.rb +0 -43
- data/spec/models/spree/concerns/user_methods_spec.rb +0 -41
- data/spec/models/spree/credit_card_spec.rb +0 -334
- data/spec/models/spree/customer_return_spec.rb +0 -276
- data/spec/models/spree/exchange_spec.rb +0 -79
- data/spec/models/spree/gateway/bogus_simple.rb +0 -20
- data/spec/models/spree/gateway/bogus_spec.rb +0 -13
- data/spec/models/spree/gateway_spec.rb +0 -82
- data/spec/models/spree/inventory_unit_spec.rb +0 -307
- data/spec/models/spree/item_adjustments_spec.rb +0 -256
- data/spec/models/spree/line_item_spec.rb +0 -191
- data/spec/models/spree/option_type_spec.rb +0 -14
- data/spec/models/spree/option_value_spec.rb +0 -22
- data/spec/models/spree/order/address_spec.rb +0 -50
- data/spec/models/spree/order/adjustments_spec.rb +0 -39
- data/spec/models/spree/order/callbacks_spec.rb +0 -42
- data/spec/models/spree/order/checkout_spec.rb +0 -902
- data/spec/models/spree/order/currency_updater_spec.rb +0 -32
- data/spec/models/spree/order/finalizing_spec.rb +0 -111
- data/spec/models/spree/order/payment_spec.rb +0 -210
- data/spec/models/spree/order/risk_assessment_spec.rb +0 -68
- data/spec/models/spree/order/state_machine_spec.rb +0 -221
- data/spec/models/spree/order/tax_spec.rb +0 -84
- data/spec/models/spree/order/totals_spec.rb +0 -24
- data/spec/models/spree/order/updating_spec.rb +0 -18
- data/spec/models/spree/order/validations_spec.rb +0 -15
- data/spec/models/spree/order_cancellations_spec.rb +0 -120
- data/spec/models/spree/order_capturing_spec.rb +0 -116
- data/spec/models/spree/order_contents_spec.rb +0 -265
- data/spec/models/spree/order_inventory_spec.rb +0 -228
- data/spec/models/spree/order_mutex_spec.rb +0 -85
- data/spec/models/spree/order_promotion_spec.rb +0 -31
- data/spec/models/spree/order_shipping_spec.rb +0 -247
- data/spec/models/spree/order_spec.rb +0 -1464
- data/spec/models/spree/order_stock_location_spec.rb +0 -18
- data/spec/models/spree/order_updater_spec.rb +0 -299
- data/spec/models/spree/payment_method/store_credit_spec.rb +0 -294
- data/spec/models/spree/payment_method_spec.rb +0 -96
- data/spec/models/spree/payment_spec.rb +0 -1045
- data/spec/models/spree/permission_sets/base_spec.rb +0 -12
- data/spec/models/spree/permission_sets/configuration_display.rb +0 -82
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -50
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -22
- data/spec/models/spree/permission_sets/order_display_spec.rb +0 -49
- data/spec/models/spree/permission_sets/order_management_spec.rb +0 -36
- data/spec/models/spree/permission_sets/product_display_spec.rb +0 -60
- data/spec/models/spree/permission_sets/product_management_spec.rb +0 -40
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -34
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -26
- data/spec/models/spree/permission_sets/report_display_spec.rb +0 -24
- data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +0 -132
- data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -26
- data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -24
- data/spec/models/spree/permission_sets/user_display_spec.rb +0 -36
- data/spec/models/spree/permission_sets/user_management_spec.rb +0 -28
- data/spec/models/spree/preference_spec.rb +0 -80
- data/spec/models/spree/preferences/configuration_spec.rb +0 -30
- data/spec/models/spree/preferences/preferable_spec.rb +0 -294
- data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -78
- data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -60
- data/spec/models/spree/preferences/store_spec.rb +0 -39
- data/spec/models/spree/price_spec.rb +0 -42
- data/spec/models/spree/product/scopes_spec.rb +0 -148
- data/spec/models/spree/product_duplicator_spec.rb +0 -103
- data/spec/models/spree/product_filter_spec.rb +0 -26
- data/spec/models/spree/product_property_spec.rb +0 -20
- data/spec/models/spree/product_spec.rb +0 -437
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -96
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -165
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -115
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -40
- data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
- data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -67
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -70
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
- data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -94
- data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
- data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
- data/spec/models/spree/promotion/rules/user_spec.rb +0 -37
- data/spec/models/spree/promotion_builder_spec.rb +0 -118
- data/spec/models/spree/promotion_category_spec.rb +0 -17
- data/spec/models/spree/promotion_code/code_builder_spec.rb +0 -79
- data/spec/models/spree/promotion_code_spec.rb +0 -187
- data/spec/models/spree/promotion_handler/cart_spec.rb +0 -114
- data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -335
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -47
- data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
- data/spec/models/spree/promotion_rule_spec.rb +0 -28
- data/spec/models/spree/promotion_spec.rb +0 -767
- data/spec/models/spree/refund_spec.rb +0 -204
- data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
- data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
- data/spec/models/spree/reimbursement_spec.rb +0 -231
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -51
- data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -107
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -97
- data/spec/models/spree/return_authorization_spec.rb +0 -290
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -85
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
- data/spec/models/spree/return_item_spec.rb +0 -775
- data/spec/models/spree/returns_calculator_spec.rb +0 -14
- data/spec/models/spree/shipment_spec.rb +0 -709
- data/spec/models/spree/shipping_calculator_spec.rb +0 -45
- data/spec/models/spree/shipping_method_spec.rb +0 -88
- data/spec/models/spree/shipping_rate_spec.rb +0 -142
- data/spec/models/spree/state_spec.rb +0 -14
- data/spec/models/spree/stock/availability_validator_spec.rb +0 -83
- data/spec/models/spree/stock/coordinator_spec.rb +0 -116
- data/spec/models/spree/stock/differentiator_spec.rb +0 -39
- data/spec/models/spree/stock/estimator_spec.rb +0 -146
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -38
- data/spec/models/spree/stock/package_spec.rb +0 -163
- data/spec/models/spree/stock/packer_spec.rb +0 -91
- data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
- data/spec/models/spree/stock/quantifier_spec.rb +0 -115
- data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
- data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -50
- data/spec/models/spree/stock/splitter/weight_spec.rb +0 -29
- data/spec/models/spree/stock_item_spec.rb +0 -426
- data/spec/models/spree/stock_location_spec.rb +0 -279
- data/spec/models/spree/stock_movement_spec.rb +0 -56
- data/spec/models/spree/stock_transfer_spec.rb +0 -290
- data/spec/models/spree/store_credit_category_spec.rb +0 -17
- data/spec/models/spree/store_credit_event_spec.rb +0 -314
- data/spec/models/spree/store_credit_spec.rb +0 -876
- data/spec/models/spree/store_spec.rb +0 -55
- data/spec/models/spree/tax_category_spec.rb +0 -27
- data/spec/models/spree/tax_rate_spec.rb +0 -378
- data/spec/models/spree/taxon_spec.rb +0 -74
- data/spec/models/spree/taxonomy_spec.rb +0 -18
- data/spec/models/spree/tracker_spec.rb +0 -21
- data/spec/models/spree/transfer_item_spec.rb +0 -264
- data/spec/models/spree/unit_cancel_spec.rb +0 -148
- data/spec/models/spree/user_spec.rb +0 -223
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -23
- data/spec/models/spree/variant/scopes_spec.rb +0 -55
- data/spec/models/spree/variant_spec.rb +0 -546
- data/spec/models/spree/zone_spec.rb +0 -305
- data/spec/spec_helper.rb +0 -78
- data/spec/support/big_decimal.rb +0 -5
- data/spec/support/concerns/default_price.rb +0 -34
- data/spec/support/dummy_ability.rb +0 -4
- data/spec/support/test_gateway.rb +0 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e28b0ee86c1ba03353662094d58504d304637094
|
|
4
|
+
data.tar.gz: fe5c696d0f48fc4e4e587fe205a7d806588e2304
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 85cac5bfcff4dc8b64841eb1474f185d9238b6d6c630817f46ffb8d02858005c8c1e9457c7a84222b505137f618b3072dcaff3a5b0efb3245604644ea4dc2fdf
|
|
7
|
+
data.tar.gz: 753061a48745dc0a1596bf0c6bab75b8e65c0bb5ee23091271e561d71e363dd9f52e3c8fe14011d91e9e3a3ab12190b4c9c5225e521452d264e568d1161b3c21
|
|
@@ -5,11 +5,10 @@ class Spree::BaseController < ApplicationController
|
|
|
5
5
|
include Spree::Core::ControllerHelpers::Auth
|
|
6
6
|
include Spree::Core::ControllerHelpers::RespondWith
|
|
7
7
|
include Spree::Core::ControllerHelpers::Common
|
|
8
|
+
include Spree::Core::ControllerHelpers::PaymentParameters
|
|
8
9
|
include Spree::Core::ControllerHelpers::Search
|
|
9
10
|
include Spree::Core::ControllerHelpers::Store
|
|
10
11
|
include Spree::Core::ControllerHelpers::StrongParameters
|
|
11
12
|
|
|
12
13
|
respond_to :html
|
|
13
14
|
end
|
|
14
|
-
|
|
15
|
-
require 'spree/i18n/initializer'
|
|
@@ -13,11 +13,11 @@ module Spree
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def link_to_cart(text = nil)
|
|
16
|
-
text = text ? h(text) : Spree.t(
|
|
16
|
+
text = text ? h(text) : Spree.t(:cart)
|
|
17
17
|
css_class = nil
|
|
18
18
|
|
|
19
19
|
if simple_current_order.nil? or simple_current_order.item_count.zero?
|
|
20
|
-
text = "#{text}: (#{Spree.t(
|
|
20
|
+
text = "#{text}: (#{Spree.t(:empty)})"
|
|
21
21
|
css_class = 'empty'
|
|
22
22
|
else
|
|
23
23
|
text = "#{text}: (#{simple_current_order.item_count}) <span class='amount'>#{simple_current_order.display_total.to_html}</span>"
|
|
@@ -107,14 +107,13 @@ module Spree
|
|
|
107
107
|
def taxons_tree(root_taxon, current_taxon, max_level = 1)
|
|
108
108
|
return '' if max_level < 1 || root_taxon.children.empty?
|
|
109
109
|
content_tag :ul, class: 'taxons-list' do
|
|
110
|
-
|
|
110
|
+
root_taxon.children.map do |taxon|
|
|
111
111
|
css_class = (current_taxon && current_taxon.self_and_ancestors.include?(taxon)) ? 'current' : nil
|
|
112
112
|
content_tag :li, class: css_class do
|
|
113
113
|
link_to(taxon.name, seo_url(taxon)) +
|
|
114
114
|
taxons_tree(taxon, current_taxon, max_level - 1)
|
|
115
115
|
end
|
|
116
|
-
end
|
|
117
|
-
safe_join(taxons, "\n")
|
|
116
|
+
end.join("\n").html_safe
|
|
118
117
|
end
|
|
119
118
|
end
|
|
120
119
|
|
|
@@ -52,14 +52,6 @@ module Spree
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
# Deprecated and may be removed from future releases; use
|
|
56
|
-
# line_item_description_text(line_item.description) instead.
|
|
57
|
-
def line_item_description(variant)
|
|
58
|
-
ActiveSupport::Deprecation.warn "line_item_description(variant) is deprecated and may be removed from future releases, use line_item_description_text(line_item.description) instead.", caller
|
|
59
|
-
|
|
60
|
-
line_item_description_text(variant.product.description)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
55
|
# Filters and truncates the given description.
|
|
64
56
|
#
|
|
65
57
|
# @param description_text [String] the text to filter
|
|
@@ -2,11 +2,23 @@ module Spree
|
|
|
2
2
|
class CartonMailer < BaseMailer
|
|
3
3
|
# Send an email to customers to notify that an individual carton has been
|
|
4
4
|
# shipped.
|
|
5
|
-
def shipped_email(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
def shipped_email(options, deprecated_options={})
|
|
6
|
+
if options.is_a?(Integer)
|
|
7
|
+
ActiveSupport::Deprecation.warn "Calling shipped_email with a carton_id is DEPRECATED. Instead use CartonMailer.shipped_email(order: order, carton: carton)"
|
|
8
|
+
@carton = Carton.find(options)
|
|
9
|
+
@order = @carton.orders.first # assume first order
|
|
10
|
+
@manifest = @carton.manifest # use the entire manifest, since we don't know the precise order
|
|
11
|
+
options = deprecated_options
|
|
12
|
+
else
|
|
13
|
+
@order = options.fetch(:order)
|
|
14
|
+
@carton = options.fetch(:carton)
|
|
15
|
+
@manifest = @carton.manifest_for_order(@order)
|
|
16
|
+
end
|
|
17
|
+
options = {resend: false}.merge(options)
|
|
18
|
+
@store = @order.store
|
|
19
|
+
subject = (options[:resend] ? "[#{Spree.t(:resend).upcase}] " : '')
|
|
20
|
+
subject += "#{@store.name} #{Spree.t('shipment_mailer.shipped_email.subject')} ##{@order.number}"
|
|
21
|
+
mail(to: @order.email, from: from_address(@store), subject: subject)
|
|
10
22
|
end
|
|
11
23
|
end
|
|
12
24
|
end
|
|
@@ -2,29 +2,37 @@ module Spree
|
|
|
2
2
|
class OrderMailer < BaseMailer
|
|
3
3
|
def confirm_email(order, resend = false)
|
|
4
4
|
@order = find_order(order)
|
|
5
|
+
@store = @order.store
|
|
5
6
|
subject = build_subject(Spree.t('order_mailer.confirm_email.subject'), resend)
|
|
6
7
|
|
|
7
|
-
mail(to: @order.email, from: from_address(@
|
|
8
|
+
mail(to: @order.email, from: from_address(@store), subject: subject)
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def cancel_email(order, resend = false)
|
|
11
12
|
@order = find_order(order)
|
|
13
|
+
@store = @order.store
|
|
12
14
|
subject = build_subject(Spree.t('order_mailer.cancel_email.subject'), resend)
|
|
13
15
|
|
|
14
|
-
mail(to: @order.email, from: from_address(@
|
|
16
|
+
mail(to: @order.email, from: from_address(@store), subject: subject)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def inventory_cancellation_email(order, inventory_units, resend = false)
|
|
18
20
|
@order, @inventory_units = find_order(order), inventory_units
|
|
21
|
+
@store = @order.store
|
|
19
22
|
subject = build_subject(Spree.t('order_mailer.inventory_cancellation.subject'), resend)
|
|
20
23
|
|
|
21
|
-
mail(to: @order.email, from: from_address(@
|
|
24
|
+
mail(to: @order.email, from: from_address(@store), subject: subject)
|
|
22
25
|
end
|
|
23
26
|
|
|
24
27
|
private
|
|
25
28
|
|
|
26
29
|
def find_order(order)
|
|
27
|
-
|
|
30
|
+
if order.respond_to?(:id)
|
|
31
|
+
order
|
|
32
|
+
else
|
|
33
|
+
ActiveSupport::Deprecation.warn("Calling OrderMailer with an id is deprecated. Pass the Spree::Order object instead.")
|
|
34
|
+
Spree::Order.find(order)
|
|
35
|
+
end
|
|
28
36
|
end
|
|
29
37
|
|
|
30
38
|
def build_subject(subject_text, resend)
|
|
@@ -4,20 +4,19 @@ module Spree
|
|
|
4
4
|
|
|
5
5
|
included do
|
|
6
6
|
def deals_with_adjustments_for_deleted_source
|
|
7
|
-
adjustment_scope = self.adjustments.
|
|
7
|
+
adjustment_scope = self.adjustments.joins(:order)
|
|
8
8
|
|
|
9
9
|
# For incomplete orders, remove the adjustment completely.
|
|
10
|
-
adjustment_scope.where(
|
|
10
|
+
adjustment_scope.where(spree_orders: { completed_at: nil }).destroy_all
|
|
11
11
|
|
|
12
12
|
# For complete orders, the source will be invalid.
|
|
13
13
|
# Therefore we nullify the source_id, leaving the adjustment in place.
|
|
14
14
|
# This would mean that the order's total is not altered at all.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
end
|
|
15
|
+
attrs = {
|
|
16
|
+
source_id: nil,
|
|
17
|
+
updated_at: Time.now
|
|
18
|
+
}
|
|
19
|
+
adjustment_scope.where.not(spree_orders: { completed_at: nil }).update_all(attrs)
|
|
21
20
|
end
|
|
22
21
|
end
|
|
23
22
|
end
|
|
@@ -4,11 +4,17 @@ module Spree
|
|
|
4
4
|
|
|
5
5
|
included do
|
|
6
6
|
has_one :default_price,
|
|
7
|
-
-> { where currency: Spree::Config[:currency] },
|
|
7
|
+
-> { where currency: Spree::Config[:currency], is_default: true },
|
|
8
8
|
class_name: 'Spree::Price',
|
|
9
9
|
dependent: :destroy
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
def find_or_build_default_price
|
|
12
|
+
default_price || build_default_price
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
delegate :display_price, :display_amount,
|
|
16
|
+
:price, :price=, :currency, :currency=,
|
|
17
|
+
to: :find_or_build_default_price
|
|
12
18
|
|
|
13
19
|
after_save :save_default_price
|
|
14
20
|
|
|
@@ -4,7 +4,7 @@ module Spree
|
|
|
4
4
|
|
|
5
5
|
included do
|
|
6
6
|
scope :active, -> { where(active: true) }
|
|
7
|
-
default_scope -> { order(
|
|
7
|
+
default_scope -> { order(arel_table[:name].lower) }
|
|
8
8
|
|
|
9
9
|
validates :name, presence: true, uniqueness: { case_sensitive: false }
|
|
10
10
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module OrderedPropertyValueList
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
acts_as_list
|
|
7
|
+
|
|
8
|
+
validates :property, presence: true
|
|
9
|
+
validates_with Spree::Validations::DbMaximumLengthValidator, field: :value
|
|
10
|
+
|
|
11
|
+
default_scope -> { order(:position) }
|
|
12
|
+
|
|
13
|
+
# virtual attributes for use with AJAX autocompletion
|
|
14
|
+
def property_name
|
|
15
|
+
property.name if property
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def property_name=(name)
|
|
19
|
+
unless name.blank?
|
|
20
|
+
unless property = Property.find_by(name: name)
|
|
21
|
+
property = Property.create(name: name, presentation: name)
|
|
22
|
+
end
|
|
23
|
+
self.property = property
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
module UserAddressBook
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
has_many :user_addresses, -> { active }, {foreign_key: "user_id", class_name: "Spree::UserAddress"} do
|
|
7
|
+
|
|
8
|
+
def find_first_by_address_values(address_attrs)
|
|
9
|
+
detect { |ua| ua.address == Address.new(address_attrs) }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @note this method enforces only one default address per user
|
|
13
|
+
def mark_default(user_address)
|
|
14
|
+
# the checks of persisted? allow us to build a User and associate Addresses at once
|
|
15
|
+
ActiveRecord::Base.transaction do
|
|
16
|
+
(self - [user_address]).each do |ua| #update_all would be nice, but it bypasses ActiveRecord callbacks
|
|
17
|
+
ua.persisted? ? ua.update!(default: false) : ua.default = false
|
|
18
|
+
end
|
|
19
|
+
user_address.persisted? ? user_address.update!(default: true, archived: false) : user_address.default = true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
has_many :addresses, through: :user_addresses
|
|
25
|
+
|
|
26
|
+
# bill_address is only minimally used now, but we can't get rid of it without a major version release
|
|
27
|
+
belongs_to :bill_address, class_name: 'Spree::Address'
|
|
28
|
+
|
|
29
|
+
def bill_address=(address)
|
|
30
|
+
# stow a copy in our address book too
|
|
31
|
+
address = save_in_address_book(address.attributes) if address
|
|
32
|
+
super(address)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def bill_address_attributes=(attributes)
|
|
36
|
+
self.bill_address = Address.immutable_merge(bill_address, attributes)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def default_address
|
|
40
|
+
user_addresses.default.first.try(:address)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def default_address=(address)
|
|
44
|
+
save_in_address_book(address.attributes, true) if address
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def default_address_attributes=(attributes)
|
|
48
|
+
# see "Nested Attributes Examples" section of http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for
|
|
49
|
+
# this #{fieldname}_attributes= method works with fields_for in the views
|
|
50
|
+
# even without declaring accepts_nested_attributes_for
|
|
51
|
+
self.default_address = Address.immutable_merge(default_address, attributes)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
alias_method :ship_address, :default_address
|
|
55
|
+
alias_method :ship_address_attributes=, :default_address_attributes=
|
|
56
|
+
|
|
57
|
+
def ship_address=(address)
|
|
58
|
+
be_default = Spree::Config.automatic_default_address
|
|
59
|
+
save_in_address_book(address.attributes, be_default)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def persist_order_address(order)
|
|
63
|
+
if Spree::Config.automatic_default_address
|
|
64
|
+
save_in_address_book(order.ship_address.attributes, true)
|
|
65
|
+
save_in_address_book(order.bill_address.attributes, order.ship_address.nil?)
|
|
66
|
+
else
|
|
67
|
+
save_in_address_book(order.ship_address.attributes)
|
|
68
|
+
save_in_address_book(order.bill_address.attributes)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Add an address to the user's list of saved addresses for future autofill
|
|
73
|
+
# @param address_attributes HashWithIndifferentAccess of attributes that will be
|
|
74
|
+
# treated as value equality to de-dup among existing Addresses
|
|
75
|
+
# @param default set whether or not this address will show up from
|
|
76
|
+
# #default_address or not
|
|
77
|
+
def save_in_address_book(address_attributes, default = false)
|
|
78
|
+
return nil unless address_attributes.present?
|
|
79
|
+
address_attributes = address_attributes.with_indifferent_access
|
|
80
|
+
|
|
81
|
+
new_address = Address.factory(address_attributes)
|
|
82
|
+
return new_address unless new_address.valid?
|
|
83
|
+
|
|
84
|
+
first_one = user_addresses.empty?
|
|
85
|
+
|
|
86
|
+
if address_attributes[:id].present? && new_address.id != address_attributes[:id]
|
|
87
|
+
remove_from_address_book(address_attributes[:id])
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
user_address = prepare_user_address(new_address)
|
|
91
|
+
user_addresses.mark_default(user_address) if (default || first_one)
|
|
92
|
+
|
|
93
|
+
if persisted?
|
|
94
|
+
user_address.save!
|
|
95
|
+
user_addresses.reset #ensures proper ordering
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
user_address.address
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def mark_default_address(address)
|
|
102
|
+
user_addresses.mark_default(user_addresses.find_by(address: address))
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def remove_from_address_book(address_id)
|
|
106
|
+
user_address = user_addresses.find_by(address_id: address_id)
|
|
107
|
+
if user_address
|
|
108
|
+
user_address.update_attributes(archived: true, default: false)
|
|
109
|
+
else
|
|
110
|
+
false
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
private
|
|
115
|
+
|
|
116
|
+
def prepare_user_address(new_address)
|
|
117
|
+
user_address = user_addresses.all_historical.find_first_by_address_values(new_address.attributes)
|
|
118
|
+
user_address ||= user_addresses.build
|
|
119
|
+
user_address.address = new_address
|
|
120
|
+
user_address.archived = false
|
|
121
|
+
user_address
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Spree
|
|
2
2
|
module UserApiAuthentication
|
|
3
3
|
def generate_spree_api_key!
|
|
4
|
-
|
|
4
|
+
generate_spree_api_key
|
|
5
5
|
save!
|
|
6
6
|
end
|
|
7
7
|
|
|
@@ -10,8 +10,12 @@ module Spree
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def clear_spree_api_key!
|
|
13
|
-
|
|
13
|
+
clear_spree_api_key
|
|
14
14
|
save!
|
|
15
15
|
end
|
|
16
|
+
|
|
17
|
+
def clear_spree_api_key
|
|
18
|
+
self.spree_api_key = nil
|
|
19
|
+
end
|
|
16
20
|
end
|
|
17
21
|
end
|
|
@@ -4,13 +4,13 @@ module Spree
|
|
|
4
4
|
|
|
5
5
|
include Spree::UserApiAuthentication
|
|
6
6
|
include Spree::UserReporting
|
|
7
|
-
include Spree::
|
|
7
|
+
include Spree::UserAddressBook
|
|
8
8
|
include Spree::UserPaymentSource
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
11
|
extend Spree::DisplayMoney
|
|
12
12
|
|
|
13
|
-
has_many :role_users, foreign_key: "user_id", class_name: "Spree::RoleUser"
|
|
13
|
+
has_many :role_users, foreign_key: "user_id", class_name: "Spree::RoleUser", dependent: :destroy
|
|
14
14
|
has_many :spree_roles, through: :role_users, source: :role
|
|
15
15
|
|
|
16
16
|
has_many :user_stock_locations, foreign_key: "user_id", class_name: "Spree::UserStockLocation"
|
|
@@ -23,11 +23,8 @@ module Spree
|
|
|
23
23
|
has_many :store_credit_events, through: :store_credits
|
|
24
24
|
money_methods :total_available_store_credit
|
|
25
25
|
|
|
26
|
-
belongs_to :ship_address, class_name: 'Spree::Address'
|
|
27
|
-
belongs_to :bill_address, class_name: 'Spree::Address'
|
|
28
|
-
|
|
29
26
|
def self.ransackable_associations(auth_object=nil)
|
|
30
|
-
%w[
|
|
27
|
+
%w[addresses]
|
|
31
28
|
end
|
|
32
29
|
|
|
33
30
|
def self.ransackable_attributes(auth_object=nil)
|
|
@@ -46,6 +43,8 @@ module Spree
|
|
|
46
43
|
self_orders = self.orders
|
|
47
44
|
self_orders = self_orders.where(frontend_viewable: true) if only_frontend_viewable
|
|
48
45
|
self_orders = self_orders.where(store: store) if store
|
|
46
|
+
self_orders = self_orders.where('updated_at > ?', Spree::Config.completable_order_updated_cutoff_days.days.ago) if Spree::Config.completable_order_updated_cutoff_days
|
|
47
|
+
self_orders = self_orders.where('created_at > ?', Spree::Config.completable_order_created_cutoff_days.days.ago) if Spree::Config.completable_order_created_cutoff_days
|
|
49
48
|
last_order = self_orders.order(:created_at).last
|
|
50
49
|
last_order unless last_order.try!(:completed?)
|
|
51
50
|
end
|
data/app/models/spree/ability.rb
CHANGED
|
@@ -28,9 +28,8 @@ module Spree
|
|
|
28
28
|
@user = current_user || Spree.user_class.new
|
|
29
29
|
|
|
30
30
|
alias_actions
|
|
31
|
-
grant_default_permissions
|
|
32
|
-
register_extension_abilities
|
|
33
31
|
activate_permission_sets
|
|
32
|
+
register_extension_abilities
|
|
34
33
|
end
|
|
35
34
|
|
|
36
35
|
private
|
|
@@ -47,42 +46,6 @@ module Spree
|
|
|
47
46
|
alias_action :index, :read, to: :display
|
|
48
47
|
end
|
|
49
48
|
|
|
50
|
-
def grant_default_permissions
|
|
51
|
-
# if the user is a "super user" give them full permissions, otherwise give them the permissions
|
|
52
|
-
# required to checkout and use the frontend.
|
|
53
|
-
if user.respond_to?(:has_spree_role?) && user.has_spree_role?('admin')
|
|
54
|
-
can :manage, :all
|
|
55
|
-
else
|
|
56
|
-
grant_generic_user_permissions
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def grant_generic_user_permissions
|
|
61
|
-
can :display, Country
|
|
62
|
-
can :display, OptionType
|
|
63
|
-
can :display, OptionValue
|
|
64
|
-
can :create, Order
|
|
65
|
-
can [:read, :update], Order do |order, token|
|
|
66
|
-
order.user == user || order.guest_token && token == order.guest_token
|
|
67
|
-
end
|
|
68
|
-
can :create, ReturnAuthorization do |return_authorization|
|
|
69
|
-
return_authorization.order.user == user
|
|
70
|
-
end
|
|
71
|
-
can [:display, :update], CreditCard, user_id: user.id
|
|
72
|
-
can :display, Product
|
|
73
|
-
can :display, ProductProperty
|
|
74
|
-
can :display, Property
|
|
75
|
-
can :create, Spree.user_class
|
|
76
|
-
can [:read, :update, :destroy], Spree.user_class, id: user.id
|
|
77
|
-
can :display, State
|
|
78
|
-
can :display, StockItem, stock_location: { active: true }
|
|
79
|
-
can :display, StockLocation, active: true
|
|
80
|
-
can :display, Taxon
|
|
81
|
-
can :display, Taxonomy
|
|
82
|
-
can [:display, :view_out_of_stock], Variant
|
|
83
|
-
can :display, Zone
|
|
84
|
-
end
|
|
85
|
-
|
|
86
49
|
# Before, this was the only way to extend this ability. Permission sets have been added since.
|
|
87
50
|
# It is recommended to use them instead for extension purposes if possible.
|
|
88
51
|
def register_extension_abilities
|