spree_core 1.3.1 → 1.3.2

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 (87) hide show
  1. data/LICENSE +1 -1
  2. data/app/assets/javascripts/admin/admin.js.erb +1 -1
  3. data/app/assets/javascripts/admin/shipping_methods.js.coffee +1 -1
  4. data/app/assets/javascripts/admin/spree_core.js +1 -0
  5. data/app/assets/javascripts/admin/variant_autocomplete.js.erb +1 -1
  6. data/app/assets/stylesheets/admin/globals/_variables.scss +7 -7
  7. data/app/assets/stylesheets/admin/plugins/font-awesome.scss +2 -2
  8. data/app/assets/stylesheets/admin/shared/_forms.scss +19 -16
  9. data/app/assets/stylesheets/admin/shared/_layout.scss +1 -1
  10. data/app/assets/stylesheets/admin/shared/_typography.scss +10 -10
  11. data/app/assets/stylesheets/store/screen.css.scss +50 -50
  12. data/app/controllers/spree/admin/base_controller.rb +0 -1
  13. data/app/controllers/spree/admin/images_controller.rb +1 -1
  14. data/app/controllers/spree/admin/line_items_controller.rb +1 -0
  15. data/app/controllers/spree/admin/orders_controller.rb +5 -1
  16. data/app/controllers/spree/admin/payments_controller.rb +2 -1
  17. data/app/controllers/spree/admin/products_controller.rb +3 -1
  18. data/app/controllers/spree/admin/resource_controller.rb +15 -4
  19. data/app/controllers/spree/admin/shipments_controller.rb +6 -1
  20. data/app/controllers/spree/admin/taxons_controller.rb +0 -6
  21. data/app/controllers/spree/checkout_controller.rb +0 -4
  22. data/app/controllers/spree/locale_controller.rb +2 -2
  23. data/app/controllers/spree/orders_controller.rb +1 -1
  24. data/app/helpers/spree/admin/base_helper.rb +9 -1
  25. data/app/helpers/spree/admin/images_helper.rb +14 -0
  26. data/app/helpers/spree/admin/products_helper.rb +1 -1
  27. data/app/helpers/spree/base_helper.rb +3 -3
  28. data/app/models/spree/ability.rb +2 -6
  29. data/app/models/spree/address.rb +6 -1
  30. data/app/models/spree/legacy_user.rb +11 -0
  31. data/app/models/spree/log_entry.rb +11 -0
  32. data/app/models/spree/order.rb +11 -5
  33. data/app/models/spree/order_populator.rb +2 -2
  34. data/app/models/spree/order_updater.rb +11 -11
  35. data/app/models/spree/payment/processing.rb +2 -2
  36. data/app/models/spree/payment.rb +20 -1
  37. data/app/models/spree/payment_method.rb +10 -3
  38. data/app/models/spree/preference.rb +0 -29
  39. data/app/models/spree/preferences/store.rb +4 -10
  40. data/app/models/spree/product/scopes.rb +2 -2
  41. data/app/models/spree/product.rb +2 -5
  42. data/app/models/spree/product_property.rb +3 -1
  43. data/app/models/spree/property.rb +0 -2
  44. data/app/models/spree/return_authorization.rb +1 -1
  45. data/app/models/spree/shipment.rb +1 -1
  46. data/app/models/spree/variant.rb +1 -1
  47. data/app/views/spree/admin/general_settings/edit.html.erb +2 -2
  48. data/app/views/spree/admin/images/index.html.erb +6 -33
  49. data/app/views/spree/admin/orders/_form.html.erb +1 -1
  50. data/app/views/spree/admin/payment_methods/_form.html.erb +4 -0
  51. data/app/views/spree/admin/payment_methods/index.html.erb +3 -1
  52. data/app/views/spree/admin/product_properties/_product_property_fields.html.erb +5 -1
  53. data/app/views/spree/admin/product_properties/index.html.erb +2 -2
  54. data/app/views/spree/admin/products/_form.html.erb +1 -6
  55. data/app/views/spree/admin/products/edit.html.erb +4 -1
  56. data/app/views/spree/admin/prototypes/_form.html.erb +1 -1
  57. data/app/views/spree/admin/prototypes/select.js.erb +2 -2
  58. data/app/views/spree/admin/return_authorizations/index.html.erb +1 -1
  59. data/app/views/spree/admin/shared/_tabs.html.erb +1 -1
  60. data/app/views/spree/admin/shared/_translations.html.erb +1 -1
  61. data/app/views/spree/admin/shipments/_form.html.erb +1 -1
  62. data/app/views/spree/admin/shipping_methods/_form.html.erb +3 -3
  63. data/app/views/spree/admin/taxonomies/get_children.json.erb +1 -1
  64. data/app/views/spree/admin/variants/_autocomplete.js.erb +1 -1
  65. data/app/views/spree/shared/_order_details.html.erb +1 -1
  66. data/config/routes.rb +5 -1
  67. data/db/migrate/20121031162139_split_prices_from_variants.rb +1 -1
  68. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +9 -0
  69. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +6 -0
  70. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +5 -0
  71. data/lib/generators/spree/install/install_generator.rb +4 -1
  72. data/lib/spree/core/controller_helpers/common.rb +3 -3
  73. data/lib/spree/core/controller_helpers.rb +13 -0
  74. data/lib/spree/core/engine.rb +7 -4
  75. data/lib/spree/core/permalinks.rb +1 -1
  76. data/lib/spree/core/ssl_requirement.rb +1 -1
  77. data/lib/spree/core/testing_support/authorization_helpers.rb +5 -2
  78. data/lib/spree/core/testing_support/bar_ability.rb +17 -0
  79. data/lib/spree/core/testing_support/factories/product_factory.rb +4 -2
  80. data/lib/spree/core/testing_support/factories/variant_factory.rb +9 -3
  81. data/lib/spree/core/testing_support/preferences.rb +12 -6
  82. data/lib/spree/core/version.rb +1 -1
  83. data/lib/spree/core.rb +1 -1
  84. data/lib/spree/scopes/dynamic.rb +1 -1
  85. data/lib/tasks/core.rake +3 -3
  86. data/vendor/assets/javascripts/jquery-migrate-1.0.0.js +498 -0
  87. metadata +14 -7
