spree_core 2.2.0 → 2.2.1

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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +26 -0
  3. data/app/helpers/spree/taxons_helper.rb +2 -2
  4. data/app/models/concerns/spree/user_api_authentication.rb +13 -0
  5. data/app/models/concerns/spree/user_reporting.rb +27 -0
  6. data/app/models/spree/adjustment.rb +3 -2
  7. data/app/models/spree/app_configuration.rb +1 -0
  8. data/app/models/spree/calculator/default_tax.rb +5 -1
  9. data/app/models/spree/calculator.rb +2 -2
  10. data/app/models/spree/credit_card.rb +11 -5
  11. data/app/models/spree/gateway.rb +25 -0
  12. data/app/models/spree/item_adjustments.rb +2 -0
  13. data/app/models/spree/legacy_user.rb +2 -3
  14. data/app/models/spree/line_item.rb +7 -0
  15. data/app/models/spree/order/checkout.rb +19 -7
  16. data/app/models/spree/order/currency_updater.rb +40 -0
  17. data/app/models/spree/order.rb +19 -3
  18. data/app/models/spree/order_updater.rb +1 -1
  19. data/app/models/spree/payment.rb +5 -2
  20. data/app/models/spree/payment_method.rb +1 -0
  21. data/app/models/spree/product/scopes.rb +13 -17
  22. data/app/models/spree/product.rb +10 -2
  23. data/app/models/spree/promotion/actions/free_shipping.rb +4 -2
  24. data/app/models/spree/promotion/rules/product.rb +0 -9
  25. data/app/models/spree/promotion.rb +1 -1
  26. data/app/models/spree/shipment.rb +19 -14
  27. data/app/models/spree/shipping_method.rb +2 -2
  28. data/app/models/spree/shipping_rate.rb +15 -9
  29. data/app/models/spree/stock/estimator.rb +4 -1
  30. data/app/models/spree/stock_location.rb +1 -0
  31. data/app/models/spree/tax_rate.rb +81 -7
  32. data/config/initializers/user_class_extensions.rb +3 -0
  33. data/config/locales/en.yml +26 -0
  34. data/db/default/spree/countries.rb +2 -1
  35. data/db/migrate/20130213191427_create_default_stock.rb +3 -3
  36. data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
  37. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +1 -1
  38. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  39. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +5 -7
  40. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
  41. data/lib/generators/spree/dummy/templates/rails/database.yml +6 -6
  42. data/lib/spree/core/controller_helpers/auth.rb +10 -1
  43. data/lib/spree/core/controller_helpers/order.rb +1 -1
  44. data/lib/spree/core/controller_helpers/respond_with.rb +6 -1
  45. data/lib/spree/core/importer/order.rb +168 -0
  46. data/lib/spree/core/importer.rb +8 -0
  47. data/lib/spree/core/product_duplicator.rb +1 -1
  48. data/lib/spree/core/user_address.rb +2 -0
  49. data/lib/spree/core/user_payment_source.rb +20 -0
  50. data/lib/spree/core/version.rb +1 -1
  51. data/lib/spree/core.rb +4 -0
  52. data/lib/spree/migrations.rb +1 -1
  53. data/lib/spree/permitted_attributes.rb +1 -1
  54. data/lib/spree/testing_support/capybara_ext.rb +23 -1
  55. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -6
  56. data/lib/spree/testing_support/factories/order_factory.rb +8 -8
  57. data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -1
  58. data/lib/spree/testing_support/factories/user_factory.rb +5 -0
  59. metadata +11 -3
