spree_api 2.2.1 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b9a1e586735e3cc1e1cee5cd20399b9921dc7b2
4
- data.tar.gz: cb20dc4dc54932929151ce653e94964cc367a89f
3
+ metadata.gz: 898408b377a8e9d880bf8eb6ba24b5e732df26fc
4
+ data.tar.gz: 24fbb8abc05caf4c6a2f7a07c309690d44d0e3a2
5
5
  SHA512:
6
- metadata.gz: bdc2ad8bdf4143851a2a16ecbad2dfe6bacde972a4f6e42bfa59907edf62e55ae4f5077bd58a37d84a8cedb29187aaa22f90aeef221b18bc8b873ed82b4b363a
7
- data.tar.gz: 8ab5f9384fe52caffe246354ba6b16b62343d5b495d19feee302d89b9fdecbb499b6fb139efe1f0386f1a29dea8549947737ef632c89ce0c8b323a10c63cfe3d
6
+ metadata.gz: 348fa6f5b63439eeaacda5659931402eefe300c0eac4d9922d0b2800ada8baf81a40c6015c757cb331c47c8aaac8b2c5d84ffba38a0a26aee87ccb8e5a4444e6
7
+ data.tar.gz: cdaf932f2f3a76ab20e43d6b99bd49a9c2d41b58b525a72732187c7250296aa5f9835b78f1a49f665d33a903d4aa4f7d1ac4b8462dcceff39de2c4e243dd7895
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- ## Spree 2.2.1 (unreleased) ##
1
+ ## Spree 2.2.2 (unreleased) ##
2
2
 
3
3
  * refactor the api to use a general importer in core gem.
4
- Peter Berkenbosch
4
+
5
+ * Peter Berkenbosch
6
+
7
+ * Allow for linking of users to orders by admins
8
+
9
+ * Ryan Bigg
@@ -24,7 +24,7 @@ module Spree
24
24
  end
25
25
 
26
26
  def find_order
27
- @order = Spree::Order.find_by!(number: params[:order_id]) if params[:order_id]
27
+ @order = Spree::Order.find_by!(number: order_id) if order_id
28
28
  end
29
29
 
30
30
  def find_address
@@ -145,8 +145,12 @@ module Spree
145
145
  scope
146
146
  end
147
147
 
148
+ def order_id
149
+ params[:order_id] || params[:checkout_id] || params[:order_number]
150
+ end
151
+
148
152
  def authorize_for_order
149
- @order = Spree::Order.find_by(number: params[:order_id] || params[:order_number] || params[:id])
153
+ @order = Spree::Order.find_by(number: order_id)
150
154
  authorize! :read, @order, order_token
151
155
  end
152
156
  end
@@ -130,6 +130,10 @@ module Spree
130
130
  end
131
131
  false
132
132
  end
133
+
134
+ def order_id
135
+ super || params[:id]
136
+ end
133
137
  end
134
138
  end
135
139
  end
@@ -35,7 +35,7 @@ module Spree
35
35
  private
36
36
 
37
37
  def order
38
- @order ||= Spree::Order.includes(:line_items).find_by!(number: params[:order_id])
38
+ @order ||= Spree::Order.includes(:line_items).find_by!(number: order_id)
39
39
  authorize! :update, @order, order_token
40
40
  end
41
41
 
@@ -28,6 +28,7 @@ module Spree
28
28
 
29
29
  def empty
30
30
  find_order
31
+ authorize! :update, @order, order_token
31
32
  @order.empty!
32
33
  @order.update!
33
34
  render text: nil, status: 200
@@ -41,6 +42,7 @@ module Spree
41
42
 
42
43
  def show
43
44
  find_order
45
+ authorize! :show, @order, order_token
44
46
  method = "before_#{@order.state}"
45
47
  send(method) if respond_to?(method, true)
46
48
  respond_with(@order)
@@ -48,6 +50,7 @@ module Spree
48
50
 
49
51
  def update
50
52
  find_order(true)
53
+ authorize! :update, @order, order_token
51
54
  # Parsing line items through as an update_attributes call in the API will result in
52
55
  # many line items for the same variant_id being created. We must be smarter about this,
53
56
  # hence the use of the update_line_items method, defined within order_decorator.rb.