@@ -77,7 +77,7 @@ module Spree
77
77
 
78
78
  def load_data
79
79
  @amount = params[:amount] || load_order.total
80
- @payment_methods = PaymentMethod.available
80
+ @payment_methods = PaymentMethod.available(:back_end)
81
81
  if @payment and @payment.payment_method
82
82
  @payment_method = @payment.payment_method
83
83
  else
@@ -88,6 +88,7 @@ module Spree
88
88
 
89
89
  def load_order
90
90
  @order = Order.find_by_number!(params[:order_id])
91
+ authorize! params[:action], @order
91
92
  end
92
93
 
93
94
  def load_payment
@@ -9,10 +9,12 @@ module Spree
9
9
  update.before :update_before
10
10
 
11
11
  def show
12
+ session[:return_to] ||= request.referer
12
13
  redirect_to( :action => :edit )
13
14
  end
14
15
 
15
16
  def index
17
+ session[:return_to] = request.url
16
18
  respond_with(@collection)
17
19
  end
18
20
 
@@ -33,7 +35,7 @@ module Spree
33
35
  end
34
36
 
35
37
  def destroy
36
- @product = Product.where(:permalink => params[:id]).first!
38
+ @product = Product.find_by_permalink!(params[:id])
37
39
  @product.delete
38
40
 
39
41
  flash.notice = I18n.t('notice_messages.product_deleted')
@@ -40,6 +40,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
40
40
 
41
41
  def create
42
42
  invoke_callbacks(:create, :before)