@@ -0,0 +1,168 @@
1
+ module Spree
2
+ module Core
3
+ module Importer
4
+ class Order
5
+
6
+ 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
+
13
+ order = Spree::Order.create!
14
+ order.associate_user!(user)
15
+
16
+ create_shipments_from_params(params.delete(:shipments_attributes), order)
17
+ create_line_items_from_params(params.delete(:line_items_attributes),order)
18
+ create_adjustments_from_params(params.delete(:adjustments_attributes), order)
19
+ create_payments_from_params(params.delete(:payments_attributes), order)
20
+
21
+ if(completed_at = params.delete(:completed_at))
22
+ order.completed_at = completed_at
23
+ order.state = 'complete'
24
+ end
25
+
26
+ order.update_attributes!(params)
27
+ order.reload
28
+ rescue Exception => e
29
+ order.destroy if order && order.persisted?
30
+ raise e.message
31
+ end
32
+ end
33
+
34
+ def self.create_shipments_from_params(shipments_hash, order)
35
+ return [] unless shipments_hash
36
+ shipments_hash.each do |s|
37
+ begin
38
+ shipment = order.shipments.build
39
+ shipment.tracking = s[:tracking]
40
+ shipment.stock_location = Spree::StockLocation.find_by_name!(s[:stock_location])
41
+
42
+ inventory_units = s[:inventory_units] || []
43
+ inventory_units.each do |iu|
44
+ ensure_variant_id_from_params(iu)
45
+
46
+ unit = shipment.inventory_units.build
47
+ unit.order = order
48
+ unit.variant_id = iu[:variant_id]
49
+ end
50
+
51
+ shipment.save!
52
+
53
+ shipping_method = Spree::ShippingMethod.find_by_name!(s[:shipping_method])
54
+ shipment.shipping_rates.create!(:shipping_method => shipping_method,
55
+ :cost => s[:cost])
56
+ rescue Exception => e
57
+ raise "Order import shipments: #{e.message} #{s}"
58
+ end
59
+ end
60
+ end
61
+
62
+ def self.create_line_items_from_params(line_items_hash, order)
63
+ return {} unless line_items_hash
64
+ line_items_hash.each_key do |k|
65
+ begin
66
+ line_item = line_items_hash[k]
67
+ ensure_variant_id_from_params(line_item)
68
+
69
+ extra_params = line_item.except(:variant_id, :quantity)
70
+ line_item = order.contents.add(Spree::Variant.find(line_item[:variant_id]), line_item[:quantity])
71
+ line_item.update_attributes(extra_params) unless extra_params.empty?
72
+ rescue Exception => e
73
+ raise "Order import line items: #{e.message} #{line_item}"
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.create_adjustments_from_params(adjustments, order)
79
+ return [] unless adjustments
80
+ adjustments.each do |a|
81
+ begin
82
+ adjustment = order.adjustments.build(:amount => a[:amount].to_f,
83
+ :label => a[:label])
84
+ adjustment.save!
85
+ adjustment.close!
86
+ rescue Exception => e
87
+ raise "Order import adjustments: #{e.message} #{a}"
88
+ end
89
+ end
90
+ end
91
+
92
+ def self.create_payments_from_params(payments_hash, order)
93
+ return [] unless payments_hash
94
+ payments_hash.each do |p|
95
+ begin
96
+ payment = order.payments.build
97
+ payment.amount = p[:amount].to_f
98
+ payment.state = p.fetch(:state, 'completed')
99
+ payment.payment_method = Spree::PaymentMethod.find_by_name!(p[:payment_method])
100
+ payment.save!
101
+ rescue Exception => e
102
+ raise "Order import payments: #{e.message} #{p}"
103
+ end
104
+ end
105
+ end
106
+
107
+ def self.ensure_variant_id_from_params(hash)
108
+ begin
109
+ unless hash[:variant_id].present?
110
+ hash[:variant_id] = Spree::Variant.active.find_by_sku!(hash[:sku]).id
111
+ hash.delete(:sku)
112
+ end
113
+ rescue Exception => e
114
+ raise "Ensure order import variant: #{e.message} #{hash}"
115
+ end
116
+ end
117
+
118
+ def self.ensure_country_id_from_params(address)
119
+ return if address.nil? or address[:country_id].present? or address[:country].nil?
120
+
121
+ begin
122
+ search = {}
123
+ if name = address[:country]['name']
124
+ search[:name] = name
125
+ elsif iso_name = address[:country]['iso_name']
126
+ search[:iso_name] = iso_name.upcase
127
+ elsif iso = address[:country]['iso']
128
+ search[:iso] = iso.upcase
129
+ elsif iso3 = address[:country]['iso3']
130
+ search[:iso3] = iso3.upcase
131
+ end
132
+
133
+ address.delete(:country)
134
+ address[:country_id] = Spree::Country.where(search).first!.id
135
+
136
+ rescue Exception => e
137
+ raise "Ensure order import address country: #{e.message} #{search}"
138
+ end
139
+ end
140
+
141
+ def self.ensure_state_id_from_params(address)
142
+ return if address.nil? or address[:state_id].present? or address[:state].nil?
143
+
144
+ begin
145
+ search = {}
146
+ if name = address[:state]['name']
147
+ search[:name] = name
148
+ elsif abbr = address[:state]['abbr']
149
+ search[:abbr] = abbr.upcase
150
+ end
151
+
152
+ address.delete(:state)
153
+ search[:country_id] = address[:country_id]
154
+
155
+ if state = Spree::State.where(search).first
156
+ address[:state_id] = state.id
157
+ else
158
+ address[:state_name] = search[:name] || search[:abbr]
159
+ end
160
+ rescue Exception => e
161
+ raise "Ensure order import address state: #{e.message} #{search}"
162
+ end
163
+ end
164
+
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ module Core
3
+ module Importer
4
+ end
5
+ end
6
+ end
7
+
8
+ require 'spree/core/importer/order'
@@ -48,7 +48,7 @@ module Spree
48
48
  new_variant = variant.dup
49
49
  new_variant.sku = "COPY OF #{new_variant.sku}"
