solidus_core 1.0.0.pre2 → 1.0.0.pre3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/spree/ability.rb +52 -29
  3. data/app/models/spree/address.rb +1 -0
  4. data/app/models/spree/app_configuration.rb +8 -2
  5. data/app/models/spree/base.rb +3 -1
  6. data/app/models/spree/credit_card.rb +3 -0
  7. data/app/models/spree/gateway.rb +1 -1
  8. data/app/models/spree/gateway/bogus.rb +0 -4
  9. data/app/models/spree/order.rb +2 -2
  10. data/app/models/spree/payment_method.rb +2 -0
  11. data/app/models/spree/permission_sets/base.rb +14 -1
  12. data/app/models/spree/permission_sets/restricted_transfer_management.rb +35 -0
  13. data/app/models/spree/permission_sets/user_management.rb +1 -0
  14. data/app/models/spree/preferences/static_model_preferences.rb +47 -0
  15. data/app/models/spree/preferences/statically_configurable.rb +37 -0
  16. data/app/models/spree/product.rb +9 -0
  17. data/app/models/spree/promotion/rules/nth_order.rb +45 -0
  18. data/app/models/spree/shipment.rb +0 -2
  19. data/app/models/spree/store.rb +2 -2
  20. data/app/models/spree/variant.rb +10 -2
  21. data/config/locales/en.yml +7 -2
  22. data/db/migrate/20140309023735_migrate_old_preferences.rb +35 -7
  23. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +23 -26
  24. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
  25. data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +5 -1
  26. data/db/migrate/20150616204659_add_preference_source_to_spree_payment_methods.rb +5 -0
  27. data/db/migrate/20150629175931_add_address_id_to_credit_card.rb +5 -0
  28. data/db/migrate/20150630175644_copy_order_bill_address_to_credit_card.rb +12 -0
  29. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +72 -0
  30. data/db/migrate/20150724163716_remove_state_lock_version_from_order.rb +11 -0
  31. data/lib/generators/spree/install/templates/config/initializers/spree.rb +12 -0
  32. data/lib/spree/core.rb +1 -0
  33. data/lib/spree/core/controller_helpers/store.rb +8 -2
  34. data/lib/spree/core/controller_helpers/strong_parameters.rb +12 -0
  35. data/lib/spree/core/current_store.rb +26 -0
  36. data/lib/spree/core/engine.rb +1 -0
  37. data/lib/spree/core/importer/order.rb +1 -0
  38. data/lib/spree/permitted_attributes.rb +5 -0
  39. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  40. data/lib/spree/testing_support/order_walkthrough.rb +4 -1
  41. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +117 -0
  42. metadata +13 -3
  43. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37901081f12d468225a333297e72fc9b18aa4a8e
4
- data.tar.gz: 7ffcaa00028db2e02b2f8ba38a81365cb5f3b47c
3
+ metadata.gz: 7c8aa521a33c27c10cdec65089ae5d044c1aa62e
4
+ data.tar.gz: c5b6055ae2ce9a0050d2fa9a1afdf938df77cca5
5
5
  SHA512:
6
- metadata.gz: 90851a4dcb9df999a887eeb75c380a2ef27b1da6d063e34dd9a8daf2b40a1121e45e9983bb547f812f767e19f1f49bb562264fb42e57f70879eb6885b6178a47
7
- data.tar.gz: b444a9f7a55c7c698d912b2dab2d6bb64c76729f4df514ba821a5d2bf922e99e514c4f2fa8e2a58977da6b9645a0b7eb8a9cf7be77f5b25685e47c4c5ff8262e
6
+ metadata.gz: 38bf62e7f2f12a3da4b897b6b144faf9a5bece9d80fd7fa321e70277ddd1b16b44c9dc7c490b196459100ad246903826c43e4e7162d77ce4d9e30802b6120912
7
+ data.tar.gz: b7247c74c10e6a276f20c20127073b958004f1177e75a6e0e5913eb19001d25fce59bdb923273ae8d288a7e6b2bb93c856539d2073c3e31dbcb97c81c0d590bd
@@ -10,6 +10,8 @@ module Spree
10
10
  class_attribute :abilities
11
11
  self.abilities = Set.new
12
12
 
13
+ attr_reader :user
14
+
13
15
  # Allows us to go beyond the standard cancan initialize method which makes it difficult for engines to
14
16
  # modify the default +Ability+ of an application. The +ability+ argument must be a class that includes
15
17
  # the +CanCan::Ability+ module. The registered ability should behave properly as a stand-alone class
@@ -22,8 +24,19 @@ module Spree
22
24
  self.abilities.delete(ability)
23
25
  end
24
26
 
25
- def initialize(user)
26
- self.clear_aliased_actions
27
+ def initialize(current_user)
28
+ @user = current_user || Spree.user_class.new
29
+
30
+ alias_actions
31
+ grant_default_permissions
32
+ register_extension_abilities
33
+ activate_permission_sets
34
+ end
35
+
36
+ private
37
+
38
+ def alias_actions
39
+ clear_aliased_actions
27
40
 
28
41
  # override cancan default aliasing (we don't want to differentiate between read and index)
29
42
  alias_action :delete, to: :destroy
@@ -32,44 +45,54 @@ module Spree
32
45
  alias_action :new_action, to: :create
33
46
  alias_action :show, to: :read
34
47
  alias_action :index, :read, to: :display
48
+ end
35
49
 
36
-
37
- user ||= Spree.user_class.new
38
-
50
+ def grant_default_permissions
51
+ # if the user is a "super user" give them full permissions, otherwise give them the permissions
52
+ # required to checkout and use the frontend.
39
53
  if user.respond_to?(:has_spree_role?) && user.has_spree_role?('admin')
40
54
  can :manage, :all
41
55
  else
42
- can :display, Country
43
- can :display, OptionType
44
- can :display, OptionValue
45
- can :create, Order
46
- can [:read, :update], Order do |order, token|
47
- order.user == user || order.guest_token && token == order.guest_token
48
- end
49
- can :create, ReturnAuthorization do |return_authorization|
50
- return_authorization.order.user == user
51
- end
52
- can :display, CreditCard, user_id: user.id
53
- can :display, Product
54
- can :display, ProductProperty
55
- can :display, Property
56
- can :create, Spree.user_class
57
- can [:read, :update, :destroy], Spree.user_class, id: user.id
58
- can :display, State
59
- can :display, StockItem, stock_location: { active: true }
60
- can :display, StockLocation, active: true
61
- can :display, Taxon
62
- can :display, Taxonomy
63
- can [:display, :view_out_of_stock], Variant
64
- can :display, Zone
56
+ grant_generic_user_permissions
65
57
  end