@@ -74,6 +77,7 @@ module Spree
74
77
 
75
78
  def apply_coupon_code
76
79
  find_order
80
+ authorize! :update, @order, order_token
77
81
  @order.coupon_code = params[:coupon_code]
78
82
  @handler = PromotionHandler::Coupon.new(@order).apply
79
83
  status = @handler.successful? ? 200 : 422
@@ -138,13 +142,15 @@ module Spree
138
142
 
139
143
  def find_order(lock = false)
140
144
  @order = Spree::Order.lock(lock).find_by!(number: params[:id])
141
- authorize! :update, @order, order_token
142
145
  end
143
146
 
144
147
  def before_delivery
145
148
  @order.create_proposed_shipments
146
149
  end
147
150
 
151
+ def order_id
152
+ super || params[:id]
153
+ end
148
154
  end
149
155
  end
150
156
  end
@@ -66,7 +66,7 @@ module Spree
66
66
  private
67
67
 
68
68
  def find_order
69
- @order = Spree::Order.find_by(number: params[:order_id])
69
+ @order = Spree::Order.find_by(number: order_id)
70
70
  authorize! :read, @order
71
71
  end
72
72
 
@@ -76,7 +76,7 @@ module Spree
76
76
  private
77
77
 
78
78
  def order
79
- @order ||= Spree::Order.find_by!(number: params[:order_id])
79
+ @order ||= Spree::Order.find_by!(number: order_id)
80
80
  authorize! :read, @order
81
81
  end
82
82
 
@@ -6,6 +6,11 @@ module Spree
6
6
  before_filter :find_and_update_shipment, only: [:ship, :ready, :add, :remove]
7
7
 
8
8
  def create
9
+ # TODO Can remove conditional here once deprecated #find_order is removed.
10
+ unless @order.present?
11
+ @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
12
+ authorize! :read, @order
13
+ end
9
14
  authorize! :create, Shipment
10
15
  variant = Spree::Variant.find(params[:variant_id])
11
16
  quantity = params[:quantity].to_i
@@ -19,7 +24,11 @@ module Spree
19
24
  end
20
25
 
21
26
  def update
22
- @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
27
+ if @order.present?
28
+ @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
29
+ else
30
+ @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
31
+ end
23
32
 
24
33
  unlock = params[:shipment].delete(:unlock)
25
34
 
@@ -59,7 +68,7 @@ module Spree
59
68
  variant = Spree::Variant.find(params[:variant_id])
60
69
  quantity = params[:quantity].to_i
61
70
 
62
- @order.contents.add(variant, quantity, nil, @shipment)
71
+ @shipment.order.contents.add(variant, quantity, nil, @shipment)
63
72
 
64
73
  respond_with(@shipment, default_template: :show)
65
74
  end
@@ -68,7 +77,7 @@ module Spree
68
77
  variant = Spree::Variant.find(params[:variant_id])
69
78
  quantity = params[:quantity].to_i
70
79
 
71
- @order.contents.remove(variant, quantity, @shipment)
80
+ @shipment.order.contents.remove(variant, quantity, @shipment)
72
81
  @shipment.reload if @shipment.persisted?
73
82
  respond_with(@shipment, default_template: :show)
74
83
  end
@@ -76,12 +85,19 @@ module Spree
76
85
  private
77
86
 
78
87
  def find_order
79
- @order = Spree::Order.find_by!(number: params[:order_id])
80
- authorize! :read, @order
88
+ if params[:order_id].present?
89
+ ActiveSupport::Deprecation.warn "Spree::Api::ShipmentsController#find_order is deprecated and will be removed from Spree 2.3.x, access shipments directly without being nested to orders route instead.", caller
90
+ @order = Spree::Order.find_by!(number: params[:order_id])
91
+ authorize! :read, @order
92
+ end
81
93
  end
82
94
 
83
95
  def find_and_update_shipment
84
- @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
96
+ if @order.present?
97
+ @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
98
+ else
99
+ @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
100
+ end
85
101
  @shipment.update_attributes(shipment_params)
86
102
  @shipment.reload
87
103
  end