50
50
  new_variant.deleted_at = nil
51
- new_variant.option_values = variant.option_values.map { |option_value| option_value.dup}
51
+ new_variant.option_values = variant.option_values.map { |option_value| option_value}
52
52
  new_variant
53
53
  end
54
54
 
@@ -10,6 +10,8 @@ module Spree
10
10
  belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
11
11
  alias_attribute :shipping_address, :ship_address
12
12
 
13
+ accepts_nested_attributes_for :ship_address, :bill_address
14
+
13
15
  def persist_order_address(order)
14
16
  b_address = self.bill_address || self.build_bill_address
15
17
  b_address.attributes = order.bill_address.attributes.except('id', 'updated_at', 'created_at')
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module Core
3
+ module UserPaymentSource
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
8
+
9
+ def payment_sources
10
+ credit_cards.with_payment_profile
11
+ end
12
+
13
+ def drop_payment_source(source)
14
+ gateway = source.payment_method
15
+ gateway.disable_customer_profile(source)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.2.0"
3
+ "2.2.1"
4
4
  end
5
5
  end
data/lib/spree/core.rb CHANGED
@@ -41,6 +41,7 @@ module Spree
41
41
  autoload :ProductFilters, "spree/core/product_filters"
42
42
 
43
43
  class GatewayError < RuntimeError; end
44
+ class DestroyWithOrdersError < StandardError; end
44
45
  end
45
46
  end
46
47
 
@@ -61,6 +62,7 @@ require 'spree/money'
61
62
 
62
63
  require 'spree/permitted_attributes'
63
64
  require 'spree/core/user_address'
65
+ require 'spree/core/user_payment_source'
64
66
  require 'spree/core/delegate_belongs_to'
65
67
  require 'spree/core/permalinks'
66
68
  require 'spree/core/token_resource'
@@ -70,3 +72,5 @@ require 'spree/core/controller_helpers'
70
72
  require 'spree/core/controller_helpers/strong_parameters'
71
73
  require 'spree/core/controller_helpers/ssl'
72
74
  require 'spree/core/controller_helpers/search'
75
+
76
+ require 'spree/core/importer'
@@ -30,7 +30,7 @@ module Spree
30
30
 
31
31
  unless (engine_migrations.sort - engine_in_app.sort).empty?
32
32
  puts "[#{engine_name.capitalize} WARNING] Missing migrations." \
33
- "Run `bundle exec rake railties:install:migrations` to get them.\n\n"
33
+ " Run `bundle exec rake railties:install:migrations` to get them.\n\n"
34
34
  true
35
35
  end
36
36
  end
@@ -69,7 +69,7 @@ module Spree
69
69
  @@source_attributes = [
70
70
  :number, :month, :year, :expiry, :verification_value,
71
71
  :first_name, :last_name, :cc_type, :gateway_customer_profile_id,
72
- :gateway_payment_profile_id, :last_digits, :name]
72
+ :gateway_payment_profile_id, :last_digits, :name, :encrypted_data]
73
73
 
74
74
  @@stock_item_attributes = [:variant, :stock_location, :backorderable, :variant_id]
75
75
 
@@ -103,12 +103,34 @@ module CapybaraExt
103
103
 
104
104
  def wait_for_ajax
105
105
  counter = 0
106
- while page.evaluate_script("$.active").to_i > 0
106
+ while page.evaluate_script("typeof($) === 'undefined' || $.active > 0")
107
107
  counter += 1
108
108
  sleep(0.1)
109
109
  raise "AJAX request took longer than 5 seconds." if counter >= 50
110
110
  end
111
111
  end
112
+
113
+ def accept_alert
114
+ if page.driver === Capybara::Selenium::Driver
115
+ yield
116
+ page.driver.browser.switch_to.alert.accept
117
+ else
118
+ page.evaluate_script('window.confirm = function() { return true; }')
119
+ yield
120
+ end
121
+ end
122
+ def dismiss_alert
123
+ if page.driver === Capybara::Selenium::Driver
124
+ yield
125
+ page.driver.browser.switch_to.alert.dismiss
126
+ else
127
+ page.evaluate_script('window.confirm = function() { return false; }')
128
+ yield
129
+
130
+ # Restore existing default
131
+ page.evaluate_script('window.confirm = function() { return true; }')
132
+ end
133
+ end
112
134
  end
113
135
 
114
136
  Capybara.configure do |config|
@@ -1,10 +1,5 @@
1
- # allows credit card info to be saved to the database which is needed for factories to work properly
2
- class TestCard < Spree::CreditCard
3
- def remove_readonly_attributes(attributes) attributes; end
4
- end
5
-
6
1
  FactoryGirl.define do
7
- factory :credit_card, class: TestCard do
2
+ factory :credit_card, class: Spree::CreditCard do
8
3
  verification_value 123
