spree_core 3.3.6 → 3.4.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 +17 -18
- data/app/helpers/spree/products_helper.rb +5 -5
- data/app/models/concerns/spree/calculated_adjustments.rb +4 -3
- data/app/models/concerns/spree/default_price.rb +4 -5
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +5 -6
- data/app/models/concerns/spree/user_address.rb +6 -6
- data/app/models/concerns/spree/user_methods.rb +3 -3
- data/app/models/concerns/spree/user_payment_source.rb +4 -2
- data/app/models/concerns/spree/user_reporting.rb +1 -1
- data/app/models/spree/ability.rb +3 -3
- data/app/models/spree/address.rb +13 -9
- data/app/models/spree/adjustable/adjuster/promotion.rb +1 -1
- data/app/models/spree/adjustable/adjustments_updater.rb +2 -2
- data/app/models/spree/adjustable/promotion_accumulator.rb +6 -4
- data/app/models/spree/adjustment.rb +2 -3
- data/app/models/spree/app_configuration.rb +5 -6
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator/default_tax.rb +4 -5
- data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +3 -3
- data/app/models/spree/calculator/flexi_rate.rb +5 -5
- data/app/models/spree/calculator/price_sack.rb +9 -9
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +7 -7
- data/app/models/spree/calculator/shipping/per_item.rb +2 -2
- data/app/models/spree/calculator/shipping/price_sack.rb +4 -4
- data/app/models/spree/calculator/tiered_flat_rate.rb +3 -2
- data/app/models/spree/calculator/tiered_percent.rb +4 -3
- data/app/models/spree/calculator.rb +4 -4
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/credit_card.rb +1 -1
- data/app/models/spree/exchange.rb +4 -5
- data/app/models/spree/gateway/bogus.rb +20 -20
- data/app/models/spree/gateway/bogus_simple.rb +2 -4
- data/app/models/spree/gateway.rb +4 -4
- data/app/models/spree/image.rb +3 -3
- data/app/models/spree/inventory_unit.rb +30 -30
- data/app/models/spree/line_item.rb +7 -9
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/order/checkout.rb +5 -5
- data/app/models/spree/order/currency_updater.rb +1 -4
- data/app/models/spree/order/payments.rb +4 -4
- data/app/models/spree/order/store_credit.rb +2 -2
- data/app/models/spree/order.rb +11 -29
- data/app/models/spree/order_contents.rb +6 -5
- data/app/models/spree/order_inventory.rb +3 -4
- data/app/models/spree/order_updater.rb +13 -14
- data/app/models/spree/payment/processing.rb +25 -26
- data/app/models/spree/payment.rb +72 -79
- data/app/models/spree/payment_capture_event.rb +1 -1
- 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 +7 -7
- data/app/models/spree/preferences/configuration.rb +6 -9
- data/app/models/spree/preferences/preferable.rb +11 -11
- data/app/models/spree/preferences/preferable_class_methods.rb +2 -3
- data/app/models/spree/preferences/scoped_store.rb +6 -5
- data/app/models/spree/preferences/store.rb +9 -14
- data/app/models/spree/price.rb +1 -1
- data/app/models/spree/product/scopes.rb +49 -49
- data/app/models/spree/product.rb +16 -16
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +2 -1
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/first_order.rb +7 -6
- data/app/models/spree/promotion/rules/item_total.rb +3 -5
- data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
- data/app/models/spree/promotion/rules/option_value.rb +14 -6
- data/app/models/spree/promotion/rules/product.rb +4 -4
- data/app/models/spree/promotion/rules/taxon.rb +6 -6
- data/app/models/spree/promotion/rules/user.rb +3 -3
- data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
- data/app/models/spree/promotion.rb +15 -16
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_handler/cart.rb +3 -2
- data/app/models/spree/promotion_handler/free_shipping.rb +1 -3
- data/app/models/spree/promotion_handler/page.rb +3 -3
- data/app/models/spree/promotion_rule.rb +5 -4
- data/app/models/spree/refund.rb +8 -8
- data/app/models/spree/reimbursement/credit.rb +1 -1
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
- data/app/models/spree/reimbursement.rb +4 -8
- data/app/models/spree/reimbursement_performer.rb +0 -5
- data/app/models/spree/reimbursement_tax_calculator.rb +5 -12
- data/app/models/spree/reimbursement_type.rb +2 -2
- data/app/models/spree/return_authorization.rb +22 -26
- data/app/models/spree/return_item/eligibility_validator/default.rb +3 -3
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +2 -3
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +2 -2
- data/app/models/spree/return_item.rb +15 -19
- data/app/models/spree/returns_calculator.rb +1 -2
- data/app/models/spree/shipment.rb +14 -35
- data/app/models/spree/shipment_handler.rb +10 -12
- data/app/models/spree/shipping_calculator.rb +5 -6
- data/app/models/spree/shipping_method.rb +3 -3
- data/app/models/spree/shipping_rate.rb +2 -2
- data/app/models/spree/state.rb +2 -2
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/content_item.rb +2 -3
- data/app/models/spree/stock/coordinator.rb +3 -2
- data/app/models/spree/stock/differentiator.rb +3 -2
- data/app/models/spree/stock/estimator.rb +7 -5
- data/app/models/spree/stock/package.rb +5 -5
- data/app/models/spree/stock/packer.rb +1 -1
- data/app/models/spree/stock/prioritizer.rb +5 -7
- data/app/models/spree/stock/quantifier.rb +0 -1
- data/app/models/spree/stock/splitter/backordered.rb +2 -4
- data/app/models/spree/stock/splitter/base.rb +3 -2
- data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_location.rb +12 -11
- data/app/models/spree/stock_movement.rb +1 -3
- data/app/models/spree/stock_transfer.rb +1 -1
- data/app/models/spree/store.rb +4 -4
- data/app/models/spree/store_credit.rb +3 -3
- data/app/models/spree/tax_category.rb +1 -1
- data/app/models/spree/tax_rate.rb +10 -10
- data/app/models/spree/taxon.rb +13 -13
- data/app/models/spree/taxonomy.rb +9 -8
- data/app/models/spree/validations/db_maximum_length_validator.rb +2 -3
- data/app/models/spree/variant.rb +30 -41
- data/app/models/spree/zone.rb +10 -10
- data/app/validators/db_maximum_length_validator.rb +5 -5
- data/config/initializers/acts_as_taggable_on.rb +3 -3
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/friendly_id.rb +1 -1
- data/config/initializers/premailer_assets.rb +1 -1
- data/config/locales/en.yml +8 -2
- data/db/default/spree/states.rb +1 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +12 -15
- data/lib/generators/spree/install/install_generator.rb +45 -32
- data/lib/spree/core/components.rb +3 -3
- data/lib/spree/core/controller_helpers/auth.rb +5 -10
- data/lib/spree/core/controller_helpers/common.rb +2 -3
- data/lib/spree/core/controller_helpers/order.rb +3 -7
- data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
- data/lib/spree/core/engine.rb +3 -3
- data/lib/spree/core/environment/calculators.rb +0 -1
- data/lib/spree/core/environment_extension.rb +8 -8
- data/lib/spree/core/importer/order.rb +64 -67
- data/lib/spree/core/importer/product.rb +10 -9
- data/lib/spree/core/product_filters.rb +17 -18
- data/lib/spree/core/routes.rb +2 -6
- data/lib/spree/core/search/base.rb +62 -59
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +4 -6
- data/lib/spree/i18n.rb +3 -5
- data/lib/spree/localized_number.rb +0 -2
- data/lib/spree/migrations.rb +8 -7
- data/lib/spree/money.rb +3 -7
- data/lib/spree/permitted_attributes.rb +2 -2
- data/lib/spree/responder.rb +4 -5
- data/lib/spree/testing_support/authorization_helpers.rb +3 -3
- data/lib/spree/testing_support/caching.rb +5 -5
- data/lib/spree/testing_support/capybara_ext.rb +16 -18
- data/lib/spree/testing_support/common_rake.rb +8 -9
- data/lib/spree/testing_support/controller_requests.rb +6 -6
- data/lib/spree/testing_support/extension_rake.rb +2 -3
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +1 -1
- data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
- data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -3
- data/lib/spree/testing_support/factories/image_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
- data/lib/spree/testing_support/factories/options_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +1 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/payment_method_factory.rb +4 -4
- data/lib/spree/testing_support/factories/price_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -2
- data/lib/spree/testing_support/factories/promotion_factory.rb +1 -2
- data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +2 -2
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -3
- data/lib/spree/testing_support/factories/state_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +2 -2
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
- data/lib/spree/testing_support/factories.rb +3 -3
- data/lib/spree/testing_support/flash.rb +1 -3
- data/lib/spree/testing_support/i18n.rb +5 -6
- data/lib/spree/testing_support/kernel.rb +1 -2
- data/lib/spree/testing_support/order_walkthrough.rb +12 -15
- data/lib/spree/testing_support/preferences.rb +0 -1
- data/lib/tasks/core.rake +47 -56
- data/lib/tasks/email.rake +2 -2
- data/lib/tasks/exchanges.rake +5 -5
- data/spree_core.gemspec +1 -1
- metadata +5 -9
- data/app/models/spree/calculator/percent_per_item.rb +0 -51
- data/config/initializers/premailer_rails.rb +0 -3
- data/lib/spree/core/delegate_belongs_to.rb +0 -99
- data/lib/spree/testing_support/microdata.rb +0 -192
@@ -2,54 +2,52 @@ module Spree
|
|
2
2
|
module Core
|
3
3
|
module Importer
|
4
4
|
class Order
|
5
|
-
|
6
5
|
def self.import(user, params)
|
7
|
-
begin
|
8
|
-
ensure_country_id_from_params params[:ship_address_attributes]
|
9
|
-
ensure_state_id_from_params params[:ship_address_attributes]
|
10
|
-
ensure_country_id_from_params params[:bill_address_attributes]
|
11
|
-
ensure_state_id_from_params params[:bill_address_attributes]
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
ensure_country_id_from_params params[:ship_address_attributes]
|
8
|
+
ensure_state_id_from_params params[:ship_address_attributes]
|
9
|
+
ensure_country_id_from_params params[:bill_address_attributes]
|
10
|
+
ensure_state_id_from_params params[:bill_address_attributes]
|
16
11
|
|
17
|
-
|
12
|
+
create_params = params.slice :currency
|
13
|
+
order = Spree::Order.create! create_params
|
14
|
+
order.associate_user!(user)
|
18
15
|
|
19
|
-
|
20
|
-
create_shipments_from_params(shipments_attrs, order)
|
21
|
-
create_adjustments_from_params(params.delete(:adjustments_attributes), order)
|
22
|
-
create_payments_from_params(params.delete(:payments_attributes), order)
|
16
|
+
shipments_attrs = params.delete(:shipments_attributes)
|
23
17
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
create_line_items_from_params(params.delete(:line_items_attributes), order)
|
19
|
+
create_shipments_from_params(shipments_attrs, order)
|
20
|
+
create_adjustments_from_params(params.delete(:adjustments_attributes), order)
|
21
|
+
create_payments_from_params(params.delete(:payments_attributes), order)
|
28
22
|
|
29
|
-
|
23
|
+
if completed_at = params.delete(:completed_at)
|
24
|
+
order.completed_at = completed_at
|
25
|
+
order.state = 'complete'
|
26
|
+
end
|
30
27
|
|
31
|
-
|
28
|
+
params.delete(:user_id) unless user.try(:has_spree_role?, 'admin') && params.key?(:user_id)
|
32
29
|
|
33
|
-
|
30
|
+
order.update_attributes!(params)
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
32
|
+
order.create_proposed_shipments unless shipments_attrs.present?
|
33
|
+
|
34
|
+
# Really ensure that the order totals & states are correct
|
35
|
+
order.updater.update
|
36
|
+
if shipments_attrs.present?
|
37
|
+
order.shipments.each_with_index do |shipment, index|
|
38
|
+
shipment.update_columns(cost: shipments_attrs[index][:cost].to_f) if shipments_attrs[index][:cost].present?
|
41
39
|
end
|
42
|
-
order.reload
|
43
|
-
rescue Exception => e
|
44
|
-
order.destroy if order && order.persisted?
|
45
|
-
raise e.message
|
46
40
|
end
|
41
|
+
order.reload
|
42
|
+
rescue Exception => e
|
43
|
+
order.destroy if order && order.persisted?
|
44
|
+
raise e.message
|
45
|
+
|
47
46
|
end
|
48
47
|
|
49
48
|
def self.create_shipments_from_params(shipments_hash, order)
|
50
49
|
return [] unless shipments_hash
|
51
50
|
|
52
|
-
|
53
51
|
shipments_hash.each do |s|
|
54
52
|
begin
|
55
53
|
shipment = order.shipments.build
|
@@ -90,7 +88,7 @@ module Spree
|
|
90
88
|
end
|
91
89
|
|
92
90
|
def self.create_inventory_units_from_order_and_params(order, inventory_unit_params)
|
93
|
-
inventory_unit_params.
|
91
|
+
inventory_unit_params.each_with_object([]) do |inventory_unit_param, inventory_units|
|
94
92
|
ensure_variant_id_from_params(inventory_unit_param)
|
95
93
|
existing = inventory_units.detect { |unit| unit.variant_id == inventory_unit_param[:variant_id] }
|
96
94
|
if existing
|
@@ -99,15 +97,15 @@ module Spree
|
|
99
97
|
line_item = order.line_items.detect { |ln| ln.variant_id = inventory_unit_param[:variant_id] }
|
100
98
|
inventory_units << InventoryUnit.new(line_item: line_item, order_id: order.id, variant: line_item.variant, quantity: 1)
|
101
99
|
end
|
102
|
-
|
100
|
+
|
103
101
|
end
|
104
102
|
end
|
105
103
|
|
106
104
|
def self.create_line_items_from_params(line_items, order)
|
107
105
|
return {} unless line_items
|
108
106
|
iterator = case line_items
|
109
|
-
|
110
|
-
|
107
|
+
when Hash
|
108
|
+
ActiveSupport::Deprecation.warn(<<-EOS, caller)
|
111
109
|
Passing a hash is now deprecated and will be removed in Spree 4.0.
|
112
110
|
It is recommended that you pass it as an array instead.
|
113
111
|
|
@@ -133,9 +131,9 @@ module Spree
|
|
133
131
|
}
|
134
132
|
}
|
135
133
|
EOS
|
136
|
-
|
137
|
-
|
138
|
-
|
134
|
+
:each_value
|
135
|
+
when Array
|
136
|
+
:each
|
139
137
|
end
|
140
138
|
|
141
139
|
line_items.send(iterator) do |line_item|
|
@@ -197,39 +195,39 @@ module Spree
|
|
197
195
|
end
|
198
196
|
|
199
197
|
def self.create_source_payment_from_params(source_hash, payment)
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
198
|
+
|
199
|
+
Spree::CreditCard.create(
|
200
|
+
month: source_hash[:month],
|
201
|
+
year: source_hash[:year],
|
202
|
+
cc_type: source_hash[:cc_type],
|
203
|
+
last_digits: source_hash[:last_digits],
|
204
|
+
name: source_hash[:name],
|
205
|
+
payment_method: payment.payment_method,
|
206
|
+
gateway_customer_profile_id: source_hash[:gateway_customer_profile_id],
|
207
|
+
gateway_payment_profile_id: source_hash[:gateway_payment_profile_id],
|
208
|
+
imported: true
|
209
|
+
)
|
210
|
+
rescue Exception => e
|
211
|
+
raise "Order import source payments: #{e.message} #{source_hash}"
|
212
|
+
|
215
213
|
end
|
216
214
|
|
217
215
|
def self.ensure_variant_id_from_params(hash)
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
end
|
223
|
-
hash
|
224
|
-
rescue ActiveRecord::RecordNotFound => e
|
225
|
-
raise "Ensure order import variant: Variant w/SKU #{sku} not found."
|
226
|
-
rescue Exception => e
|
227
|
-
raise "Ensure order import variant: #{e.message} #{hash}"
|
216
|
+
|
217
|
+
sku = hash.delete(:sku)
|
218
|
+
unless hash[:variant_id].present?
|
219
|
+
hash[:variant_id] = Spree::Variant.active.find_by!(sku: sku).id
|
228
220
|
end
|
221
|
+
hash
|
222
|
+
rescue ActiveRecord::RecordNotFound => e
|
223
|
+
raise "Ensure order import variant: Variant w/SKU #{sku} not found."
|
224
|
+
rescue Exception => e
|
225
|
+
raise "Ensure order import variant: #{e.message} #{hash}"
|
226
|
+
|
229
227
|
end
|
230
228
|
|
231
229
|
def self.ensure_country_id_from_params(address)
|
232
|
-
return if address.nil?
|
230
|
+
return if address.nil? || address[:country_id].present? || address[:country].nil?
|
233
231
|
|
234
232
|
begin
|
235
233
|
search = {}
|
@@ -245,14 +243,13 @@ module Spree
|
|
245
243
|
|
246
244
|
address.delete(:country)
|
247
245
|
address[:country_id] = Spree::Country.where(search).first!.id
|
248
|
-
|
249
246
|
rescue Exception => e
|
250
247
|
raise "Ensure order import address country: #{e.message} #{search}"
|
251
248
|
end
|
252
249
|
end
|
253
250
|
|
254
251
|
def self.ensure_state_id_from_params(address)
|
255
|
-
return if address.nil?
|
252
|
+
return if address.nil? || address[:state_id].present? || address[:state].nil?
|
256
253
|
|
257
254
|
begin
|
258
255
|
search = {}
|
@@ -44,18 +44,19 @@ module Spree
|
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
47
|
-
def set_up_options
|
48
|
-
options_attrs.each do |name|
|
49
|
-
option_type = Spree::OptionType.where(name: name).first_or_initialize do |option_type|
|
50
|
-
option_type.presentation = name
|
51
|
-
option_type.save!
|
52
|
-
end
|
53
47
|
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
def set_up_options
|
49
|
+
options_attrs.each do |name|
|
50
|
+
option_type = Spree::OptionType.where(name: name).first_or_initialize do |option_type|
|
51
|
+
option_type.presentation = name
|
52
|
+
option_type.save!
|
53
|
+
end
|
54
|
+
|
55
|
+
unless product.option_types.include?(option_type)
|
56
|
+
product.option_types << option_type
|
57
57
|
end
|
58
58
|
end
|
59
|
+
end
|
59
60
|
end
|
60
61
|
end
|
61
62
|
end
|
@@ -53,7 +53,7 @@ module Spree
|
|
53
53
|
# below scope would be something like ["$10 - $15", "$15 - $18", "$18 - $20"]
|
54
54
|
#
|
55
55
|
Spree::Product.add_search_scope :price_range_any do |*opts|
|
56
|
-
conds = opts.map {|o| Spree::Core::ProductFilters.price_filter[:conds][o]}.reject
|
56
|
+
conds = opts.map { |o| Spree::Core::ProductFilters.price_filter[:conds][o] }.reject(&:nil?)
|
57
57
|
scope = conds.shift
|
58
58
|
conds.each do |new_scope|
|
59
59
|
scope = scope.or(new_scope)
|
@@ -61,26 +61,25 @@ module Spree
|
|
61
61
|
Spree::Product.joins(master: :default_price).where(scope)
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
64
|
+
def self.format_price(amount)
|
65
65
|
Spree::Money.new(amount)
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def self.price_filter
|
69
69
|
v = Spree::Price.arel_table
|
70
|
-
conds = [
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
70
|
+
conds = [[Spree.t(:under_price, price: format_price(10)), v[:amount].lteq(10)],
|
71
|
+
["#{format_price(10)} - #{format_price(15)}", v[:amount].in(10..15)],
|
72
|
+
["#{format_price(15)} - #{format_price(18)}", v[:amount].in(15..18)],
|
73
|
+
["#{format_price(18)} - #{format_price(20)}", v[:amount].in(18..20)],
|
74
|
+
[Spree.t(:or_over_price, price: format_price(20)), v[:amount].gteq(20)]]
|
75
75
|
{
|
76
76
|
name: Spree.t(:price_range),
|
77
77
|
scope: :price_range_any,
|
78
78
|
conds: Hash[*conds.flatten],
|
79
|
-
labels: conds.map { |k,
|
79
|
+
labels: conds.map { |k, _v| [k, k] }
|
80
80
|
}
|
81
81
|
end
|
82
82
|
|
83
|
-
|
84
83
|
# Example: filtering by possible brands
|
85
84
|
#
|
86
85
|
# First, we define the scope. Two interesting points here: (a) we run our conditions
|
@@ -94,7 +93,7 @@ module Spree
|
|
94
93
|
# being blank: note that this relies on with_property doing a left outer join
|
95
94
|
# rather than an inner join.
|
96
95
|
Spree::Product.add_search_scope :brand_any do |*opts|
|
97
|
-
conds = opts.map {|o| ProductFilters.brand_filter[:conds][o]}.reject
|
96
|
+
conds = opts.map { |o| ProductFilters.brand_filter[:conds][o] }.reject(&:nil?)
|
98
97
|
scope = conds.shift
|
99
98
|
conds.each do |new_scope|
|
100
99
|
scope = scope.or(new_scope)
|
@@ -102,7 +101,7 @@ module Spree
|
|
102
101
|
Spree::Product.with_property('brand').where(scope)
|
103
102
|
end
|
104
103
|
|
105
|
-
def
|
104
|
+
def self.brand_filter
|
106
105
|
brand_property = Spree::Property.find_by(name: 'brand')
|
107
106
|
brands = brand_property ? Spree::ProductProperty.where(property_id: brand_property.id).pluck(:value).uniq.map(&:to_s) : []
|
108
107
|
pp = Spree::ProductProperty.arel_table
|
@@ -111,7 +110,7 @@ module Spree
|
|
111
110
|
name: I18n.t('spree.taxonomy_brands_name'),
|
112
111
|
scope: :brand_any,
|
113
112
|
conds: conds,
|
114
|
-
labels:
|
113
|
+
labels: brands.sort.map { |k| [k, k] }
|
115
114
|
}
|
116
115
|
end
|
117
116
|
|
@@ -138,12 +137,12 @@ module Spree
|
|
138
137
|
Spree::Product.brand_any(*opts)
|
139
138
|
end
|
140
139
|
|
141
|
-
def
|
140
|
+
def self.selective_brand_filter(taxon = nil)
|
142
141
|
taxon ||= Spree::Taxonomy.first.root
|
143
142
|
brand_property = Spree::Property.find_by(name: 'brand')
|
144
143
|
scope = Spree::ProductProperty.where(property: brand_property).
|
145
|
-
|
146
|
-
|
144
|
+
joins(product: :taxons).
|
145
|
+
where("#{Spree::Taxon.table_name}.id" => [taxon] + taxon.descendants)
|
147
146
|
brands = scope.pluck(:value).uniq
|
148
147
|
{
|
149
148
|
name: 'Applicable Brands',
|
@@ -164,7 +163,7 @@ module Spree
|
|
164
163
|
#
|
165
164
|
# This scope selects products in any of the active taxons or their children.
|
166
165
|
#
|
167
|
-
def
|
166
|
+
def self.taxons_below(taxon)
|
168
167
|
return Spree::Core::ProductFilters.all_taxons if taxon.nil?
|
169
168
|
{
|
170
169
|
name: 'Taxons under ' + taxon.name,
|
@@ -180,7 +179,7 @@ module Spree
|
|
180
179
|
# it uses one of the auto-generated scopes from Ransack.
|
181
180
|
#
|
182
181
|
# idea: expand the format to allow nesting of labels?
|
183
|
-
def
|
182
|
+
def self.all_taxons
|
184
183
|
taxons = Spree::Taxonomy.all.map { |t| [t.root] + t.root.descendants }.flatten
|
185
184
|
{
|
186
185
|
name: 'All taxons',
|
data/lib/spree/core/routes.rb
CHANGED
@@ -14,17 +14,13 @@ module Spree
|
|
14
14
|
# This is mainly why this whole file exists in the first place.
|
15
15
|
#
|
16
16
|
# Thus we need to make sure that the routes aren't drawn twice.
|
17
|
-
unless @spree_routes.include?(block)
|
18
|
-
@spree_routes << block
|
19
|
-
end
|
17
|
+
@spree_routes << block unless @spree_routes.include?(block)
|
20
18
|
end
|
21
19
|
|
22
20
|
def self.append_routes(&block)
|
23
21
|
@append_routes ||= []
|
24
22
|
# See comment in add_routes.
|
25
|
-
unless @append_routes.include?(block)
|
26
|
-
@append_routes << block
|
27
|
-
end
|
23
|
+
@append_routes << block unless @append_routes.include?(block)
|
28
24
|
end
|
29
25
|
|
30
26
|
def self.draw_routes(&block)
|
@@ -17,14 +17,14 @@ module Spree
|
|
17
17
|
curr_page = page || 1
|
18
18
|
|
19
19
|
unless Spree::Config.show_products_without_price
|
20
|
-
@products = @products.where(
|
21
|
-
|
20
|
+
@products = @products.where('spree_prices.amount IS NOT NULL').
|
21
|
+
where('spree_prices.currency' => current_currency)
|
22
22
|
end
|
23
23
|
@products = @products.page(curr_page).per(per_page)
|
24
24
|
end
|
25
25
|
|
26
26
|
def method_missing(name)
|
27
|
-
if @properties.
|
27
|
+
if @properties.key? name
|
28
28
|
@properties[name]
|
29
29
|
else
|
30
30
|
super
|
@@ -32,71 +32,74 @@ module Spree
|
|
32
32
|
end
|
33
33
|
|
34
34
|
protected
|
35
|
-
def get_base_scope
|
36
|
-
base_scope = Spree::Product.spree_base_scopes.active
|
37
|
-
base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
|
38
|
-
base_scope = get_products_conditions_for(base_scope, keywords)
|
39
|
-
base_scope = add_search_scopes(base_scope)
|
40
|
-
base_scope = add_eagerload_scopes(base_scope)
|
41
|
-
base_scope
|
42
|
-
end
|
43
35
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# or multiple independent queries. However as of Rails 4.1.8 any `order`
|
53
|
-
# defined on `has_many` associations are ignored when Rails builds a join
|
54
|
-
# query.
|
55
|
-
#
|
56
|
-
# Would we use `includes` in this particular case, Rails would do
|
57
|
-
# separate queries most of the time but opt for a join as soon as any
|
58
|
-
# `where` constraints affecting joined tables are added to the search;
|
59
|
-
# which is the case as soon as a taxon is added to the base scope.
|
60
|
-
scope = scope.preload(:tax_category)
|
61
|
-
scope = scope.preload(master: :prices)
|
62
|
-
scope = scope.preload(master: :images) if include_images
|
63
|
-
scope
|
64
|
-
end
|
36
|
+
def get_base_scope
|
37
|
+
base_scope = Spree::Product.spree_base_scopes.active
|
38
|
+
base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
|
39
|
+
base_scope = get_products_conditions_for(base_scope, keywords)
|
40
|
+
base_scope = add_search_scopes(base_scope)
|
41
|
+
base_scope = add_eagerload_scopes(base_scope)
|
42
|
+
base_scope
|
43
|
+
end
|
65
44
|
|
66
|
-
|
45
|
+
def add_eagerload_scopes(scope)
|
46
|
+
# TL;DR Switch from `preload` to `includes` as soon as Rails starts honoring
|
47
|
+
# `order` clauses on `has_many` associations when a `where` constraint
|
48
|
+
# affecting a joined table is present (see
|
49
|
+
# https://github.com/rails/rails/issues/6769).
|
50
|
+
#
|
51
|
+
# Ideally this would use `includes` instead of `preload` calls, leaving it
|
52
|
+
# up to Rails whether associated objects should be fetched in one big join
|
53
|
+
# or multiple independent queries. However as of Rails 4.1.8 any `order`
|
54
|
+
# defined on `has_many` associations are ignored when Rails builds a join
|
55
|
+
# query.
|
56
|
+
#
|
57
|
+
# Would we use `includes` in this particular case, Rails would do
|
58
|
+
# separate queries most of the time but opt for a join as soon as any
|
59
|
+
# `where` constraints affecting joined tables are added to the search;
|
60
|
+
# which is the case as soon as a taxon is added to the base scope.
|
61
|
+
scope = scope.preload(:tax_category)
|
62
|
+
scope = scope.preload(master: :prices)
|
63
|
+
scope = scope.preload(master: :images) if include_images
|
64
|
+
scope
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_search_scopes(base_scope)
|
68
|
+
if search.is_a?(ActionController::Parameters)
|
67
69
|
search.each do |name, scope_attribute|
|
68
70
|
scope_name = name.to_sym
|
69
|
-
if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
-
base_scope
|
71
|
+
base_scope = if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
|
72
|
+
base_scope.send(scope_name, *scope_attribute)
|
73
|
+
else
|
74
|
+
base_scope.merge(Spree::Product.ransack(scope_name => scope_attribute).result)
|
75
|
+
end
|
76
|
+
end
|
76
77
|
end
|
78
|
+
base_scope
|
79
|
+
end
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
base_scope
|
81
|
+
# method should return new scope based on base_scope
|
82
|
+
def get_products_conditions_for(base_scope, query)
|
83
|
+
unless query.blank?
|
84
|
+
base_scope = base_scope.like_any([:name, :description], query.split)
|
84
85
|
end
|
86
|
+
base_scope
|
87
|
+
end
|
85
88
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
89
|
+
def prepare(params)
|
90
|
+
@properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
|
91
|
+
@properties[:keywords] = params[:keywords]
|
92
|
+
@properties[:search] = params[:search]
|
93
|
+
@properties[:include_images] = params[:include_images]
|
91
94
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
per_page = params[:per_page].to_i
|
96
|
+
@properties[:per_page] = per_page > 0 ? per_page : Spree::Config[:products_per_page]
|
97
|
+
@properties[:page] = if params[:page].respond_to?(:to_i)
|
98
|
+
params[:page].to_i <= 0 ? 1 : params[:page].to_i
|
99
|
+
else
|
100
|
+
1
|
101
|
+
end
|
102
|
+
end
|
100
103
|
end
|
101
104
|
end
|
102
105
|
end
|
data/lib/spree/core/version.rb
CHANGED
data/lib/spree/core.rb
CHANGED
@@ -19,12 +19,11 @@ require 'state_machines-activerecord'
|
|
19
19
|
StateMachines::Machine.ignore_method_conflicts = true
|
20
20
|
|
21
21
|
module Spree
|
22
|
-
|
23
22
|
mattr_accessor :user_class
|
24
23
|
|
25
24
|
def self.user_class
|
26
25
|
if @@user_class.is_a?(Class)
|
27
|
-
raise
|
26
|
+
raise 'Spree.user_class MUST be a String or Symbol object, not a Class object.'
|
28
27
|
elsif @@user_class.is_a?(String) || @@user_class.is_a?(Symbol)
|
29
28
|
@@user_class.to_s.constantize
|
30
29
|
end
|
@@ -55,13 +54,13 @@ module Spree
|
|
55
54
|
#
|
56
55
|
# This method is defined within the core gem on purpose.
|
57
56
|
# Some people may only wish to use the Core part of Spree.
|
58
|
-
def self.config
|
57
|
+
def self.config
|
59
58
|
yield(Spree::Config)
|
60
59
|
end
|
61
60
|
|
62
61
|
module Core
|
63
|
-
autoload :ProductFilters,
|
64
|
-
autoload :TokenGenerator,
|
62
|
+
autoload :ProductFilters, 'spree/core/product_filters'
|
63
|
+
autoload :TokenGenerator, 'spree/core/token_generator'
|
65
64
|
|
66
65
|
class GatewayError < RuntimeError; end
|
67
66
|
class DestroyWithOrdersError < StandardError; end
|
@@ -83,7 +82,6 @@ require 'spree/localized_number'
|
|
83
82
|
require 'spree/money'
|
84
83
|
require 'spree/permitted_attributes'
|
85
84
|
|
86
|
-
require 'spree/core/delegate_belongs_to'
|
87
85
|
require 'spree/core/importer'
|
88
86
|
require 'spree/core/product_duplicator'
|
89
87
|
require 'spree/core/controller_helpers/auth'
|
data/lib/spree/i18n.rb
CHANGED
@@ -18,7 +18,7 @@ module Spree
|
|
18
18
|
super(*args)
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
alias t translate
|
22
22
|
|
23
23
|
def context
|
24
24
|
Spree::ViewContext.context
|
@@ -26,11 +26,9 @@ module Spree
|
|
26
26
|
|
27
27
|
def virtual_path
|
28
28
|
if context
|
29
|
-
path = context.instance_variable_get(
|
29
|
+
path = context.instance_variable_get('@virtual_path')
|
30
30
|
|
31
|
-
if path
|
32
|
-
path.gsub(/spree/, '')
|
33
|
-
end
|
31
|
+
path.gsub(/spree/, '') if path
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Spree
|
2
2
|
class LocalizedNumber
|
3
|
-
|
4
3
|
# Strips all non-price-like characters from the number, taking into account locale settings.
|
5
4
|
def self.parse(number)
|
6
5
|
return number unless number.is_a?(String)
|
@@ -20,6 +19,5 @@ module Spree
|
|
20
19
|
|
21
20
|
number.to_d
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
data/lib/spree/migrations.rb
CHANGED
@@ -4,7 +4,8 @@ module Spree
|
|
4
4
|
|
5
5
|
# Takes the engine config block and engine name
|
6
6
|
def initialize(config, engine_name)
|
7
|
-
@config
|
7
|
+
@config = config
|
8
|
+
@engine_name = engine_name
|
8
9
|
end
|
9
10
|
|
10
11
|
# Puts warning when any engine migration is not present on the Rails app
|
@@ -23,7 +24,7 @@ module Spree
|
|
23
24
|
def check
|
24
25
|
if File.directory?(app_dir)
|
25
26
|
engine_in_app = app_migrations.map do |file_name|
|
26
|
-
name, engine = file_name.split(
|
27
|
+
name, engine = file_name.split('.', 2)
|
27
28
|
next unless match_engine?(engine)
|
28
29
|
name
|
29
30
|
end.compact
|
@@ -44,15 +45,15 @@ module Spree
|
|
44
45
|
|
45
46
|
def engine_migrations
|
46
47
|
Dir.entries(engine_dir).map do |file_name|
|
47
|
-
name = file_name.split(
|
48
|
+
name = file_name.split('_', 2).last.split('.', 2).first
|
48
49
|
name.empty? ? next : name
|
49
50
|
end.compact! || []
|
50
51
|
end
|
51
52
|
|
52
53
|
def app_migrations
|
53
54
|
Dir.entries(app_dir).map do |file_name|
|
54
|
-
next if [
|
55
|
-
name = file_name.split(
|
55
|
+
next if ['.', '..'].include? file_name
|
56
|
+
name = file_name.split('_', 2).last
|
56
57
|
name.empty? ? next : name
|
57
58
|
end.compact! || []
|
58
59
|
end
|
@@ -66,9 +67,9 @@ module Spree
|
|
66
67
|
end
|
67
68
|
|
68
69
|
def match_engine?(engine)
|
69
|
-
if engine_name ==
|
70
|
+
if engine_name == 'spree'
|
70
71
|
# Avoid stores upgrading from 1.3 getting wrong warnings
|
71
|
-
[
|
72
|
+
['spree.rb', 'spree_promo.rb'].include? engine
|
72
73
|
else
|
73
74
|
engine == "#{engine_name}.rb"
|
74
75
|
end
|