58
+ end
66
59
 
67
- # Include any abilities registered by extensions, etc.
60
+ def grant_generic_user_permissions
61
+ can :display, Country
62
+ can :display, OptionType
63
+ can :display, OptionValue
64
+ can :create, Order
65
+ can [:read, :update], Order do |order, token|
66
+ order.user == user || order.guest_token && token == order.guest_token
67
+ end
68
+ can :create, ReturnAuthorization do |return_authorization|
69
+ return_authorization.order.user == user
70
+ end
71
+ can [:display, :update], CreditCard, user_id: user.id
72
+ can :display, Product
73
+ can :display, ProductProperty
74
+ can :display, Property
75
+ can :create, Spree.user_class
76
+ can [:read, :update, :destroy], Spree.user_class, id: user.id
77
+ can :display, State
78
+ can :display, StockItem, stock_location: { active: true }
79
+ can :display, StockLocation, active: true
80
+ can :display, Taxon
81
+ can :display, Taxonomy
82
+ can [:display, :view_out_of_stock], Variant
83
+ can :display, Zone
84
+ end
85
+
86
+ # Before, this was the only way to extend this ability. Permission sets have been added since.
87
+ # It is recommended to use them instead for extension purposes if possible.
88
+ def register_extension_abilities
68
89
  Ability.abilities.each do |clazz|
69
90
  ability = clazz.send(:new, user)
70
91
  @rules = rules + ability.send(:rules)
71
92
  end
93
+ end
72
94
 
95
+ def activate_permission_sets
73
96
  Spree::RoleConfiguration.instance.activate_permissions! self, user
74
97
  end
75
98
  end
@@ -7,6 +7,7 @@ module Spree
7
7
 
8
8
  has_many :shipments, inverse_of: :address
9
9
  has_many :cartons, inverse_of: :address
10
+ has_many :credit_cards, inverse_of: :address
10
11
 
11
12
  validates :firstname, :lastname, :address1, :city, :country, presence: true
12
13
  validates :zipcode, presence: true, if: :require_zipcode?
@@ -128,6 +128,11 @@ module Spree
128
128
  # @return [String] URL of logo used on frontend (default: +'logo/solidus_logo.png'+)
129
129
  preference :logo, :string, default: 'logo/solidus_logo.png'
130
130
 
131
+ # @!attribute [rw] order_bill_address_used
132
+ # @return [Boolean] Use the order's bill address, as opposed to storing
133
+ # bill addresses on payment sources. (default: +true+)
134
+ preference :order_bill_address_used, :boolean, default: true
135
+
131
136
  # @!attribute [rw] order_capturing_time_window
132
137
  # @return [Integer] the number of days to look back for fully-shipped/cancelled orders in order to charge for them
133
138
  preference :order_capturing_time_window, :integer, default: 14
@@ -220,12 +225,13 @@ module Spree
220
225
  preference :credit_to_new_allocation, :boolean, default: false
221
226
 
222
227
  # searcher_class allows spree extension writers to provide their own Search class
228
+ attr_writer :searcher_class
223
229
  def searcher_class
224
230
  @searcher_class ||= Spree::Core::Search::Base
225
231
  end
226
232
 
227
- def searcher_class=(sclass)
228
- @searcher_class = sclass
233
+ def static_model_preferences
234
+ @static_model_preferences ||= Spree::Preferences::StaticModelPreferences.new
229
235
  end
230
236
 
231
237
  # all the following can be deprecated when store prefs are no longer supported
@@ -2,7 +2,9 @@ class Spree::Base < ActiveRecord::Base
2
2
  include Spree::Preferences::Preferable
3
3
  serialize :preferences, Hash
4
4
  after_initialize do
5
- self.preferences = default_preferences.merge(preferences) if has_attribute?(:preferences)
5
+ if has_attribute?(:preferences)
6
+ self.preferences = default_preferences.merge(preferences)
7
+ end
6
8
  end
7
9
 
8
10
  if Kaminari.config.page_method_name != :page
@@ -2,12 +2,15 @@ module Spree
2
2
  class CreditCard < Spree::Base
3
3
  belongs_to :payment_method
4
4
  belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
5
+ belongs_to :address, inverse_of: :credit_cards
5
6
  has_many :payments, as: :source
6
7
 
7
8
  before_save :set_last_digits
8
9
 
9
10
  after_save :ensure_one_default
10
11
 
12
+ accepts_nested_attributes_for :address
13
+
11
14
  attr_accessor :encrypted_data,
12
15
  :number,
13
16
  :imported,
@@ -26,7 +26,7 @@ module Spree
26
26
  end
27
27
 
28
28
  def options
29
- self.preferences.inject({}){ |memo, (key, value)| memo[key.to_sym] = value; memo }
29
+ preferences.to_hash
30
30
  end
31
31
 
32
32
  def method_missing(method, *args)
@@ -13,10 +13,6 @@ module Spree
13
13
  self.class
14
14
  end
15
15
 
16
- def preferences
17
- {}
18
- end
19
-
20
16
  def create_profile(payment)
21
17
  return if payment.source.has_payment_profile?
22
18
  # simulate the storage of credit card profile using remote service
@@ -256,8 +256,6 @@ module Spree
256
256
  self.class.unscoped.where(id: id).update_all(attrs_to_set)
257
257
  end
258
258
 
259
- attrs_to_set[:ship_address_attributes] = user.ship_address.attributes.except('id', 'updated_at', 'created_at') if user.try(:ship_address)
260
- attrs_to_set[:bill_address_attributes] = user.bill_address.attributes.except('id', 'updated_at', 'created_at') if user.try(:bill_address)
261
259
  assign_attributes(attrs_to_set)
262
260
  end
263
261
 
@@ -551,6 +549,8 @@ module Spree
551
549
  end
552
550
 
553
551
  def restart_checkout_flow
