spree_core 3.3.6 → 3.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -21,14 +21,14 @@ module Spree
|
|
21
21
|
|
22
22
|
# Wrapper for creating a new stock item respecting the backorderable config
|
23
23
|
def propagate_variant(variant)
|
24
|
-
|
24
|
+
stock_items.create!(variant: variant, backorderable: backorderable_default)
|
25
25
|
end
|
26
26
|
|
27
27
|
# Return either an existing stock item or create a new one. Useful in
|
28
28
|
# scenarios where the user might not know whether there is already a stock
|
29
29
|
# item for a given variant
|
30
30
|
def set_up_stock_item(variant)
|
31
|
-
|
31
|
+
stock_item(variant) || propagate_variant(variant)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Returns an instance of StockItem for the variant id.
|
@@ -68,7 +68,7 @@ module Spree
|
|
68
68
|
move(variant, quantity, originator)
|
69
69
|
end
|
70
70
|
|
71
|
-
def restock_backordered(variant, quantity,
|
71
|
+
def restock_backordered(variant, quantity, _originator = nil)
|
72
72
|
item = stock_item_or_create(variant)
|
73
73
|
item.update_columns(
|
74
74
|
count_on_hand: item.count_on_hand + quantity,
|
@@ -104,16 +104,17 @@ module Spree
|
|
104
104
|
end
|
105
105
|
|
106
106
|
private
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
107
|
+
|
108
|
+
def create_stock_items
|
109
|
+
Variant.includes(:product).find_each do |variant|
|
110
|
+
propagate_variant(variant)
|
111
111
|
end
|
112
|
+
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
end
|
114
|
+
def ensure_one_default
|
115
|
+
if default
|
116
|
+
StockLocation.where(default: true).where.not(id: id).update_all(default: false)
|
117
117
|
end
|
118
|
+
end
|
118
119
|
end
|
119
120
|
end
|
data/app/models/spree/store.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
class Store < Spree::Base
|
3
|
-
has_many :orders, class_name:
|
3
|
+
has_many :orders, class_name: 'Spree::Order'
|
4
4
|
|
5
5
|
with_options presence: true do
|
6
6
|
validates :code, uniqueness: { case_sensitive: false, allow_blank: true }
|
@@ -10,7 +10,7 @@ module Spree
|
|
10
10
|
before_save :ensure_default_exists_and_is_unique
|
11
11
|
before_destroy :validate_not_default
|
12
12
|
|
13
|
-
scope :by_url,
|
13
|
+
scope :by_url, ->(url) { where('url like ?', "%#{url}%") }
|
14
14
|
|
15
15
|
after_commit :clear_cache
|
16
16
|
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.default
|
23
|
-
Rails.cache.fetch(
|
23
|
+
Rails.cache.fetch('default_store') do
|
24
24
|
where(default: true).first_or_initialize
|
25
25
|
end
|
26
26
|
end
|
@@ -43,7 +43,7 @@ module Spree
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def clear_cache
|
46
|
-
Rails.cache.delete(
|
46
|
+
Rails.cache.delete('default_store')
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -204,9 +204,9 @@ module Spree
|
|
204
204
|
|
205
205
|
def store_event
|
206
206
|
return unless saved_change_to_amount? ||
|
207
|
-
|
208
|
-
|
209
|
-
|
207
|
+
saved_change_to_amount_used? ||
|
208
|
+
saved_change_to_amount_authorized? ||
|
209
|
+
action == ELIGIBLE_ACTION
|
210
210
|
|
211
211
|
event = if action
|
212
212
|
store_credit_events.build(action: action)
|
@@ -8,7 +8,7 @@ module Spree
|
|
8
8
|
before_save :set_default_category
|
9
9
|
|
10
10
|
def set_default_category
|
11
|
-
#set existing default tax category to false if this one has been marked as default
|
11
|
+
# set existing default tax category to false if this one has been marked as default
|
12
12
|
|
13
13
|
if is_default && tax_category = self.class.where(is_default: true).where.not(id: id).first
|
14
14
|
tax_category.update_columns(is_default: false, updated_at: Time.current)
|
@@ -6,9 +6,9 @@ module Spree
|
|
6
6
|
include Spree::AdjustmentSource
|
7
7
|
|
8
8
|
with_options inverse_of: :tax_rates do
|
9
|
-
belongs_to :zone, class_name:
|
9
|
+
belongs_to :zone, class_name: 'Spree::Zone', optional: true
|
10
10
|
belongs_to :tax_category,
|
11
|
-
class_name:
|
11
|
+
class_name: 'Spree::TaxCategory'
|
12
12
|
end
|
13
13
|
|
14
14
|
with_options presence: true do
|
@@ -16,15 +16,15 @@ module Spree
|
|
16
16
|
validates :tax_category
|
17
17
|
end
|
18
18
|
|
19
|
-
scope :by_zone, ->
|
19
|
+
scope :by_zone, ->(zone) { where(zone_id: zone.id) }
|
20
20
|
scope :potential_rates_for_zone,
|
21
|
-
->
|
21
|
+
->(zone) do
|
22
22
|
where(zone_id: Spree::Zone.potential_matching_zones(zone).pluck(:id))
|
23
23
|
end
|
24
24
|
scope :for_default_zone,
|
25
25
|
-> { potential_rates_for_zone(Spree::Zone.default_tax) }
|
26
26
|
scope :for_tax_category,
|
27
|
-
->
|
27
|
+
->(category) { where(tax_category_id: category.try(:id)) }
|
28
28
|
scope :included_in_price, -> { where(included_in_price: true) }
|
29
29
|
|
30
30
|
# Gets the array of TaxRates appropriate for the specified tax zone
|
@@ -44,7 +44,7 @@ module Spree
|
|
44
44
|
|
45
45
|
included_rates = rates.select(&:included_in_price)
|
46
46
|
if included_rates.any?
|
47
|
-
pre_tax_amount /= (1 + included_rates.
|
47
|
+
pre_tax_amount /= (1 + included_rates.sum(&:amount))
|
48
48
|
end
|
49
49
|
|
50
50
|
item.update_column(:pre_tax_amount, pre_tax_amount)
|
@@ -85,7 +85,7 @@ module Spree
|
|
85
85
|
potential_rates_for_zone(options[:tax_zone]).
|
86
86
|
included_in_price.
|
87
87
|
for_tax_category(options[:tax_category]).
|
88
|
-
|
88
|
+
sum(:amount)
|
89
89
|
end
|
90
90
|
|
91
91
|
def adjust(order, item)
|
@@ -100,14 +100,14 @@ module Spree
|
|
100
100
|
|
101
101
|
def label
|
102
102
|
Spree.t included_in_price? ? :including_tax : :excluding_tax,
|
103
|
-
scope:
|
103
|
+
scope: 'adjustment_labels.tax_rates',
|
104
104
|
name: name.presence || tax_category.name,
|
105
105
|
amount: amount_for_label
|
106
106
|
end
|
107
107
|
|
108
108
|
def amount_for_label
|
109
|
-
return
|
110
|
-
|
109
|
+
return '' unless show_rate_in_label?
|
110
|
+
' ' + ActiveSupport::NumberHelper::NumberToPercentageConverter.convert(
|
111
111
|
amount * 100,
|
112
112
|
locale: I18n.locale
|
113
113
|
)
|
data/app/models/spree/taxon.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# TODO let friendly id take care of sanitizing the url
|
1
|
+
# TODO: let friendly id take care of sanitizing the url
|
2
2
|
require 'stringex'
|
3
3
|
|
4
4
|
module Spree
|
@@ -31,14 +31,14 @@ module Spree
|
|
31
31
|
after_touch :touch_ancestors_and_taxonomy
|
32
32
|
|
33
33
|
has_attached_file :icon,
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
styles: { mini: '32x32>', normal: '128x128>' },
|
35
|
+
default_style: :mini,
|
36
|
+
url: '/spree/taxons/:id/:style/:basename.:extension',
|
37
|
+
path: ':rails_root/public/spree/taxons/:id/:style/:basename.:extension',
|
38
|
+
default_url: '/assets/default_taxon.png'
|
39
39
|
|
40
40
|
validates_attachment :icon,
|
41
|
-
|
41
|
+
content_type: { content_type: ['image/jpg', 'image/jpeg', 'image/png', 'image/gif'] }
|
42
42
|
|
43
43
|
self.whitelisted_ransackable_associations = %w[taxonomy]
|
44
44
|
|
@@ -56,10 +56,10 @@ module Spree
|
|
56
56
|
|
57
57
|
# Return meta_title if set otherwise generates from root name and/or taxon name
|
58
58
|
def seo_title
|
59
|
-
|
60
|
-
meta_title
|
61
|
-
else
|
59
|
+
if meta_title.blank?
|
62
60
|
root? ? name : "#{root.name} - #{name}"
|
61
|
+
else
|
62
|
+
meta_title
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -77,10 +77,10 @@ module Spree
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def pretty_name
|
80
|
-
ancestor_chain =
|
80
|
+
ancestor_chain = ancestors.inject('') do |name, ancestor|
|
81
81
|
name += "#{ancestor.name} -> "
|
82
82
|
end
|
83
|
-
ancestor_chain +
|
83
|
+
ancestor_chain + name.to_s
|
84
84
|
end
|
85
85
|
|
86
86
|
# awesome_nested_set sorts by :lft and :rgt. This call re-inserts the child
|
@@ -90,7 +90,7 @@ module Spree
|
|
90
90
|
#
|
91
91
|
# See #3390 for background.
|
92
92
|
def child_index=(idx)
|
93
|
-
move_to_child_with_index(parent, idx.to_i) unless
|
93
|
+
move_to_child_with_index(parent, idx.to_i) unless new_record?
|
94
94
|
end
|
95
95
|
|
96
96
|
private
|
@@ -5,20 +5,21 @@ module Spree
|
|
5
5
|
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
6
6
|
|
7
7
|
has_many :taxons, inverse_of: :taxonomy
|
8
|
-
has_one :root, -> { where parent_id: nil }, class_name:
|
8
|
+
has_one :root, -> { where parent_id: nil }, class_name: 'Spree::Taxon', dependent: :destroy
|
9
9
|
|
10
10
|
after_create :set_root
|
11
11
|
after_save :set_root_taxon_name
|
12
12
|
|
13
|
-
default_scope { order("#{
|
13
|
+
default_scope { order("#{table_name}.position, #{table_name}.created_at") }
|
14
14
|
|
15
15
|
private
|
16
|
-
def set_root
|
17
|
-
self.root ||= Taxon.create!(taxonomy_id: id, name: name)
|
18
|
-
end
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
def set_root
|
18
|
+
self.root ||= Taxon.create!(taxonomy_id: id, name: name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_root_taxon_name
|
22
|
+
root.update_attributes(name: name)
|
23
|
+
end
|
23
24
|
end
|
24
25
|
end
|
@@ -3,15 +3,14 @@ module Spree
|
|
3
3
|
##
|
4
4
|
# Validates a field based on the maximum length of the underlying DB field, if there is one.
|
5
5
|
class DbMaximumLengthValidator < ActiveModel::Validator
|
6
|
-
|
7
6
|
def initialize(options)
|
8
7
|
super
|
9
8
|
@field = options[:field].to_s
|
10
|
-
raise ArgumentError
|
9
|
+
raise ArgumentError, 'a field must be specified to the validator' if @field.blank?
|
11
10
|
end
|
12
11
|
|
13
12
|
def validate(record)
|
14
|
-
warn
|
13
|
+
warn '`Spree::Validations::DbMaximumLengthValidator` is deprecated. Use `DbMaximumLengthValidator` instead.'
|
15
14
|
limit = record.class.columns_hash[@field].limit
|
16
15
|
value = record[@field.to_sym]
|
17
16
|
if value && limit && value.to_s.length > limit
|
data/app/models/spree/variant.rb
CHANGED
@@ -31,12 +31,12 @@ module Spree
|
|
31
31
|
has_many :option_value_variants, class_name: 'Spree::OptionValueVariant'
|
32
32
|
has_many :option_values, through: :option_value_variants, class_name: 'Spree::OptionValue'
|
33
33
|
|
34
|
-
has_many :images, -> { order(:position) }, as: :viewable, dependent: :destroy, class_name:
|
34
|
+
has_many :images, -> { order(:position) }, as: :viewable, dependent: :destroy, class_name: 'Spree::Image'
|
35
35
|
|
36
36
|
has_many :prices,
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
class_name: 'Spree::Price',
|
38
|
+
dependent: :destroy,
|
39
|
+
inverse_of: :variant
|
40
40
|
|
41
41
|
before_validation :set_cost_currency
|
42
42
|
|
@@ -67,12 +67,12 @@ module Spree
|
|
67
67
|
|
68
68
|
scope :not_deleted, -> { where("#{Variant.quoted_table_name}.deleted_at IS NULL") }
|
69
69
|
|
70
|
-
scope :for_currency_and_available_price_amount, ->
|
70
|
+
scope :for_currency_and_available_price_amount, ->(currency) do
|
71
71
|
currency ||= Spree::Config[:currency]
|
72
|
-
joins(:prices).where(
|
72
|
+
joins(:prices).where('spree_prices.currency = ?', currency).where('spree_prices.amount IS NOT NULL').distinct
|
73
73
|
end
|
74
74
|
|
75
|
-
scope :active, ->
|
75
|
+
scope :active, ->(currency = nil) do
|
76
76
|
not_discontinued.not_deleted.
|
77
77
|
for_currency_and_available_price_amount(currency)
|
78
78
|
end
|
@@ -92,11 +92,6 @@ module Spree
|
|
92
92
|
!discontinued? && product.available?
|
93
93
|
end
|
94
94
|
|
95
|
-
def self.having_orders
|
96
|
-
warn "`Spree::Variant#having_orders` is deprecated and will be removed in Spree 3.4"
|
97
|
-
joins(:line_items).distinct
|
98
|
-
end
|
99
|
-
|
100
95
|
def tax_category
|
101
96
|
if self[:tax_category_id].nil?
|
102
97
|
product.tax_category
|
@@ -105,14 +100,8 @@ module Spree
|
|
105
100
|
end
|
106
101
|
end
|
107
102
|
|
108
|
-
# returns number of units currently on backorder for this variant.
|
109
|
-
def on_backorder
|
110
|
-
warn "`Spree::Variant#on_backorder` is deprecated and will be removed in Spree 3.4"
|
111
|
-
inventory_units.with_state('backordered').size
|
112
|
-
end
|
113
|
-
|
114
103
|
def options_text
|
115
|
-
values =
|
104
|
+
values = option_values.sort do |a, b|
|
116
105
|
a.option_type.position <=> b.option_type.position
|
117
106
|
end
|
118
107
|
|
@@ -120,7 +109,7 @@ module Spree
|
|
120
109
|
"#{ov.option_type.presentation}: #{ov.presentation}"
|
121
110
|
end
|
122
111
|
|
123
|
-
values.to_sentence(
|
112
|
+
values.to_sentence(words_connector: ', ', two_words_connector: ', ')
|
124
113
|
end
|
125
114
|
|
126
115
|
# Default to master name
|
@@ -154,23 +143,23 @@ module Spree
|
|
154
143
|
|
155
144
|
def set_option_value(opt_name, opt_value)
|
156
145
|
# no option values on master
|
157
|
-
return if
|
146
|
+
return if is_master
|
158
147
|
|
159
148
|
option_type = Spree::OptionType.where(name: opt_name).first_or_initialize do |o|
|
160
149
|
o.presentation = opt_name
|
161
150
|
o.save!
|
162
151
|
end
|
163
152
|
|
164
|
-
current_value =
|
153
|
+
current_value = option_values.detect { |o| o.option_type.name == opt_name }
|
165
154
|
|
166
|
-
|
167
|
-
return if current_value.name == opt_value
|
168
|
-
self.option_values.delete(current_value)
|
169
|
-
else
|
155
|
+
if current_value.nil?
|
170
156
|
# then we have to check to make sure that the product has the option type
|
171
|
-
unless
|
172
|
-
|
157
|
+
unless product.option_types.include? option_type
|
158
|
+
product.option_types << option_type
|
173
159
|
end
|
160
|
+
else
|
161
|
+
return if current_value.name == opt_value
|
162
|
+
option_values.delete(current_value)
|
174
163
|
end
|
175
164
|
|
176
165
|
option_value = Spree::OptionValue.where(option_type_id: option_type.id, name: opt_value).first_or_initialize do |o|
|
@@ -178,12 +167,12 @@ module Spree
|
|
178
167
|
o.save!
|
179
168
|
end
|
180
169
|
|
181
|
-
|
182
|
-
|
170
|
+
option_values << option_value
|
171
|
+
save
|
183
172
|
end
|
184
173
|
|
185
174
|
def option_value(opt_name)
|
186
|
-
|
175
|
+
option_values.detect { |o| o.option_type.name == opt_name }.try(:presentation)
|
187
176
|
end
|
188
177
|
|
189
178
|
def price_in(currency)
|
@@ -197,27 +186,27 @@ module Spree
|
|
197
186
|
def price_modifier_amount_in(currency, options = {})
|
198
187
|
return 0 unless options.present?
|
199
188
|
|
200
|
-
options.keys.map
|
189
|
+
options.keys.map do |key|
|
201
190
|
m = "#{key}_price_modifier_amount_in".to_sym
|
202
|
-
if
|
203
|
-
|
191
|
+
if respond_to? m
|
192
|
+
send(m, currency, options[key])
|
204
193
|
else
|
205
194
|
0
|
206
195
|
end
|
207
|
-
|
196
|
+
end.sum
|
208
197
|
end
|
209
198
|
|
210
199
|
def price_modifier_amount(options = {})
|
211
200
|
return 0 unless options.present?
|
212
201
|
|
213
|
-
options.keys.map
|
202
|
+
options.keys.map do |key|
|
214
203
|
m = "#{key}_price_modifier_amount".to_sym
|
215
|
-
if
|
216
|
-
|
204
|
+
if respond_to? m
|
205
|
+
send(m, options[key])
|
217
206
|
else
|
218
207
|
0
|
219
208
|
end
|
220
|
-
|
209
|
+
end.sum
|
221
210
|
end
|
222
211
|
|
223
212
|
def name_and_sku
|
@@ -241,11 +230,11 @@ module Spree
|
|
241
230
|
# Shortcut method to determine if inventory tracking is enabled for this variant
|
242
231
|
# This considers both variant tracking flag and site-wide inventory tracking settings
|
243
232
|
def should_track_inventory?
|
244
|
-
|
233
|
+
track_inventory? && Spree::Config.track_inventory_levels
|
245
234
|
end
|
246
235
|
|
247
236
|
def track_inventory
|
248
|
-
|
237
|
+
should_track_inventory?
|
249
238
|
end
|
250
239
|
|
251
240
|
def volume
|
data/app/models/spree/zone.rb
CHANGED
@@ -31,9 +31,9 @@ module Spree
|
|
31
31
|
def self.potential_matching_zones(zone)
|
32
32
|
if zone.country?
|
33
33
|
# Match zones of the same kind with similar countries
|
34
|
-
joins(countries: :zones)
|
35
|
-
|
36
|
-
|
34
|
+
joins(countries: :zones).
|
35
|
+
where('zone_members_spree_countries_join.zone_id = ?', zone.id).
|
36
|
+
distinct
|
37
37
|
else
|
38
38
|
# Match zones of the same kind with similar states in AND match zones
|
39
39
|
# that have the states countries in
|
@@ -52,13 +52,13 @@ module Spree
|
|
52
52
|
# Returns nil in the case of no matches.
|
53
53
|
def self.match(address)
|
54
54
|
return unless address &&
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
55
|
+
matches = includes(:zone_members).
|
56
|
+
order('spree_zones.zone_members_count', 'spree_zones.created_at').
|
57
|
+
where("(spree_zone_members.zoneable_type = 'Spree::Country' AND " \
|
58
|
+
'spree_zone_members.zoneable_id = ?) OR ' \
|
59
|
+
"(spree_zone_members.zoneable_type = 'Spree::State' AND " \
|
60
|
+
'spree_zone_members.zoneable_id = ?)', address.country_id, address.state_id).
|
61
|
+
references(:zones)
|
62
62
|
|
63
63
|
%w[state country].each do |zone_kind|
|
64
64
|
if match = matches.detect { |zone| zone_kind == zone.kind }
|
@@ -2,11 +2,11 @@
|
|
2
2
|
# Validates a field based on the maximum length of the underlying DB field, if there is one.
|
3
3
|
class DbMaximumLengthValidator < ActiveModel::EachValidator
|
4
4
|
def validate_each(record, attribute, value)
|
5
|
-
if defined?(Globalize)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
limit = if defined?(Globalize)
|
6
|
+
record.class.translation_class.columns_hash[attribute.to_s].limit
|
7
|
+
else
|
8
|
+
record.class.columns_hash[attribute.to_s].limit
|
9
|
+
end
|
10
10
|
value = record[attribute.to_sym]
|
11
11
|
if value && limit && value.to_s.length > limit
|
12
12
|
record.errors.add(attribute.to_sym, :too_long, count: limit)
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require 'acts-as-taggable-on'
|
2
2
|
|
3
3
|
ActsAsTaggableOn::Tag.class_eval do
|
4
|
-
self.table_name_prefix =
|
4
|
+
self.table_name_prefix = 'spree_'
|
5
5
|
end
|
6
6
|
|
7
7
|
ActsAsTaggableOn::Tagging.class_eval do
|
8
|
-
self.table_name_prefix =
|
8
|
+
self.table_name_prefix = 'spree_'
|
9
9
|
end
|
@@ -1 +1 @@
|
|
1
|
-
Rails.application.config.assets.precompile += %w(
|
1
|
+
Rails.application.config.assets.precompile += %w(logo/spree_50.png noimage/*.png)
|
@@ -1 +1 @@
|
|
1
|
-
Rails.application.config.assets.precompile += %w(
|
1
|
+
Rails.application.config.assets.precompile += %w(ink.css)
|
data/config/locales/en.yml
CHANGED
@@ -540,7 +540,7 @@ en:
|
|
540
540
|
back_to_resource_list: 'Back To %{resource} List'
|
541
541
|
back_to_payment: Back To Payment
|
542
542
|
back_to_rma_reason_list: Back To RMA Reason List
|
543
|
-
back_to_store:
|
543
|
+
back_to_store: Back to Store
|
544
544
|
back_to_users_list: Back To Users List
|
545
545
|
backorderable: Backorderable
|
546
546
|
backorderable_default: Backorderable default
|
@@ -749,6 +749,7 @@ en:
|
|
749
749
|
excl: excl.
|
750
750
|
expiration: Expiration
|
751
751
|
extension: Extension
|
752
|
+
extensions_directory: Extensions Directory
|
752
753
|
existing_shipments: Existing shipments
|
753
754
|
failed_payment_attempts: Failed Payment Attempts
|
754
755
|
filename: Filename
|
@@ -779,6 +780,7 @@ en:
|
|
779
780
|
has_no_shipped_units: has no shipped units
|
780
781
|
height: Height
|
781
782
|
home: Home
|
783
|
+
help_center: Help Center
|
782
784
|
i18n:
|
783
785
|
available_locales: Available Locales
|
784
786
|
fields: Fields
|
@@ -837,6 +839,7 @@ en:
|
|
837
839
|
items_to_be_reimbursed: Items to be reimbursed
|
838
840
|
items_reimbursed: Items reimbursed
|
839
841
|
jirafe: Jirafe
|
842
|
+
join_slack: Join Slack
|
840
843
|
last_name: Last Name
|
841
844
|
last_name_begins_with: Last Name Begins With
|
842
845
|
learn_more: Learn More
|
@@ -1364,7 +1367,10 @@ en:
|
|
1364
1367
|
stock_movements: Stock Movements
|
1365
1368
|
stock_movements_for_stock_location: Stock Movements for %{stock_location_name}
|
1366
1369
|
stock_successfully_transferred: Stock was successfully transferred between locations.
|
1367
|
-
|
1370
|
+
stock_transfer_name: Stock Transfer
|
1371
|
+
stock_transfer:
|
1372
|
+
errors:
|
1373
|
+
must_have_variant: You must add atleast one variant.
|
1368
1374
|
stock_transfers: Stock Transfers
|
1369
1375
|
stop: Stop
|
1370
1376
|
store: Store
|
data/db/default/spree/states.rb
CHANGED
@@ -4,6 +4,7 @@ state_inserts = []
|
|
4
4
|
state_values = -> do
|
5
5
|
Spree::Country.where(states_required: true).each do |country|
|
6
6
|
carmen_country = Carmen::Country.named(country.name)
|
7
|
+
next if !carmen_country
|
7
8
|
carmen_country.subregions.each do |subregion|
|
8
9
|
name = connection.quote subregion.name
|
9
10
|
abbr = connection.quote subregion.code
|