9
4
  month 12
10
5
  year { Time.now.year }
@@ -55,17 +55,17 @@ FactoryGirl.define do
55
55
  end
56
56
  order.reload
57
57
  end
58
- end
59
-
60
- factory :shipped_order do
61
- after(:create) do |order|
62
- order.shipments.each do |shipment|
63
- shipment.inventory_units.each { |u| u.update_column('state', 'shipped') }
64
- shipment.update_column('state', 'shipped')
58
+ factory :shipped_order do
59
+ after(:create) do |order|
60
+ order.shipments.each do |shipment|
61
+ shipment.inventory_units.each { |u| u.update_column('state', 'shipped') }
62
+ shipment.update_column('state', 'shipped')
63
+ end
64
+ order.reload
65
65
  end
66
- order.reload
67
66
  end
68
67
  end
68
+
69
69
  end
70
70
  end
71
71
  end
@@ -4,7 +4,9 @@ FactoryGirl.define do
4
4
  name 'UPS Ground'
5
5
 
6
6
  before(:create) do |shipping_method, evaluator|
7
- shipping_method.shipping_categories << (Spree::ShippingCategory.first || create(:shipping_category))
7
+ if shipping_method.shipping_categories.empty?
8
+ shipping_method.shipping_categories << (Spree::ShippingCategory.first || create(:shipping_category))
9
+ end
8
10
  end
9
11
 
10
12
  factory :shipping_method, class: Spree::ShippingMethod do
@@ -13,5 +13,10 @@ FactoryGirl.define do
13
13
  factory :admin_user do
14
14
  spree_roles { [Spree::Role.find_by(name: 'admin') || create(:role, name: 'admin')] }
15
15
  end
16
+
17
+ factory :user_with_addreses do
18
+ ship_address
19
+ bill_address
20
+ end
16
21
  end
17
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-26 00:00:00.000000000 Z
11
+ date: 2014-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -282,6 +282,7 @@ executables: []
282
282
  extensions: []
283
283
  extra_rdoc_files: []
284
284
  files:
285
+ - LICENSE
285
286
  - app/assets/images/logo/spree_50.png
286
287
  - app/assets/images/noimage/large.png
287
288
  - app/assets/images/noimage/mini.png
@@ -299,6 +300,8 @@ files:
299
300
  - app/mailers/spree/order_mailer.rb
300
301
  - app/mailers/spree/shipment_mailer.rb
301
302
  - app/mailers/spree/test_mailer.rb
303
+ - app/models/concerns/spree/user_api_authentication.rb
304
+ - app/models/concerns/spree/user_reporting.rb
302
305
  - app/models/spree/ability.rb
303
306
  - app/models/spree/address.rb
304
307
  - app/models/spree/adjustment.rb
@@ -337,6 +340,7 @@ files:
337
340
  - app/models/spree/option_value.rb
338
341
  - app/models/spree/order.rb
339
342
  - app/models/spree/order/checkout.rb
343
+ - app/models/spree/order/currency_updater.rb
340
344
  - app/models/spree/order_contents.rb
341
345
  - app/models/spree/order_inventory.rb
342
346
  - app/models/spree/order_populator.rb
@@ -556,6 +560,7 @@ files:
556
560
  - db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb
557
561
  - db/migrate/20140213184916_add_more_indexes.rb
558
562
  - db/migrate/20140219060952_add_considered_risky_to_orders.rb
563
+ - db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb
559
564
  - db/seeds.rb
560
565
  - lib/generators/spree/custom_user/custom_user_generator.rb
561
566
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
@@ -590,6 +595,8 @@ files:
590
595
  - lib/spree/core/environment.rb
591
596
  - lib/spree/core/environment/calculators.rb
592
597
  - lib/spree/core/environment_extension.rb
598
+ - lib/spree/core/importer.rb
599
+ - lib/spree/core/importer/order.rb
593
600
  - lib/spree/core/mail_interceptor.rb
594
601
  - lib/spree/core/mail_method.rb
595
602
  - lib/spree/core/mail_settings.rb
@@ -600,6 +607,7 @@ files:
600
607
  - lib/spree/core/search/base.rb
601
608
  - lib/spree/core/token_resource.rb
602
609
  - lib/spree/core/user_address.rb
610
+ - lib/spree/core/user_payment_source.rb
603
611
  - lib/spree/core/validators/email.rb
604
612
  - lib/spree/core/version.rb
605
613
  - lib/spree/i18n.rb
@@ -707,7 +715,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
707
715
  version: '0'
708
716
  requirements: []
709
717
  rubyforge_project:
710
- rubygems_version: 2.2.0
718
+ rubygems_version: 2.2.2
711
719
  signing_key:
712
720
  specification_version: 4
713
721
  summary: The bare bones necessary for Spree.