43
+ @object.attributes = params[object_name]
43
44
  if @object.save
44
45
  invoke_callbacks(:create, :after)
45
46
  flash[:success] = flash_message_for(@object, :successfully_created)
@@ -134,9 +135,19 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
134
135
  def load_resource
135
136
  if member_action?
136
137
  @object ||= load_resource_instance
138
+
139
+ # call authorize! a third time (called twice already in Admin::BaseController)
140
+ # this time we pass the actual instance so fine-grained abilities can control
141
+ # access to individual records, not just entire models.
142
+ authorize! params[:action], @object
143
+
137
144
  instance_variable_set("@#{object_name}", @object)
138
145
  else
139
146
  @collection ||= collection
147
+
148
+ # note: we don't call authorize here as the collection method should use
149
+ # CanCan's accessible_by method to restrict the actual records returned
150
+
140
151
  instance_variable_set("@#{controller_name}", @collection)
141
152
  end
142
153
  end
@@ -155,7 +166,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
155
166
 
156
167
  def parent
157
168
  if parent_data.present?
158
- @parent ||= parent_data[:model_class].where(parent_data[:find_by] => params["#{model_name}_id"]).first
169
+ @parent ||= parent_data[:model_class].send("find_by_#{parent_data[:find_by]}", params["#{model_name}_id"])
159
170
  instance_variable_set("@#{model_name}", @parent)
160
171
  else
161
172
  nil
@@ -172,16 +183,16 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
172
183
 
173
184
  def build_resource
174
185
  if parent_data.present?
175
- parent.send(controller_name).build(params[object_name])
186
+ parent.send(controller_name).build
176
187
  else
177
- model_class.new(params[object_name])
188
+ model_class.new
178
189
  end
179
190
  end
180
191
 
181
192
  def collection
182
193
  return parent.send(controller_name) if parent_data.present?
183
194
  if model_class.respond_to?(:accessible_by) && !current_ability.has_block?(params[:action], model_class)
184
- model_class.accessible_by(current_ability)
195
+ model_class.accessible_by(current_ability, params[:action])
185
196
  else
186
197
  model_class.scoped
187
198
  end
@@ -79,10 +79,11 @@ module Spree
79
79
 
80
80
  def order
81
81
  @order ||= Order.find_by_number(params[:order_id])
82
+ authorize! params[:action], @order
82
83
  end
83
84
 
84
85
  def shipment
85
- @shipment ||= Shipment.find_by_number(params[:id])
86
+ @shipment ||= order.shipments.find_by_number(params[:id])
86
87
  end
87
88
 
88
89
  def build_shipment
@@ -92,6 +93,10 @@ module Spree
92
93
  @shipment.shipping_method ||= order.shipping_method
93
94
  @shipment.attributes = params[:shipment]
94
95
  end
96
+
97
+ def model_class
98
+ Spree::Shipment
99
+ end
95
100
  end
96
101
  end
97
102
  end
@@ -109,12 +109,6 @@ module Spree
109
109
  respond_with(@taxon) { |format| format.json { render :json => '' } }
110
110
  end
111
111
 
112
- private
113
-
114
- def load_product
115
- Product.find_by_permalink! params[:product_id]
116
- end
117
-
118
112
  end
119
113
  end
120
114
  end
@@ -107,10 +107,6 @@ module Spree
107
107
  @order.shipping_method ||= (@order.rate_hash.first && @order.rate_hash.first[:shipping_method])
108
108
  end
109
109
 
110
- def before_payment
111
- current_order.payments.destroy_all if request.put?
112
- end
113
-
114
110
  def after_complete
115
111
  session[:order_id] = nil
116
112
  end
@@ -4,8 +4,8 @@ module Spree
4
4
  if request.referer && request.referer.starts_with?('http://' + request.host)
5
5
  session['user_return_to'] = request.referer
6
6
  end
