solidus_core 1.0.0.pre2 → 1.0.0.pre3

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.

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