@@ -48,7 +48,7 @@ module Spree
48
48
  @@product_attributes = [
49
49
  :id, :name, :description, :price, :display_price, :available_on,
50
50
  :slug, :meta_description, :meta_keywords, :shipping_category_id,
51
- :taxon_ids
51
+ :taxon_ids, :total_on_hand
52
52
  ]
53
53
 
54
54
  @@product_property_attributes = [
@@ -112,7 +112,7 @@ module Spree
112
112
  @@address_attributes = [
113
113
  :id, :firstname, :lastname, :full_name, :address1, :address2, :city,
114
114
  :zipcode, :phone, :company, :alternative_phone, :country_id, :state_id,
115
- :state_name
115
+ :state_name, :state_text
116
116
  ]
117
117
 
118
118
  @@country_attributes = [:id, :iso_name, :iso, :iso3, :name, :numcode]
@@ -126,7 +126,7 @@ module Spree
126
126
  ]
127
127
 
128
128
  @@creditcard_attributes = [
129
- :id, :month, :year, :cc_type, :last_digits, :first_name, :last_name,
129
+ :id, :month, :year, :cc_type, :last_digits, :name,
130
130
  :gateway_customer_profile_id, :gateway_payment_profile_id
131
131
  ]
132
132
 
@@ -4,5 +4,6 @@ node(:display_item_total) { |o| o.display_item_total.to_s }
4
4
  node(:total_quantity) { |o| o.line_items.sum(:quantity) }
5
5
  node(:display_total) { |o| o.display_total.to_s }
6
6
  node(:display_ship_total) { |o| o.display_ship_total }
7
+ node(:display_tax_total) { |o| o.display_tax_total }
7
8
  node(:token) { |o| o.token }
8
9
  node(:checkout_steps) { |o| o.checkout_steps }
data/config/routes.rb CHANGED
@@ -15,33 +15,7 @@ Spree::Core::Engine.add_routes do
15
15
  resources :product_properties
16
16
  end
17
17
 
18
- resources :checkouts do
19
- member do
20
- put :next
21
- put :advance
22
- end
23
- end
24
-
25
- resources :variants, :only => [:index, :show] do
26
- resources :images
27
- end
28
-
29
- resources :option_types do
30
- resources :option_values
31
- end
32
-
33
- get '/orders/mine', :to => 'orders#mine', :as => 'my_orders'
34
-
35
- resources :orders do
36
- resources :addresses, :only => [:show, :update]
37
-
38
- resources :return_authorizations do
39
- member do
40
- put :add
41
- put :cancel
42
- put :receive
43
- end
44
- end
18
+ order_routes = lambda {
45
19
  member do
46
20
  put :cancel
47
21
  put :empty
@@ -58,7 +32,7 @@ Spree::Core::Engine.add_routes do
58
32
  put :credit
59
33
  end
60
34
  end
61
-
35
+ # TODO Remove after shipment api is no longer handled through order nesting.
62
36
  resources :shipments, :only => [:create, :update] do
63
37
  member do
64
38
  put :ready
@@ -67,10 +41,50 @@ Spree::Core::Engine.add_routes do
67
41
  put :remove
68
42
  end
69
43
  end
44
+
45
+ resources :addresses, :only => [:show, :update]
46
+
47
+ resources :return_authorizations do
48
+ member do
49
+ put :add
50
+ put :cancel
51
+ put :receive
52
+ end
53
+ end
54
+ }
55
+
56
+ resources :checkouts do
57
+ member do
58
+ put :next
59
+ put :advance
60
+ end
61
+ order_routes.call
70
62
  end
71
63
 
64
+ resources :variants, :only => [:index, :show] do
65
+ resources :images
66
+ end
67
+
68
+ resources :option_types do
69
+ resources :option_values
70
+ end
71
+
72
+ get '/orders/mine', :to => 'orders#mine', :as => 'my_orders'
73
+
74
+ resources :orders, &order_routes
75
+
72
76
  resources :zones
73
- resources :countries, :only => [:index, :show]
77
+ resources :countries, :only => [:index, :show] do
78
+ resources :states, :only => [:index, :show]
79
+ end
80
+ resources :shipments, :only => [:create, :update] do
81
+ member do
82
+ put :ready
83
+ put :ship
84
+ put :add
85
+ put :remove
86
+ end
87
+ end
74
88
  resources :states, :only => [:index, :show]