552
+ return if self.state == 'cart'
553
+
554
554
  self.update_columns(
555
555
  state: 'cart',
556
556
  updated_at: Time.now,
@@ -11,6 +11,8 @@ module Spree
11
11
  has_many :payments, class_name: "Spree::Payment", inverse_of: :payment_method
12
12
  has_many :credit_cards, class_name: "Spree::CreditCard"
13
13
 
14
+ include Spree::Preferences::StaticallyConfigurable
15
+
14
16
  def self.providers
15
17
  Rails.application.config.spree.payment_methods
16
18
  end
@@ -1,17 +1,30 @@
1
1
  module Spree
2
2
  module PermissionSets
3
+ # This is the base class used for crafting permission sets.
4
+ #
5
+ # This is used by {Spree::RoleConfiguration} when adding custom behavior to {Spree::Ability}.
6
+ # See one of the subclasses for example structure such as {Spree::PermissionSets::UserDisplay}
7
+ #
8
+ # @see Spree::RoleConfiguration
9
+ # @see Spree::PermissionSets
3
10
  class Base
11
+ # @param ability [CanCan::Ability]
12
+ # The ability that will be extended with the current permission set.
13
+ # The ability passed in must respond to #user
4
14
  def initialize ability
5
15
  @ability = ability
6
16
  end
7
17
 
18
+ # Activate permissions on the ability. Put your can and cannot statements here.
19
+ # Must be overriden by subclasses
8
20
  def activate!
9
21
  raise NotImplementedError.new
10
22
  end
11
23
 
12
24
  private
13
25
 
14
- delegate :can, :cannot, to: :@ability
26
+ attr_reader :ability
27
+ delegate :can, :cannot, :user, to: :ability
15
28
  end
16
29
  end
17
30
  end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module PermissionSets
3
+ # This is a permission set that offers an alternative to {StockManagement}.
4
+ #
5
+ # Instead of allowing management access for all stock transfers and items, only allow
6
+ # the management of stock transfers for locations the user is associated with.
7
+ #
8
+ # Users can be associated with stock locations via the admin user interface.
9
+ #
10
+ # @see Spree::PermissionSets::Base
11
+ class RestrictedTransferManagement < PermissionSets::Base
12
+ def activate!
13
+ can [:display, :admin], Spree::StockItem
14
+ can [:display, :admin], Spree::StockTransfer
15
+
16
+ if user.stock_locations.any?
17
+ can :transfer, Spree::StockLocation, id: location_ids
18
+ can :update, Spree::StockItem, stock_location_id: location_ids
19
+ can :manage, Spree::StockTransfer, source_location_id: location_ids, destination_location_id: location_ids
20
+ can :manage, Spree::TransferItem, stock_transfer: {
21
+ source_location_id: location_ids,
22
+ destination_location_id: location_ids
23
+ }
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def location_ids
30
+ # either source_location_id or destination_location_id can be nil.
31
+ @ids ||= user.stock_locations.pluck(:id) + [nil]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -3,6 +3,7 @@ module Spree
3
3
  class UserManagement < PermissionSets::Base
4
4
  def activate!
5
5
  can :manage, Spree.user_class
6
+ cannot [:delete, :destroy], Spree.user_class
6
7
  can :manage, Spree::StoreCredit
7
8
  can :display, Spree::Role
8
9
  end
@@ -0,0 +1,47 @@
1
+ module Spree
2
+ module Preferences
3
+ class StaticModelPreferences
4
+ class Definition
5
+ attr_reader :preferences
6
+
7
+ def initialize(klass, hash)
8
+ hash = hash.symbolize_keys
9
+ hash.keys.each do |key|
10
+ if !klass.defined_preferences.include?(key)
11
+ raise "Preference #{key.inspect} is not defined on #{klass}"
12
+ end
13
+ end
14
+ @preferences = hash
15
+ end
16
+
17
+ def fetch(key, &block)
18
+ @preferences.fetch(key, &block)
19
+ end
20
+
21
+ def []=(key, value)
22
+ # ignores assignment
23
+ end
24
+
25
+ def to_hash
26
+ @preferences.deep_dup
27
+ end
28
+ end
29
+
30
+ def initialize
31
+ @store = Hash.new do |h,klass|
32
+ h[klass] = {}
33
+ end
34
+ end
35
+
36
+ def add(klass, name, preferences)
37
+ # We use class name instead of class to allow reloading in dev
38
+ raise "Static model preference '#{name}' on #{klass} is already defined" if @store[klass.to_s][name]
39
+ @store[klass.to_s][name] = Definition.new(klass, preferences)
40
+ end
41
+
42
+ def for_class(klass)
43
+ @store[klass.to_s]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ module Spree
2
+ module Preferences
3
+ module StaticallyConfigurable
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def preference_sources
8
+ Spree::Config.static_model_preferences.for_class(self)
9
+ end
10
+
11
+ def available_preference_sources
12
+ preference_sources.keys
13
+ end
14
+ end
15
+
16
+ # override assignment to cast empty string to nil
17
+ def preference_source=(val)
18
+ super(val.presence)
19
+ end
20
+
21
+ def preferences
22
+ if respond_to?(:preference_source) && preference_source
23
+ self.class.preference_sources[preference_source] || {}
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ def preferences=(val)
30
+ if respond_to?(:preference_source) && preference_source
31
+ else
32
+ super
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -237,6 +237,15 @@ module Spree
237
237
  super || variants_including_master.with_deleted.where(is_master: true).first
238
238
  end
239
239
 
240
+ # Image that can be used for the product.
241
+ #
242
+ # Will first search for images on the product, then those belonging to the
243
+ # variants. If all else fails, will return a new image object.
244
+ # @return [Spree::Image] the image to display
245
+ def display_image
246
+ images.first || variant_images.first || Spree::Image.new
247
+ end
248
+
240
249
  private
241
250
 
242
251
  def add_associations_from_prototype
@@ -0,0 +1,45 @@
1
+ module Spree
2
+ class Promotion
3
+ module Rules
4
+ class NthOrder < PromotionRule
5
+ preference :nth_order, :integer, default: 2
6
+ # It does not make sense to have this apply to the first order using preferred_nth_order == 1
7
+ # Instead we could use the first_order rule
8
+ validates :preferred_nth_order, numericality: { only_integer: true, greater_than: 1 }
9
+
10
+ # This promotion is applicable to orders only.
11
+ def applicable?(promotable)
12
+ promotable.is_a?(Spree::Order)
13
+ end
14
+
15
+ # This is never eligible if the order does not have a user, and that user does not have any previous completed orders.
16
+ #
17
+ # Use the first order rule if you want a promotion to be applied to the first order for a user.
18
+ # @param order [Spree::Order]
19
+ # @option options
20
+ def eligible?(order, options = {})
21
+ return false unless order.user
22
+
23
+ nth_order?(order)
24
+ end
25
+
26
+ private
27
+
28
+ def completed_order_count order
29
+ order.
30
+ user.
31
+ orders.
32
+ complete.
33
+ where(Spree::Order.arel_table[:completed_at].lt(order.completed_at || Time.now)).
34
+ count
35
+ end
36
+
37
+ def nth_order? order
38
+ count = completed_order_count(order) + 1
39
+ count == preferred_nth_order
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
@@ -2,8 +2,6 @@ require 'ostruct'
2
2
 
3
3
  module Spree
4
4
  class Shipment < Spree::Base
5
- belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments
6
-
7
5
  belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments
8
6
  belongs_to :address, class_name: 'Spree::Address', inverse_of: :shipments
9
7
  belongs_to :stock_location, class_name: 'Spree::StockLocation'
@@ -10,8 +10,8 @@ module Spree
10
10
 
11
11
  scope :by_url, lambda { |url| where("url like ?", "%#{url}%") }
12
12
 
13
- def self.current(domain = nil)
14
- current_store = domain ? Store.by_url(domain).first : nil
13
+ def self.current(store_key = nil)
14
+ current_store = Store.find_by(code: store_key) || Store.by_url(store_key).first
15
15
  current_store || Store.default
16
16
  end
17
17
 
@@ -304,8 +304,16 @@ module Spree
304
304
  self.track_inventory? && Spree::Config.track_inventory_levels
305
305
  end
306
306
 
307
- def display_image
308
- images.first || Spree::Image.new
307
+ # Image that can be used for the variant.
308
+ #
309
+ # Will first search for images on the variant. If it doesn't find any,
310
+ # it'll fallback to any variant image (unless +fallback+ is +false+) or to
311
+ # a new {Spree::Image}.
312
+ # @param fallback [Boolean] whether or not we should fallback to an image
313
+ # not from this variant
314
+ # @return [Spree::Image] the image to display
315
+ def display_image(fallback: true)
316
+ images.first || (fallback && product.variant_images.first) || Spree::Image.new
309
317
  end
310
318
 
311
319
  private
@@ -570,7 +570,7 @@ en:
570
570
  both: Both
571
571
  calculated_reimbursements: Calculated Reimbursements
572
572
  calculator: Calculator
573
- calculator_settings_warning: If you are changing the calculator type, you must save first before you can edit the calculator settings
573
+ calculator_settings_warning: If you are changing the calculator type or preference source, you must save first before you can edit the calculator settings
574
574
  cancel: cancel
575
575
  cancel_inventory: 'Cancel Inventory'
576
576
  canceled: canceled
@@ -1042,7 +1042,6 @@ en:
1042
1042
  order: Order
1043
1043
  order_adjustments: Order adjustments
1044
1044
  order_already_completed: Order is already completed
1045
- order_already_updated: The order has already been updated.
1046
1045
  order_approved: Order approved
1047
1046
  order_canceled: Order canceled
1048
1047
  order_completed: Order completed
@@ -1149,6 +1148,8 @@ en:
1149
1148
  price: Price
1150
1149
  price_range: Price Range
1151
1150
  price_sack: Price Sack
1151
+ preference_source_none: '(custom)'
1152
+ preference_source_using: 'Using static preferences "%{name}"'
1152
1153
  process: Process
1153
1154
  product: Product
1154
1155
  product_details: Product Details
@@ -1212,6 +1213,10 @@ en:
1212
1213
  taxon:
1213
1214
  description: Order includes products with specified taxon(s)
1214
1215
  name: Taxon(s)
1216
+ nth_order:
1217
+ description: Apply a promotion to every nth order a user has completed.
1218
+ name: Nth Order
1219
+ form_text: "Apply this promotion on the users Nth order: "
1215
1220
  promotions: Promotions
1216
1221
  promotion_successfully_created: Promotion has been successfully created!
1217
1222
  promotion_total_changed_before_complete: "One or more of the promotions on your order have become ineligible and were removed. Please check the new order amounts and try again."
@@ -1,8 +1,10 @@
1
1
  class MigrateOldPreferences < ActiveRecord::Migration
2
+ disable_ddl_transaction!
3
+
2
4
  def up
3
5
  migrate_preferences(Spree::Calculator)
4
- migrate_preferences(Spree::PaymentMethod)
5
6
  migrate_preferences(Spree::PromotionRule)
7
+ migrate_preferences(Spree::PaymentMethod)
6
8
  end
7
9
 
8
10
  def down
@@ -11,13 +13,39 @@ class MigrateOldPreferences < ActiveRecord::Migration
11
13
  private
12
14
  def migrate_preferences klass
13
15
  klass.reset_column_information
14
- klass.find_each do |record|
15
- store = Spree::Preferences::ScopedStore.new(record.class.name.underscore, record.id)
16
- record.defined_preferences.each do |key|
17
- value = store.fetch(key){}
18
- record.preferences[key] = value unless value.nil?
16
+ klass.find_in_batches do |batch|
17
+ ActiveRecord::Base.transaction do
18
+ batch.each do |record|
19
+ keys = record.class.defined_preferences
20
+
21
+ # Batch load preferences for this record.
22
+ preferences = Hash[Spree::Preference.where(
23
+ key: keys.map{ |k| cache_key(record, k) }
24
+ ).pluck(:key, :value)]
25
+
26
+ # Copy preferences to the record.
27
+ keys.each do |key|
28
+ value = preferences[cache_key(record, key)]
29
+ record.preferences[key] = value unless value.nil?
30
+ end
31
+
32
+ # Persist the preferences.
33
+ record.update_column(:preferences, record.preferences)
34
+ end
19
35
  end
20
- record.save!
21
36
  end
22
37
  end
38
+
39
+ def cache_key model, key
40
+ [
41
+ ENV["RAILS_CACHE_ID"],
42
+ class_underscore_cache[model.type],
43
+ key,
44
+ model.id
45
+ ].compact.join("/")
46
+ end
47
+
48
+ def class_underscore_cache
49
+ @class_underscore_cache ||= Hash.new{ |h,k| h[k] = k.underscore }
50
+ end
23
51
  end
@@ -2,65 +2,62 @@ class CorrectSomePolymorphicIndexAndAddMoreMissing < ActiveRecord::Migration
2
2
  def change
3
3
  add_index :spree_addresses, :country_id
4
4
  add_index :spree_addresses, :state_id
5
+
5
6
  remove_index :spree_adjustments, [:source_type, :source_id]
6
7
  add_index :spree_adjustments, [:source_id, :source_type]
7
- add_index :spree_credit_cards, :address_id
8
- add_index :spree_gateways, :active
9
- add_index :spree_gateways, :test_mode
8
+
10
9
  add_index :spree_inventory_units, :return_authorization_id
11
- add_index :spree_line_items, :tax_category_id
10
+
12
11
  add_index :spree_log_entries, [:source_id, :source_type]
12
+
13
13
  add_index :spree_orders, :approver_id
14
- add_index :spree_orders, :bill_address_id
15
- add_index :spree_orders, :confirmation_delivered
16
- add_index :spree_orders, :considered_risky
17
14
  add_index :spree_orders, :created_by_id
18
15
  add_index :spree_orders, :ship_address_id
19
- add_index :spree_orders, :shipping_method_id
16
+ add_index :spree_orders, :bill_address_id
17
+ add_index :spree_orders, :considered_risky
18
+
20
19
  add_index :spree_orders_promotions, [:order_id, :promotion_id]
20
+
21
21
  add_index :spree_payments, [:source_id, :source_type]
22
- add_index :spree_prices, :deleted_at
22
+
23
23
  add_index :spree_product_option_types, :position
24
+
24
25
  add_index :spree_product_properties, :position
25
26
  add_index :spree_product_properties, :property_id
26
- add_index :spree_products, :shipping_category_id
27
- add_index :spree_products, :tax_category_id
27
+
28
28
  add_index :spree_promotion_action_line_items, :promotion_action_id
29
29
  add_index :spree_promotion_action_line_items, :variant_id
30
+
30
31
  add_index :spree_promotion_rules, :promotion_id
32
+
31
33
  add_index :spree_promotions, :advertise
34
+
32
35
  add_index :spree_return_authorizations, :number
33
36
  add_index :spree_return_authorizations, :order_id
34
37
  add_index :spree_return_authorizations, :stock_location_id
38
+
35
39
  add_index :spree_shipments, :address_id
36
- add_index :spree_shipping_methods, :deleted_at
40
+
37
41
  add_index :spree_shipping_methods, :tax_category_id
38
- add_index :spree_shipping_rates, :selected
39
- add_index :spree_shipping_rates, :tax_rate_id
42
+
40
43
  add_index :spree_state_changes, [:stateful_id, :stateful_type]
41
44
  add_index :spree_state_changes, :user_id
42
- add_index :spree_stock_items, :backorderable
43
- add_index :spree_stock_locations, :active
44
- add_index :spree_stock_locations, :backorderable_default
45
+
45
46
  add_index :spree_stock_locations, :country_id
46
- add_index :spree_stock_locations, :propagate_all_variants
47
47
  add_index :spree_stock_locations, :state_id
48
- add_index :spree_tax_categories, :deleted_at
49
- add_index :spree_tax_categories, :is_default
48
+
50
49
  add_index :spree_tax_rates, :deleted_at
51
- add_index :spree_tax_rates, :included_in_price
52
- add_index :spree_tax_rates, :show_rate_in_label
53
50
  add_index :spree_tax_rates, :tax_category_id
54
51
  add_index :spree_tax_rates, :zone_id
52
+
55
53
  add_index :spree_taxonomies, :position
54
+
56
55
  add_index :spree_taxons, :position
57
- add_index :spree_trackers, :active
58
- add_index :spree_variants, :deleted_at
59
- add_index :spree_variants, :is_master
56
+
60
57
  add_index :spree_variants, :position
61
58
  add_index :spree_variants, :track_inventory
59
+
62
60
  add_index :spree_zone_members, :zone_id
63
61
  add_index :spree_zone_members, [:zoneable_id, :zoneable_type]
64
- add_index :spree_zones, :default_tax
65
62
  end
66
63
  end
@@ -6,7 +6,7 @@ class FixAdjustmentOrderPresence < ActiveRecord::Migration
6
6
  if adjustable.is_a? Spree::Order
7
7
  adjustment.update_attributes!(order_id: adjustable.id)
8
8
  else
9
- adjustment.update_attributes!(adjustable: adjustable.order)
9
+ adjustment.update_attributes!(order_id: adjustable.order.id)
10
10
  end
11
11
  end
12
12
  end
@@ -1,6 +1,10 @@
1
1
  class CreateSpreeStoreCreditPaymentMethod < ActiveRecord::Migration
2
+ class PaymentMethod < ActiveRecord::Base
3
+ self.table_name = 'spree_payment_methods'
4
+ self.inheritance_column = :_type_disabled
5
+ end
2
6
  def up
3
- Spree::PaymentMethod.create_with(
7
+ PaymentMethod.create_with(
4
8
  name: Spree.t("store_credit.store_credit"),
5
9
  description: Spree.t("store_credit.store_credit"),
6
10
  active: true,
@@ -0,0 +1,5 @@
1
+ class AddPreferenceSourceToSpreePaymentMethods < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_payment_methods, :preference_source, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddAddressIdToCreditCard < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_credit_cards, :address_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CopyOrderBillAddressToCreditCard < ActiveRecord::Migration
2
+ # Prevent everything from running in one giant transaction in postrgres.
3
+ disable_ddl_transaction!
4
+
5
+ def up
6
+ Rake::Task["spree:migrations:copy_order_bill_address_to_credit_card:up"].invoke
7
+ end
8
+
9
+ def down
10
+ Rake::Task["spree:migrations:copy_order_bill_address_to_credit_card:down"].invoke
11
+ end
12
+ end
@@ -0,0 +1,72 @@
1
+ # All of these indexes were originally added in
2
+ # 20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb
3
+ # However, most are necessary and were removed from that migration. This
4
+ # migration deletes any of the indexes left around in stores using the
5
+ # out-dated version of that migration
6
+ class RemoveUnnecessaryIndexes < ActiveRecord::Migration
7
+ def up
8
+ safe_remove_index :spree_credit_cards, :address_id
9
+ safe_remove_index :spree_gateways, :active
10
+ safe_remove_index :spree_gateways, :test_mode
11
+ safe_remove_index :spree_inventory_units, :return_authorization_id
12
+ safe_remove_index :spree_line_items, :tax_category_id
13
+ safe_remove_index :spree_orders, :shipping_method_id
14
+ safe_remove_index :spree_orders, :confirmation_delivered
15
+ safe_remove_index :spree_prices, :deleted_at
16
+ safe_remove_index :spree_products, :shipping_category_id
17
+ safe_remove_index :spree_products, :tax_category_id
18
+ safe_remove_index :spree_shipping_methods, :deleted_at
19
+ safe_remove_index :spree_shipping_rates, :selected
20
+ safe_remove_index :spree_shipping_rates, :tax_rate_id
21
+ safe_remove_index :spree_stock_items, :backorderable
22
+ safe_remove_index :spree_stock_locations, :active
23
+ safe_remove_index :spree_stock_locations, :backorderable_default
24
+ safe_remove_index :spree_stock_locations, :propagate_all_variants
25
+ safe_remove_index :spree_tax_categories, :is_default
26
+ safe_remove_index :spree_tax_categories, :deleted_at
27
+ safe_remove_index :spree_tax_rates, :show_rate_in_label
28
+ safe_remove_index :spree_tax_rates, :included_in_price
29
+ safe_remove_index :spree_trackers, :active
30
+ safe_remove_index :spree_variants, :is_master
31
+ safe_remove_index :spree_variants, :deleted_at
32
+ safe_remove_index :spree_zones, :default_tax
33
+ end
34
+
35
+ def down
36
+ safe_add_index :spree_credit_cards, :address_id
37
+ safe_add_index :spree_gateways, :active
38
+ safe_add_index :spree_gateways, :test_mode
39
+ safe_add_index :spree_inventory_units, :return_authorization_id
40
+ safe_add_index :spree_line_items, :tax_category_id
41
+ safe_add_index :spree_orders, :shipping_method_id
42
+ safe_add_index :spree_orders, :confirmation_delivered
43
+ safe_add_index :spree_prices, :deleted_at
44
+ safe_add_index :spree_products, :shipping_category_id
45
+ safe_add_index :spree_products, :tax_category_id
46
+ safe_add_index :spree_shipping_methods, :deleted_at
47
+ safe_add_index :spree_shipping_rates, :selected
48
+ safe_add_index :spree_shipping_rates, :tax_rate_id
49
+ safe_add_index :spree_stock_items, :backorderable
50
+ safe_add_index :spree_stock_locations, :active
51
+ safe_add_index :spree_stock_locations, :backorderable_default
52
+ safe_add_index :spree_stock_locations, :propagate_all_variants
53
+ safe_add_index :spree_tax_categories, :is_default
54
+ safe_add_index :spree_tax_categories, :deleted_at
55
+ safe_add_index :spree_tax_rates, :show_rate_in_label
56
+ safe_add_index :spree_tax_rates, :included_in_price
57
+ safe_add_index :spree_trackers, :active
58
+ safe_add_index :spree_variants, :is_master
59
+ safe_add_index :spree_variants, :deleted_at
60
+ safe_add_index :spree_zones, :default_tax
61
+ end
62
+
63
+ private
64
+
65
+ def safe_remove_index(table, column)
66
+ remove_index(table, column) if index_exists?(table, column)
67
+ end
68
+
69
+ def safe_add_index(table, column)
70
+ add_index(table, column) if column_exists?(table, column)
71
+ end
72
+ end
@@ -0,0 +1,11 @@
1
+ class RemoveStateLockVersionFromOrder < ActiveRecord::Migration
2
+ def up
3
+ if column_exists? :spree_orders, :state_lock_version
4
+ remove_column :spree_orders, :state_lock_version
5
+ end
6
+ end
7
+
8
+ def down
9
+ add_column :spree_orders, :state_lock_version, :integer, default: 0, null: false
10
+ end
11
+ end
@@ -36,6 +36,18 @@ Spree.config do |config|
36
36
 
37
37
  # Custom logo for the admin
38
38
  # config.admin_interface_logo = "logo/solidus_logo.png"
39
+
40
+ # Gateway credentials can be configured statically here and referenced from
41
+ # the admin. They can also be fully configured from the admin.
42
+ #
43
+ # config.static_model_preferences.add(
44
+ # Spree::Gateway::StripeGateway,
45
+ # 'stripe_env_credentials',
46
+ # secret_key: ENV['STRIPE_SECRET_KEY'],
47
+ # publishable_key: ENV['STRIPE_PUBLISHABLE_KEY'],
48
+ # server: Rails.env.production? ? 'production' : 'test',
49
+ # test: !Rails.env.production?
50
+ # )
39
51
  end
40
52
 
41
53
  Spree.user_class = <%= (options[:user_class].blank? ? "Spree::LegacyUser" : options[:user_class]).inspect %>
data/lib/spree/core.rb CHANGED
@@ -81,6 +81,7 @@ require 'spree/core/delegate_belongs_to'
81
81
  require 'spree/core/importer'
82
82
  require 'spree/core/permalinks'
83
83
  require 'spree/core/product_duplicator'
84
+ require 'spree/core/current_store'
84
85
  require 'spree/core/controller_helpers/auth'
85
86
  require 'spree/core/controller_helpers/common'
86
87
  require 'spree/core/controller_helpers/order'
@@ -4,13 +4,19 @@ module Spree
4
4
  module Store
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ # @!attribute [rw] current_store_class
8
+ # @!scope class
9
+ # Extension point for overriding how the current store is chosen.
10
+ # Defaults to checking headers and server name
11
+ # @return [#store] class used to help find the current store
7
12
  included do
13
+ class_attribute :current_store_class
14
+ self.current_store_class = Spree::Core::CurrentStore
8
15
 
9
16
  def current_store
10
- @current_store ||= Spree::Store.current(request.env['SERVER_NAME'])
17
+ @current_store ||= current_store_class.new(request).store
11
18
  end
12
19
  helper_method :current_store
13
-
14
20
  end
15
21
 
16
22
  end
@@ -10,12 +10,24 @@ module Spree
10
10
  to: :permitted_attributes,
11
11
  prefix: :permitted
12
12
 
13
+ def permitted_credit_card_update_attributes
14
+ permitted_attributes.credit_card_update_attributes + [
15
+ address_attributes: permitted_address_attributes,
16
+ ]
17
+ end
18
+
13
19
  def permitted_payment_attributes
14
20
  permitted_attributes.payment_attributes + [
15
21
  source_attributes: permitted_source_attributes
16
22
  ]
17
23
  end
18
24
 
25
+ def permitted_source_attributes
26
+ permitted_attributes.source_attributes + [
27
+ address_attributes: permitted_address_attributes,
28
+ ]
29
+ end
30
+
19
31
  def permitted_checkout_attributes
20
32
  permitted_attributes.checkout_attributes + [
21
33
  bill_address_attributes: permitted_address_attributes,
@@ -0,0 +1,26 @@
1
+ # Default class for deciding what the current store is, given an HTTP request
2
+ # This is an extension point used in Spree::Core::ControllerHelpers::Store
3
+ # Custom versions of this class must respond to a store instance method
4
+ module Spree
5
+ module Core
6
+ class CurrentStore
7
+ def initialize(request)
8
+ @request = request
9
+ end
10
+
11
+ # Chooses the current store based on a request.
12
+ # Checks request headers for HTTP_SPREE_STORE and falls back to
13
+ # looking up by the requesting server's name.
14
+ # @return [Spree::Store]
15
+ def store
16
+ Spree::Store.current(store_key)
17
+ end
18
+
19
+ private
20
+
21
+ def store_key
22
+ @request.headers['HTTP_SPREE_STORE'] || @request.env['SERVER_NAME']
23
+ end
24
+ end
25
+ end
26
+ end
@@ -85,6 +85,7 @@ module Spree
85
85
  Spree::Promotion::Rules::UserLoggedIn,
86
86
  Spree::Promotion::Rules::OneUsePerUser,
87
87
  Spree::Promotion::Rules::Taxon,
88
+ Spree::Promotion::Rules::NthOrder
88
89
  ]
89
90
  end
90
91
 
@@ -12,6 +12,7 @@ module Spree
12
12
 
13
13
  create_params = params.slice :currency
14
14
  order = Spree::Order.create! create_params
15
+ order.store ||= Spree::Store.default
15
16
  order.associate_user!(user)
16
17
  order.save!
17
18
 
@@ -6,6 +6,7 @@ module Spree
6
6
  ATTRIBUTES = [
7
7
  :address_attributes,
8
8
  :checkout_attributes,
9
+ :credit_card_update_attributes,
9
10
  :customer_return_attributes,
10
11
  :image_attributes,
11
12
  :inventory_unit_attributes,
@@ -44,6 +45,10 @@ module Spree
44
45
  :coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing
45
46
  ]
46
47
 
48
+ @@credit_card_update_attributes = [
49
+ :month, :year, :expiry, :first_name, :last_name, :name,
50
+ ]
51
+
47
52
  @@customer_return_attributes = [:stock_location_id, return_items_attributes: [:id, :inventory_unit_id, :return_authorization_id, :returned, :pre_tax_amount, :reception_status_event, :acceptance_status, :exchange_variant_id, :resellable]]
48
53
 
49
54
  @@image_attributes = [:alt, :attachment, :position, :viewable_type, :viewable_id]
@@ -1,5 +1,5 @@
1
1
  FactoryGirl.define do
2
- factory :payment, class: Spree::Payment do
2
+ factory :payment, aliases: [:credit_card_payment], class: Spree::Payment do
3
3
  amount 45.75
4
4
  association(:payment_method, factory: :credit_card_payment_method)
5
5
  association(:source, factory: :credit_card)
@@ -15,7 +15,10 @@ class OrderWalkthrough
15
15
  end
16
16
  end
17
17
 
18
- order = Spree::Order.create!(email: "spree@example.com")
18
+ order = Spree::Order.create!(
19
+ email: "spree@example.com",
20
+ store: Spree::Store.first || FactoryGirl.create(:store)
21
+ )
19
22
  add_line_item!(order)
20
23
  order.next!
21
24
 
@@ -0,0 +1,117 @@
1
+ namespace 'spree:migrations:copy_order_bill_address_to_credit_card' do
2
+ # This copies the billing address from the order associated with a
3
+ # credit card's most recent payment to the credit card.
4
+
5
+ # Used in the migration CopyOrderBillAddressToCreditCard and made available as a
6
+ # rake task to allow running it a second time after deploying the new code, in
7
+ # case some order->credit card data was missed between the time that the
8
+ # migration was run and the application servers were restarted with the new
9
+ # code.
10
+
11
+ # This task should be safe to run multiple times.
12
+
13
+ task up: :environment do
14
+ puts "Copying order bill addresses to credit cards"
15
+
16
+ if Spree::CreditCard.connection.adapter_name =~ /postgres/i
17
+ postgres_copy
18
+ else
19
+ ruby_copy
20
+ end
21
+ end
22
+
23
+ task down: :environment do
24
+ Spree::CreditCard.update_all(address_id: nil)
25
+ end
26
+
27
+ def ruby_copy
28
+ scope = Spree::CreditCard.where(address_id: nil).includes(payments: :order)
29
+
30
+ scope.find_each(batch_size: 500) do |cc|
31
+ # remove payments that lack a bill address
32
+ payments = cc.payments.select { |p| p.order.bill_address_id }
33
+
34
+ payment = payments.sort_by do |p|
35
+ [
36
+ %w(failed invalid).include?(p.state) ? 0 : 1, # prioritize valid payments
37
+ p.created_at, # prioritize more recent payments
38
+ ]
39
+ end.last
40
+
41
+ next if payment.nil?
42
+
43
+ cc.update_column(:address_id, payment.order.bill_address_id)
44
+ puts "Successfully associated billing address (#{payment.order.bill_address_id}) with credit card (#{cc.id})"
45
+ end
46
+ end
47
+
48
+ # This was 20x faster for us but the syntax is postgres-specific. I'm sure
49
+ # there are equivalent versions for other DBs if someone wants to write them.
50
+ # I took a quick stab at crafting a cross-db compatible version but it was
51
+ # slow.
52
+ def postgres_copy
53
+ batch_size = 10_000
54
+
55
+ puts "last id: #{last_credit_card_id}"
56
+
57
+ current_start_id = 1
58
+
59
+ while current_start_id <= last_credit_card_id
60
+ current_end_id = current_start_id + batch_size
61
+ puts "updating #{current_start_id} to #{current_end_id}"
62
+
63
+ # first try to find a valid payment for each credit card
64
+ Spree::CreditCard.connection.execute(
65
+ postgres_sql(
66
+ start_id: current_start_id,
67
+ end_id: current_end_id,
68
+ payment_state: "not in ('failed', 'invalid')",
69
+ )
70
+ )
71
+
72
+ # fall back to using invalid payments for each credit card
73
+ Spree::CreditCard.connection.execute(
74
+ postgres_sql(
75
+ start_id: current_start_id,
76
+ end_id: current_end_id,
77
+ payment_state: "in ('failed', 'invalid')",
78
+ )
79
+ )
80
+
81
+ current_start_id += batch_size
82
+ end
83
+ end
84
+
85
+ def postgres_sql(start_id:, end_id:, payment_state:)
86
+ <<-SQL
87
+ update spree_credit_cards c
88
+ set address_id = o.bill_address_id
89
+ from spree_payments p
90
+ inner join spree_orders o
91
+ on o.id = p.order_id
92
+ and o.bill_address_id is not null
93
+ left join (
94
+ select p2.*
95
+ from spree_payments p2
96
+ inner join spree_orders o2
97
+ on o2.id = p2.order_id
98
+ and o2.bill_address_id is not null
99
+ ) more_recent_payment
100
+ on more_recent_payment.source_id = p.source_id
101
+ and more_recent_payment.source_type = 'Spree::CreditCard'
102
+ and more_recent_payment.created_at > p.created_at
103
+ and more_recent_payment.state #{payment_state}
104
+ where c.address_id is null
105
+ and p.source_id = c.id
106
+ and p.source_type = 'Spree::CreditCard'
107
+ and p.state #{payment_state}
108
+ and more_recent_payment.id is null
109
+ and o.bill_address_id is not null
110
+ and c.id between #{start_id} and #{end_id}
111
+ SQL
112
+ end
113
+
114
+ def last_credit_card_id
115
+ Spree::CreditCard.last.try!(:id) || 0
116
+ end
117
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre2
4
+ version: 1.0.0.pre3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-20 00:00:00.000000000 Z
11
+ date: 2015-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -461,6 +461,7 @@ files:
461
461
  - app/models/spree/permission_sets/promotion_display.rb
462
462
  - app/models/spree/permission_sets/promotion_management.rb
463
463
  - app/models/spree/permission_sets/report_display.rb
464
+ - app/models/spree/permission_sets/restricted_transfer_management.rb
464
465
  - app/models/spree/permission_sets/stock_display.rb
465
466
  - app/models/spree/permission_sets/stock_management.rb
466
467
  - app/models/spree/permission_sets/user_display.rb
@@ -470,6 +471,8 @@ files:
470
471
  - app/models/spree/preferences/preferable.rb
471
472
  - app/models/spree/preferences/preferable_class_methods.rb
472
473
  - app/models/spree/preferences/scoped_store.rb
474
+ - app/models/spree/preferences/static_model_preferences.rb
475
+ - app/models/spree/preferences/statically_configurable.rb
473
476
  - app/models/spree/preferences/store.rb
474
477
  - app/models/spree/price.rb
475
478
  - app/models/spree/product.rb
@@ -484,6 +487,7 @@ files:
484
487
  - app/models/spree/promotion/actions/free_shipping.rb
485
488
  - app/models/spree/promotion/rules/first_order.rb
486
489
  - app/models/spree/promotion/rules/item_total.rb
490
+ - app/models/spree/promotion/rules/nth_order.rb
487
491
  - app/models/spree/promotion/rules/one_use_per_user.rb
488
492
  - app/models/spree/promotion/rules/option_value.rb
489
493
  - app/models/spree/promotion/rules/product.rb
@@ -794,7 +798,6 @@ files:
794
798
  - db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb
795
799
  - db/migrate/20141009204607_add_store_id_to_orders.rb
796
800
  - db/migrate/20141012083513_create_spree_taxons_prototypes.rb
797
- - db/migrate/20141021194502_add_state_lock_version_to_order.rb
798
801
  - db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb
799
802
  - db/migrate/20141101231208_fix_adjustment_order_presence.rb
800
803
  - db/migrate/20141105213646_update_classifications_positions.rb
@@ -848,6 +851,7 @@ files:
848
851
  - db/migrate/20150610182638_add_id_to_spree_option_values_variants.rb
849
852
  - db/migrate/20150611200247_add_frontend_viewable_to_spree_orders.rb
850
853
  - db/migrate/20150612205731_remove_spree_configurations.rb
854
+ - db/migrate/20150616204659_add_preference_source_to_spree_payment_methods.rb
851
855
  - db/migrate/20150618191713_remove_credit_card_address_id.rb
852
856
  - db/migrate/20150618212517_create_spree_store_credit_update_reasons.rb
853
857
  - db/migrate/20150619160613_create_adjustment_reason.rb
@@ -856,6 +860,10 @@ files:
856
860
  - db/migrate/20150623214058_seed_store_credit_update_reasons.rb
857
861
  - db/migrate/20150626200816_remove_shipping_method_id_from_spree_orders.rb
858
862
  - db/migrate/20150626214817_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb
863
+ - db/migrate/20150629175931_add_address_id_to_credit_card.rb
864
+ - db/migrate/20150630175644_copy_order_bill_address_to_credit_card.rb
865
+ - db/migrate/20150723224133_remove_unnecessary_indexes.rb
866
+ - db/migrate/20150724163716_remove_state_lock_version_from_order.rb
859
867
  - db/seeds.rb
860
868
  - lib/generators/spree/custom_user/custom_user_generator.rb
861
869
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
@@ -885,6 +893,7 @@ files:
885
893
  - lib/spree/core/controller_helpers/search.rb
886
894
  - lib/spree/core/controller_helpers/store.rb
887
895
  - lib/spree/core/controller_helpers/strong_parameters.rb
896
+ - lib/spree/core/current_store.rb
888
897
  - lib/spree/core/delegate_belongs_to.rb
889
898
  - lib/spree/core/engine.rb
890
899
  - lib/spree/core/environment.rb
@@ -985,6 +994,7 @@ files:
985
994
  - lib/tasks/core.rake
986
995
  - lib/tasks/email.rake
987
996
  - lib/tasks/exchanges.rake
997
+ - lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake
988
998
  - lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake
989
999
  - lib/tasks/order_capturing.rake
990
1000
  - vendor/assets/javascripts/jquery-migrate-1.0.0.js
@@ -1,5 +0,0 @@
1
- class AddStateLockVersionToOrder < ActiveRecord::Migration
2
- def change
3
- add_column :spree_orders, :state_lock_version, :integer, default: 0, null: false
4
- end
5
- end