7
- if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
8
- session[:locale] = I18n.locale = params[:locale].to_sym
7
+ if params[:locale] && I18n.available_locales.map(&:to_s).include?(params[:locale])
8
+ session[:locale] = I18n.locale = params[:locale]
9
9
  flash.notice = t(:locale_changed)
10
10
  else
11
11
  flash[:error] = t(:locale_not_changed)
@@ -40,7 +40,7 @@ module Spree
40
40
 
41
41
  # Adds a new item to the order (creating a new order if none already exists)
42
42
  def populate
43
- populator = OrderPopulator.new(current_order(true), current_currency)
43
+ populator = Spree::OrderPopulator.new(current_order(true), current_currency)
44
44
  if populator.populate(params.slice(:products, :variants, :quantity))
45
45
  fire_event('spree.cart.add')
46
46
  fire_event('spree.order.contents_changed')
@@ -22,6 +22,14 @@ module Spree
22
22
  end
23
23
  end
24
24
 
25
+ def datepicker_field_value(date)
26
+ unless date.blank?
27
+ l(date, :format => t('spree.date_picker.format'))
28
+ else
29
+ nil
30
+ end
31
+ end
32
+
25
33
  # This method demonstrates the use of the :child_index option to render a
26
34
  # form partial for, for instance, client side addition of new nested
27
35
  # records.
@@ -54,7 +62,7 @@ module Spree
54
62
  def remove_nested(fields)
55
63
  out = ''
56
64
  out << fields.hidden_field(:_destroy) unless fields.object.new_record?
57
- out << (link_to icon('delete'), "#", :class => 'remove')
65
+ out << (link_to icon('icon-remove'), "#", :class => 'remove')
58
66
  out.html_safe
59
67
  end
60
68
 
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module Admin
3
+ module ImagesHelper
4
+ def options_text_for(image)
5
+ if image.viewable.is_a?(Spree::Variant)
6
+ image.viewable.options_text
7
+ else
8
+ "All"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -7,7 +7,7 @@ module Spree
7
7
  content_tag(:option,
8
8
  :value => taxon.id,
9
9
  :selected => ('selected' if selected)) do
10
- (taxon.ancestors.map(&:name) + [taxon.name]).join(" -> ")
10
+ (taxon.ancestors.pluck(:name) + [taxon.name]).join(" -> ")
11
11
  end
12
12
  end.join("").html_safe
13
13
  end
@@ -13,7 +13,7 @@ module Spree
13
13
  end
14
14
 
15
15
  def link_to_cart(text = nil)
16
- return "" if current_spree_page?(cart_path)
16
+ return "" if current_spree_page?(spree.cart_path)
17
17
 
18
18
  text = text ? h(text) : t('cart')
19
19
  css_class = nil
@@ -26,7 +26,7 @@ module Spree
26
26
  css_class = 'full'
27
27
  end
28
28
 
29
- link_to text, cart_path, :class => css_class
29
+ link_to text, spree.cart_path, :class => css_class
30
30
  end
31
31
 
32
32
  # human readable list of variant options
@@ -127,7 +127,7 @@ module Spree
127
127
  end
128
128
 
129
129
  countries.collect do |country|
130
- country.name = I18n.t(country.iso, :scope => 'countries', :default => country.name)
130
+ country.name = I18n.t(country.iso, :scope => 'country_names', :default => country.name)
131
131
  country
132
132
  end.sort { |a, b| a.name <=> b.name }
133
133
  end
@@ -30,18 +30,14 @@ module Spree
30
30
  alias_action :new, :to => :create
31
31
  alias_action :new_action, :to => :create
32
32
  alias_action :show, :to => :read
33
+ alias_action :delete, :to => :destroy
33
34
 
34
35
  user ||= Spree.user_class.new
35
36
  if user.respond_to?(:has_spree_role?) && user.has_spree_role?('admin')
36
37
  can :manage, :all
37
38
  else
38
39
  #############################