75
89
 
76
90
  resources :taxonomies do
@@ -9,6 +9,11 @@ module Spree
9
9
  Rabl.configure do |config|
10
10
  config.include_json_root = false
11
11
  config.include_child_root = false
12
+
13
+ # Motivation here it make it call as_json when rendering. Otherwise it
14
+ # would fall to JSON and get errors like the one described here https://github.com/spree/spree/issues/4589
15
+ # where Float::INFINITY would resolve to Infinite (invalid json) istead of null
16
+ config.json_engine = ActiveSupport::JSON
12
17
  end
13
18
 
14
19
  config.view_versions = [1]
@@ -31,5 +36,3 @@ module Spree
31
36
  end
32
37
  end
33
38
  end
34
-
35
-
@@ -173,7 +173,8 @@ module Spree
173
173
  order.update_column(:state, "payment")
174
174
  api_put :update, :id => order.to_param, :order_token => order.token,
175
175
  :order => { :payments_attributes => [{ :payment_method_id => @payment_method.id.to_s }],
176
- :payment_source => { @payment_method.id.to_s => { } } }
176
+ :payment_source => { @payment_method.id.to_s => { name: "Spree" } } }
177
+
177
178
  response.status.should == 422
178
179
  cc_errors = json_response['errors']['payments.Credit Card']
179
180
  cc_errors.should include("Number can't be blank")
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'spree/testing_support/bar_ability'
2
3
 
3
4
  module Spree
4
5
  describe Api::OrdersController do
@@ -116,6 +117,20 @@ module Spree
116
117
  response.status.should == 200
117
118
  end
118
119
 
120
+ context "with BarAbility registered" do
121
+ before { Spree::Ability.register_ability(::BarAbility) }
122
+ after { Spree::Ability.remove_ability(::BarAbility) }
123
+
124
+ it "can view an order" do
125
+ user = mock_model(Spree::LegacyUser)
126
+ user.stub(:has_spree_role?).with('bar').and_return(true)
127
+ user.stub(:has_spree_role?).with('admin').and_return(false)
128
+ controller.stub try_spree_current_user: user
129
+ api_get :show, :id => order.to_param
130
+ response.status.should == 200
131
+ end
132
+ end
133
+
119
134
  it "cannot cancel an order that doesn't belong to them" do
120
135
  order.update_attribute(:completed_at, Time.now)
121
136
  order.update_attribute(:shipment_state, "ready")
@@ -7,7 +7,7 @@ module Spree
7
7
 
8
8
  let!(:product) { create(:product) }
9
9
  let!(:inactive_product) { create(:product, :available_on => Time.now.tomorrow, :name => "inactive") }
10
- let(:base_attributes) { [:id, :name, :description, :price, :display_price, :available_on, :slug, :meta_description, :meta_keywords, :shipping_category_id, :taxon_ids] }
10
+ let(:base_attributes) { Api::ApiHelpers.product_attributes }
11
11
  let(:show_attributes) { base_attributes.dup.push(:has_variants) }
12
12
  let(:new_attributes) { base_attributes }
13
13
 
@@ -166,6 +166,17 @@ module Spree
166
166
  :property_name])
167
167
  end
168
168
 
169
+ context "tracking is disabled" do
170
+ before { Config.track_inventory_levels = false }
171
+
172
+ it "still displays valid json with total on hand" do
173
+ api_get :show, :id => product.to_param
174
+ expect(response).to be_ok
175
+ expect(json_response[:total_on_hand]).to eq nil
176
+ end
177
+
178
+ after { Config.track_inventory_levels = true }
179
+ end
169
180
 
170
181
  context "finds a product by slug first then by id" do
171
182
  let!(:other_product) { create(:product, :slug => "these-are-not-the-droids-you-are-looking-for") }
@@ -9,17 +9,17 @@ describe Spree::Api::ShipmentsController do
9
9
  stub_authentication!
10
10
  end
11
11
 
12
- let!(:resource_scoping) { { :order_id => shipment.order.to_param, :id => shipment.to_param } }
12
+ let!(:resource_scoping) { { id: shipment.to_param, shipment: { order_id: shipment.order.to_param } } }
13
13
 