39
- can :read, Spree.user_class do |resource|
40
- resource == user
41
- end
42
- can :update, Spree.user_class do |resource|
43
- resource == user
44
- end
40
+ can [:read,:update,:destroy], Spree.user_class, :id => user.id
45
41
  can :create, Spree.user_class
46
42
  #############################
47
43
  can :read, Order do |order, token|
@@ -5,7 +5,8 @@ module Spree
5
5
 
6
6
  has_many :shipments
7
7
 
8
- validates :firstname, :lastname, :address1, :city, :zipcode, :country, :phone, :presence => true
8
+ validates :firstname, :lastname, :address1, :city, :zipcode, :country, :presence => true
9
+ validates :phone, :presence => true, :if => :require_phone?
9
10
  validate :state_validate
10
11
 
11
12
  attr_accessible :firstname, :lastname, :address1, :address2,
@@ -83,6 +84,10 @@ module Spree
83
84
 
84
85
  private
85
86
 
87
+ def require_phone?
88
+ true
89
+ end
90
+
86
91
  def state_validate
87
92
  # Skip state validation without country (also required)
88
93
  # or when disabled by preference
@@ -4,11 +4,16 @@ module Spree
4
4
  self.table_name = 'spree_users'
5
5
  attr_accessible :email, :password, :password_confirmation
6
6
 
7
+ has_many :orders, :foreign_key => :user_id
7
8
  belongs_to :ship_address, :class_name => 'Spree::Address'
8
9
  belongs_to :bill_address, :class_name => 'Spree::Address'
9
10
 
10
11
  scope :registered
11
12
 
13
+ before_destroy :check_completed_orders
14
+
15
+ class DestroyWithOrdersError < StandardError; end
16
+
12
17
  def anonymous?
13
18
  false
14
19
  end
@@ -24,5 +29,11 @@ module Spree
24
29
 
25
30
  attr_accessor :password
26
31
  attr_accessor :password_confirmation
32
+
33
+ private
34
+
35
+ def check_completed_orders
36
+ raise DestroyWithOrdersError if orders.complete.present?
37
+ end
27
38
  end
28
39
  end
@@ -1,5 +1,16 @@
1
1
  module Spree
2
2
  class LogEntry < ActiveRecord::Base
3
3
  belongs_to :source, :polymorphic => true
4
+
5
+ # Fix for #1767
6
+ # If a payment fails, we want to make sure we keep the record of it failing
7
+ after_rollback :save_anyway
8
+
9
+ def save_anyway
10
+ log = Spree::LogEntry.new
11
+ log.source = source
12
+ log.details = details
13
+ log.save!
14
+ end
4
15
  end
5
16
  end
@@ -31,7 +31,7 @@ module Spree
31
31
  token_resource
32
32
 
33
33
  attr_accessible :line_items, :bill_address_attributes, :ship_address_attributes, :payments_attributes,
34
- :ship_address, :bill_address, :line_items_attributes, :number,
34
+ :ship_address, :bill_address, :payments_attributes, :line_items_attributes, :number,
35
35
  :shipping_method_id, :email, :use_billing, :special_instructions, :currency
36
36
 
37
37
  if Spree.user_class
@@ -52,7 +52,13 @@ module Spree
52
52
  has_many :line_items, :dependent => :destroy, :order => "created_at ASC"
53
53
  has_many :inventory_units
54
54
  has_many :payments, :dependent => :destroy
55
- has_many :shipments, :dependent => :destroy
55
+
56
+ has_many :shipments, :dependent => :destroy do
57
+ def states
58
+ pluck(:state).uniq
59
+ end
60
+ end
61
+
56
62
  has_many :return_authorizations, :dependent => :destroy
57
63
  has_many :adjustments, :as => :adjustable, :dependent => :destroy, :order => "created_at ASC"
58
64
 
@@ -351,11 +357,11 @@ module Spree
351
357
  end
352
358
 
353
359
  def can_ship?
354
- self.complete? || self.resumed?
360
+ self.complete? || self.resumed? || self.awaiting_return? || self.returned?
355
361
  end