14
14
  context "as a non-admin" do
15
15
  it "cannot make a shipment ready" do
16
16
  api_put :ready
17
- assert_unauthorized!
17
+ assert_not_found!
18
18
  end
19
19
 
20
20
  it "cannot make a shipment shipped" do
21
21
  api_put :ship
22
- assert_unauthorized!
22
+ assert_not_found!
23
23
  end
24
24
  end
25
25
 
@@ -32,7 +32,7 @@ describe Spree::Api::ShipmentsController do
32
32
  it 'can create a new shipment' do
33
33
  params = {
34
34
  variant_id: stock_location.stock_items.first.variant.to_param,
35
- order_id: order.number,
35
+ shipment: { order_id: order.number },
36
36
  stock_location_id: stock_location.to_param,
37
37
  }
38
38
 
@@ -70,7 +70,7 @@ describe Spree::Api::ShipmentsController do
70
70
 
71
71
  context 'for completed shipments' do
72
72
  let(:order) { create :completed_order_with_totals }
73
- let!(:resource_scoping) { { :order_id => order.to_param, :id => order.shipments.first.to_param } }
73
+ let!(:resource_scoping) { { id: order.shipments.first.to_param, shipment: { order_id: order.to_param } } }
74
74
 
75
75
  it 'adds a variant to a shipment' do
76
76
  api_put :add, { variant_id: variant.to_param, quantity: 2 }
@@ -100,10 +100,21 @@ describe Spree::Api::ShipmentsController do
100
100
 
101
101
  it "can transition a shipment from ready to ship" do
102
102
  shipment.reload
103
- api_put :ship, :order_id => shipment.order.to_param, :id => shipment.to_param, :shipment => { :tracking => "123123" }
103
+ api_put :ship, id: shipment.to_param, shipment: { tracking: "123123", order_id: shipment.order.to_param }
104
104
  json_response.should have_attributes(attributes)
105
105
  json_response["state"].should == "shipped"
106
106
  end
107
+
108
+ context 'DEPRECATED:' do
109
+ it "can transition a shipment from ready to ship" do
110
+ ActiveSupport::Deprecation.should_receive(:warn).once
111
+ shipment.reload
112
+ api_put :ship, order_id: shipment.order.to_param, id: shipment.to_param, shipment: { tracking: "123123" }
113
+ json_response.should have_attributes(attributes)
114
+ json_response["state"].should == "shipped"
115
+ end
116
+ end
117
+
107
118
  end
108
119
  end
109
120
  end
@@ -17,6 +17,12 @@ module Spree
17
17
  json_response['states'].first['name'].should eq(state.name)
18
18
  end
19
19
 
20
+ it "gets all the states for a particular country" do
21
+ api_get :index, :country_id => state.country.id
22
+ json_response["states"].first.should have_attributes(attributes)
23
+ json_response['states'].first['name'].should eq(state.name)
24
+ end
25
+
20
26
  context "pagination" do
21
27
  before do
22
28
  State.should_receive(:accessible_by).and_return(@scope = double)
@@ -14,7 +14,10 @@ describe "Rabl Cache", :caching => true do
14
14
  response.status.should == 200
15
15
 
16
16
  # Make sure we get a non master variant
17
- variant_a = JSON.parse(response.body)['variants'].last
17
+ variant_a = JSON.parse(response.body)['variants'].select do |v|
18
+ !v['is_master']
19
+ end.first
20
+
18
21
  variant_a['is_master'].should be_false
19
22
  variant_a['stock_items'].should_not be_nil
20
23
 
@@ -26,4 +29,4 @@ describe "Rabl Cache", :caching => true do
26
29
  variant_a['id'].should == variant_b['id']
27
30
  variant_b['stock_items'].should be_nil
28
31
  end
29
- end
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2014-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.2.1
19
+ version: 2.2.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.2.1
26
+ version: 2.2.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rabl
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -254,7 +254,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
254
  version: '0'
255
255
  requirements: []
256
256
  rubyforge_project:
257
- rubygems_version: 2.2.2
257
+ rubygems_version: 2.2.0
258
258
  signing_key:
259
259
  specification_version: 4
260
260
  summary: Spree's API