356
362
 
357
363
  def credit_cards
358
- credit_card_ids = payments.from_credit_card.map(&:source_id).uniq
364
+ credit_card_ids = payments.from_credit_card.pluck(:source_id).uniq
359
365
  CreditCard.scoped(:conditions => { :id => credit_card_ids })
360
366
  end
361
367
 
@@ -436,7 +442,7 @@ module Spree
436
442
  end
437
443
 
438
444
  def available_payment_methods
439
- @available_payment_methods ||= PaymentMethod.available
445
+ @available_payment_methods ||= PaymentMethod.available(:front_end)
440
446
  end
441
447
 
442
448
  def payment_method
@@ -50,9 +50,9 @@ module Spree
50
50
  display_name = %Q{#{variant.name}}
51
51
  display_name += %Q{ (#{variant.options_text})} unless variant.options_text.blank?
52
52
 
53
- if variant.in_stock?
53
+ if variant.available?
54
54
  on_hand = variant.on_hand
55
- if on_hand >= quantity
55
+ if on_hand >= quantity || Spree::Config[:allow_backorders]
56
56
  return true
57
57
  else
58
58
  errors.add(:base, %Q{There are only #{on_hand} of #{display_name.inspect} remaining.} +
@@ -69,18 +69,18 @@ module Spree
69
69
  if order.backordered?
70
70
  order.shipment_state = 'backorder'
71
71
  else
72
- order.shipment_state =
73
- case shipments.count
74
- when 0
75
- nil
76
- when shipments.shipped.count
77
- 'shipped'
78
- when shipments.ready.count
79
- 'ready'
80
- when shipments.pending.count
81
- 'pending'
72
+ # get all the shipment states for this order
73
+ shipment_states = shipments.states
74
+ if shipment_states.size > 1
75
+ # multiple shiment states means it's most likely partially shipped
76
+ order.shipment_state = 'partial'
82
77
  else
83
- 'partial'
78
+ # will return nil if no shipments are found
79
+ order.shipment_state = shipment_states.first
80
+ if order.shipment_state && order.inventory_units.where(:shipment_id => nil).exists?
81
+ # shipments exist but there are unassigned inventory units
82
+ order.shipment_state = 'partial'
83
+ end
84
84
  end
85
85
  end
86
86
 
@@ -5,7 +5,7 @@ module Spree
5
5
  if payment_method && payment_method.source_required?
6
6
  if source
7
7
  if !processing?
8
- if Spree::Config[:auto_capture]
8
+ if payment_method.auto_capture?
9
9
  purchase!
10
10
  else
11
11
  authorize!
@@ -111,7 +111,7 @@ module Spree
111
111
  options = { :email => order.email,
112
112
  :customer => order.email,
113
113
  :ip => order.last_ip_address,
114
- :order_id => order.number }
114
+ :order_id => "#{order.number}-#{self.identifier}" }
115
115
 
116
116
  options.merge!({ :shipping => order.ship_total * 100,
117
117
  :tax => order.tax_total * 100,
@@ -8,6 +8,8 @@ module Spree
8
8
  has_many :offsets, :class_name => "Spree::Payment", :foreign_key => :source_id, :conditions => "source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'"
9
9
  has_many :log_entries, :as => :source
10
10
 
11
+ before_save :set_unique_identifier
12
+
11
13
  after_save :create_payment_profile, :if => :profiles_supported?
12
14
 
13
15
  # update the order totals, etc.
@@ -56,7 +58,7 @@ module Spree
56
58
  end
57
59
 
58
60
  def offsets_total
59
- offsets.map(&:amount).sum
61
+ offsets.pluck(:amount).sum
60
62
  end
61
63
 
62
64
  def credit_allowed
@@ -108,5 +110,22 @@ module Spree
108
110
  order.payments.reload
109
111
  order.update!
110
112
  end
113
+
114
+ # Necessary because some payment gateways will refuse payments with
115
+ # duplicate IDs. We *were* using the Order number, but that's set once and
116
+ # is unchanging. What we need is a unique identifier on a per-payment basis,
117
+ # and this is it. Related to #1998.
118
+ # See https://github.com/spree/spree/issues/1998#issuecomment-12869105
119
+ def set_unique_identifier
120
+ chars = [('A'..'Z').to_a, ('0'..'9').to_a].flatten - %w(0 1 I O)
121
+ identifier = ''
122
+ 8.times { identifier << chars[rand(chars.length)] }
123
+ if Spree::Payment.exists?(:identifier => identifier)
124
+ # Call it again, we've got a duplicate ID.
125
+ set_unique_identifier
126
+ else
127
+ self.identifier = identifier
128
+ end
129
+ end
111
130
  end
112
131
  end
@@ -1,10 +1,11 @@
1
1
  module Spree
2
2
  class PaymentMethod < ActiveRecord::Base
3
+ DISPLAY = [:both, :front_end, :back_end]
3
4
  default_scope where(:deleted_at => nil)
4
5
 
5
6
  scope :production, lambda { where(:environment => 'production') }
6
7
 
7
- attr_accessible :name, :description, :environment, :active
8
+ attr_accessible :name, :description, :environment, :display_on, :active
8
9
  validates :name, :presence => true
9
10
 
10
11
  def self.providers
@@ -22,9 +23,11 @@ module Spree
22
23
  raise 'You must implement payment_source_class method for this gateway.'
23
24
  end
24
25
 
25
- def self.available
26
+ def self.available(display_on = 'both')
26
27
  all.select do |p|
27
- p.active && (p.environment == Rails.env || p.environment.blank?)
28
+ p.active &&
29
+ (p.display_on == display_on.to_s || p.display_on.blank?) &&
30
+ (p.environment == Rails.env || p.environment.blank?)
28
31
  end
29
32
  end
30
33
 
@@ -51,5 +54,9 @@ module Spree
51
54
  def source_required?
52
55
  true
53
56
  end
57
+
58
+ def auto_capture?
59
+ Spree::Config[:auto_capture]
60
+ end
54
61
  end
55
62
  end
@@ -33,33 +33,4 @@ class Spree::Preference < ActiveRecord::Base
33
33
  self[:value]
34
34
  end
35
35
 
36
- # For the rc releases of 1.0, we stored the object class names, this converts
37
- # to preferences definition types. This code should eventually be removed.
38
- # it is called during the load_preferences of the Preferences::Store
39
- def self.convert_old_value_types(preference)
40
- classes = [Symbol.to_s, Fixnum.to_s, Bignum.to_s,
41
- Float.to_s, TrueClass.to_s, FalseClass.to_s]
42
- return unless classes.map(&:downcase).include? preference.value_type.downcase
43
-
44
- case preference.value_type.downcase
45
- when "symbol"
46
- preference.value_type = 'string'
47
- when "fixnum"
48
- preference.value_type = 'integer'
49
- when "bignum"
50
- preference.value_type = 'integer'
51
- preference.value = preference.value.to_f.to_i
52
- when "float"
53
- preference.value_type = 'decimal'
54
- when "trueclass"
55
- preference.value_type = 'boolean'
56
- preference.value = "true"
57
- when "falseclass"
58
- preference.value_type = 'boolean'
59
- preference.value = "false"
60
- end
61
-
62
- preference.save
63
- end
64
-
65
36
  end
@@ -14,7 +14,6 @@ module Spree::Preferences
14
14
  def initialize
15
15
  @cache = Rails.cache
16
16
  @persistence = true
17
- load_preferences
18
17
  end
19
18
 
20
19
  def set(key, value, type)
@@ -64,6 +63,10 @@ module Spree::Preferences
64
63
  destroy(key)
65
64
  end
66
65
 
66
+ def clear_cache
67
+ @cache.clear
68
+ end
69
+
67
70
  private
68
71
 
69
72
  def persist(cache_key, value, type)
@@ -82,15 +85,6 @@ module Spree::Preferences
82
85
  preference.destroy if preference
83
86
  end
84
87
 
85
- def load_preferences
86
- return unless should_persist?
87
-
88
- Spree::Preference.valid.each do |p|
89
- Spree::Preference.convert_old_value_types(p) # see comment
90
- @cache.write(p.key, p.value)
91
- end
92
- end
93
-
94
88
  def should_persist?
95
89
  @persistence and Spree::Preference.table_exists?
96
90
  end
@@ -66,7 +66,7 @@ module Spree
66
66
  add_search_scope :in_taxon do |taxon|
67
67
  select("DISTINCT(spree_products.id), spree_products.*").
68
68
  joins(:taxons).
69
- where(Taxon.table_name => { :id => taxon.self_and_descendants.map(&:id) })
69
+ where(Taxon.table_name => { :id => taxon.self_and_descendants.pluck(:id) })
70
70
  end
71
71
 
72
72
  # This scope selects products in all taxons AND all its descendants
@@ -228,7 +228,7 @@ module Spree
228
228
 
229
229
  # specifically avoid having an order for taxon search (conflicts with main order)
230
230
  def self.prepare_taxon_conditions(taxons)
231
- ids = taxons.map { |taxon| taxon.self_and_descendants.map(&:id) }.flatten.uniq
231
+ ids = taxons.map { |taxon| taxon.self_and_descendants.pluck(:id) }.flatten.uniq
232
232
  joins(:taxons).where("#{Taxon.table_name}.id" => ids)
233
233
  end
234
234
 
@@ -162,7 +162,7 @@ module Spree
162
162
  return if option_values_hash.nil?
163
163
  option_values_hash.keys.map(&:to_i).each do |id|
164
164
  self.option_type_ids << id unless option_type_ids.include?(id)
165
- product_option_types.create({:option_type_id => id}, :without_protection => true) unless product_option_types.map(&:option_type_id).include?(id)
165
+ product_option_types.create({:option_type_id => id}, :without_protection => true) unless product_option_types.pluck(:option_type_id).include?(id)
166
166
  end
167
167
  end
168
168
 
@@ -232,10 +232,7 @@ module Spree
232
232
 
233
233
  def set_property(property_name, property_value)
234
234
  ActiveRecord::Base.transaction do
235
- property = Property.where(:name => property_name).first_or_initialize
236
- property.presentation = property_name
237
- property.save!
238
-
235
+ property = Property.where(:name => property_name).first_or_create!(:presentation => property_name)
239
236
  product_property = ProductProperty.where(:product_id => id, :property_id => property.id).first_or_initialize
240
237
  product_property.value = property_value
241
238
  product_property.save!
@@ -6,7 +6,9 @@ module Spree
6
6
  validates :property, :presence => true
7
7
  validates :value, :length => { :maximum => 255 }
8
8
 
9
- attr_accessible :property_name, :value
9
+ attr_accessible :property_name, :value, :position
10
+
11
+ default_scope :order => "#{self.table_name}.position"
10
12
 
11
13
  # virtual attributes for use with AJAX completion stuff
12
14
  def property_name
@@ -9,8 +9,6 @@ module Spree
9
9
 
10
10
  validates :name, :presentation, :presence => true
11
11
 
12
- scope :sorted, lambda { order(:name) }
13
-
14
12
  def self.find_all_by_prototype(prototype)
15
13
  id = prototype
16
14
  if prototype.class == Prototype
@@ -44,7 +44,7 @@ module Spree
44
44
  next unless inventory_unit.return_authorization.nil? && count < quantity
45
45
 
46
46
  inventory_unit.return_authorization = self
47
- inventory_unit.save!
47
+ inventory_unit.return!
48
48
 
49
49
  count += 1
50
50
  end