spree_core 1.2.0.rc2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. data/app/assets/images/noimage/large.png +0 -0
  2. data/app/assets/javascripts/admin/admin.js.erb +1 -0
  3. data/app/assets/javascripts/admin/product_autocomplete.js.erb +1 -0
  4. data/app/assets/javascripts/admin/shipping_methods.js.coffee +10 -0
  5. data/app/assets/javascripts/admin/zone.js.coffee +39 -0
  6. data/app/assets/javascripts/store/cart.js.coffee +4 -5
  7. data/app/assets/javascripts/store/product.js.coffee +1 -2
  8. data/app/controllers/spree/admin/general_settings_controller.rb +1 -1
  9. data/app/controllers/spree/admin/images_controller.rb +5 -13
  10. data/app/controllers/spree/admin/orders_controller.rb +3 -1
  11. data/app/controllers/spree/admin/products_controller.rb +2 -6
  12. data/app/controllers/spree/admin/prototypes_controller.rb +2 -2
  13. data/app/controllers/spree/checkout_controller.rb +12 -23
  14. data/app/controllers/spree/orders_controller.rb +1 -0
  15. data/app/helpers/spree/admin/general_settings_helper.rb +13 -0
  16. data/app/helpers/spree/admin/users_helper.rb +1 -1
  17. data/app/helpers/spree/base_helper.rb +9 -24
  18. data/app/helpers/spree/products_helper.rb +2 -6
  19. data/app/models/spree/ability.rb +3 -3
  20. data/app/models/spree/address.rb +1 -1
  21. data/app/models/spree/adjustment.rb +4 -0
  22. data/app/models/spree/app_configuration.rb +3 -1
  23. data/app/models/spree/credit_card.rb +1 -1
  24. data/app/models/spree/inventory_unit.rb +1 -1
  25. data/app/models/spree/line_item.rb +1 -1
  26. data/app/models/spree/order.rb +14 -1
  27. data/app/models/spree/order/checkout.rb +19 -5
  28. data/app/models/spree/product.rb +37 -29
  29. data/app/models/spree/product/scopes.rb +2 -2
  30. data/app/models/spree/shipping_rate.rb +10 -0
  31. data/app/models/spree/variant.rb +14 -8
  32. data/app/views/spree/admin/adjustments/_adjustments_table.html.erb +1 -1
  33. data/app/views/spree/admin/general_settings/edit.html.erb +15 -6
  34. data/app/views/spree/admin/general_settings/show.html.erb +6 -0
  35. data/app/views/spree/admin/images/_form.html.erb +4 -8
  36. data/app/views/spree/admin/orders/_form.html.erb +3 -3
  37. data/app/views/spree/admin/orders/_line_item.html.erb +2 -2
  38. data/app/views/spree/admin/orders/index.html.erb +5 -1
  39. data/app/views/spree/admin/payments/_list.html.erb +1 -1
  40. data/app/views/spree/admin/payments/index.html.erb +1 -1
  41. data/app/views/spree/admin/products/index.html.erb +1 -1
  42. data/app/views/spree/admin/reports/sales_total.html.erb +3 -3
  43. data/app/views/spree/admin/return_authorizations/_form.html.erb +1 -1
  44. data/app/views/spree/admin/return_authorizations/index.html.erb +1 -1
  45. data/app/views/spree/admin/shared/_order_details.html.erb +6 -6
  46. data/app/views/spree/admin/shared/_order_tabs.html.erb +2 -1
  47. data/app/views/spree/admin/shared/_update_order_state.js +1 -1
  48. data/app/views/spree/admin/shipments/edit.html.erb +1 -1
  49. data/app/views/spree/admin/shipments/index.html.erb +1 -1
  50. data/app/views/spree/admin/variants/_form.html.erb +2 -2
  51. data/app/views/spree/admin/variants/index.html.erb +1 -1
  52. data/app/views/spree/checkout/_address.html.erb +0 -6
  53. data/app/views/spree/checkout/_delivery.html.erb +1 -5
  54. data/app/views/spree/checkout/_summary.html.erb +4 -4
  55. data/app/views/spree/checkout/edit.html.erb +6 -0
  56. data/app/views/spree/order_mailer/cancel_email.text.erb +7 -7
  57. data/app/views/spree/order_mailer/confirm_email.text.erb +9 -8
  58. data/app/views/spree/orders/_adjustments.html.erb +1 -1
  59. data/app/views/spree/orders/_line_item.html.erb +2 -2
  60. data/app/views/spree/orders/edit.html.erb +2 -2
  61. data/app/views/spree/products/_cart_form.html.erb +1 -1
  62. data/app/views/spree/shared/_google_analytics.html.erb +16 -15
  63. data/app/views/spree/shared/_order_details.html.erb +24 -22
  64. data/app/views/spree/shared/_products.html.erb +1 -1
  65. data/app/views/spree/shipment_mailer/shipped_email.text.erb +6 -6
  66. data/config/locales/en.yml +21 -0
  67. data/config/routes.rb +1 -1
  68. data/lib/generators/spree/install/templates/config/initializers/spree.rb +1 -1
  69. data/lib/spree/core.rb +1 -0
  70. data/lib/spree/core/controller_helpers.rb +19 -1
  71. data/lib/spree/core/engine.rb +0 -1
  72. data/lib/spree/core/search/base.rb +5 -2
  73. data/lib/spree/core/version.rb +1 -1
  74. data/lib/spree/money.rb +16 -0
  75. data/lib/spree/product_filters.rb +4 -3
  76. metadata +64 -129
  77. data/app/assets/javascripts/admin/shipping_methods.js +0 -15
  78. data/app/assets/javascripts/admin/zone.js +0 -29
  79. data/app/views/spree/admin/payments/_transaction_list.html.erb +0 -24
  80. data/lib/spree/core/relation_serialization.rb +0 -9
Binary file
@@ -1,3 +1,4 @@
1
+ //<%#encoding: UTF-8%>
1
2
  //= require_self
2
3
  //= require admin/product_autocomplete
3
4
  //= require select2
@@ -1,3 +1,4 @@
1
+ //<%#encoding: UTF-8%>
1
2
  // Product autocompletion
2
3
  image_html = function(item){
3
4
  return "<img src='" + item['images'][0]["mini_url"] + "'/>";
@@ -0,0 +1,10 @@
1
+ $ ->
2
+ ($ 'input[type=checkbox]:not(:checked)').attr 'disabled', true if ($ '.categories input:checked').length > 0
3
+ categoryCheckboxes = '.categories input[type=checkbox]'
4
+ $(categoryCheckboxes).change ->
5
+ if ($ this).is(':checked')
6
+ ($ categoryCheckboxes + ':not(:checked)').attr 'disabled', true
7
+ ($ this).removeAttr 'disabled'
8
+ else
9
+ ($ 'input[type=checkbox]').removeAttr 'disabled'
10
+
@@ -0,0 +1,39 @@
1
+ $ ->
2
+ if ($ '#country_based').is(':checked')
3
+ show_country()
4
+ else
5
+ show_state()
6
+ ($ '#country_based').click ->
7
+ show_country()
8
+
9
+ ($ '#state_based').click ->
10
+ show_state()
11
+
12
+
13
+ show_country = ->
14
+ ($ '#state_members :input').each ->
15
+ ($ this).prop 'disabled', true
16
+
17
+ ($ '#state_members').hide()
18
+ ($ '#zone_members :input').each ->
19
+ ($ this).prop 'disabled', true
20
+
21
+ ($ '#zone_members').hide()
22
+ ($ '#country_members :input').each ->
23
+ ($ this).prop 'disabled', false
24
+
25
+ ($ '#country_members').show()
26
+
27
+ show_state = ->
28
+ ($ '#country_members :input').each ->
29
+ ($ this).prop 'disabled', true
30
+
31
+ ($ '#country_members').hide()
32
+ ($ '#zone_members :input').each ->
33
+ ($ this).prop 'disabled', true
34
+
35
+ ($ '#zone_members').hide()
36
+ ($ '#state_members :input').each ->
37
+ ($ this).prop 'disabled', false
38
+
39
+ ($ '#state_members').show()
@@ -1,7 +1,6 @@
1
1
  $ ->
2
2
  if ($ 'form#update-cart').is('*')
3
- ($ 'form#update-cart a.delete').show().on 'click', (e) ->
4
- $(this).parents('.line-item').first().find('input.line_item_quantity').val 0
5
- $(this).parents('form').first().submit()
6
- e.preventDefault()
7
- return
3
+ ($ 'form#update-cart a.delete').show().on 'click', ->
4
+ ($ this).parents('.line-item').first().find('input.line_item_quantity').val 0
5
+ ($ this).parents('form').first().submit()
6
+ false
@@ -7,7 +7,6 @@ add_image_handlers = ->
7
7
  ($ this).mouseout ->
8
8
  ($ 'ul.thumbnails li').removeClass 'selected'
9
9
  ($ event.currentTarget).parent('li').addClass 'selected'
10
-
11
10
  false
12
11
 
13
12
  ($ 'ul.thumbnails li').on 'mouseenter', (event) ->
@@ -31,6 +30,6 @@ show_variant_images = (variant_id) ->
31
30
 
32
31
  $ ->
33
32
  add_image_handlers()
34
- show_variant_images ($ '#product-variants input[type="radio"]').eq(0).attr('value') if ($ '#product-variants input[type=radio]').length > 0
33
+ show_variant_images ($ '#product-variants input[type="radio"]').eq(0).attr('value') if ($ '#product-variants input[type="radio"]').length > 0
35
34
  ($ '#product-variants input[type="radio"]').click (event) ->
36
35
  show_variant_images @value
@@ -10,7 +10,7 @@ module Spree
10
10
  @preferences = [:site_name, :default_seo_title, :default_meta_keywords,
11
11
  :default_meta_description, :site_url, :allow_ssl_in_production,
12
12
  :allow_ssl_in_staging, :allow_ssl_in_development_and_test,
13
- :check_for_spree_alerts]
13
+ :check_for_spree_alerts, :display_currency]
14
14
  end
15
15
 
16
16
  def update
@@ -19,30 +19,22 @@ module Spree
19
19
 
20
20
 
21
21
  private
22
-
22
+
23
23
  def location_after_save
24
24
  admin_product_images_url(@product)
25
25
  end
26
26
 
27
27
  def load_data
28
- @product = Product.find_by_permalink(params[:product_id])
28
+ @product = Product.where(:permalink => params[:product_id]).first
29
29
  @variants = @product.variants.collect do |variant|
30
30
  [variant.options_text, variant.id]
31
31
  end
32
- @variants.insert(0, [I18n.t(:all), 'All'])
32
+ @variants.insert(0, [I18n.t(:all), @product.master.id])
33
33
  end
34
34
 
35
35
  def set_viewable
36
- if params[:image].has_key? :viewable_id
37
- if params[:image][:viewable_id] == 'All'
38
- @image.viewable = @product.master
39
- else
40
- @image.viewable_type = 'Spree::Variant'
41
- @image.viewable_id = params[:image][:viewable_id]
42
- end
43
- else
44
- @image.viewable = @product.master
45
- end
36
+ @image.viewable_type = 'Spree::Variant'
37
+ @image.viewable_id = params[:image][:viewable_id]
46
38
  end
47
39
 
48
40
  def destroy_before
@@ -20,6 +20,8 @@ module Spree
20
20
  created_at_gt = params[:q][:created_at_gt]
21
21
  created_at_lt = params[:q][:created_at_lt]
22
22
 
23
+ params[:q].delete(:inventory_units_shipment_id_null) if params[:q][:inventory_units_shipment_id_null] == "0"
24
+
23
25
  if !params[:q][:created_at_gt].blank?
24
26
  params[:q][:created_at_gt] = Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day rescue ""
25
27
  end
@@ -34,7 +36,7 @@ module Spree
34
36
  end
35
37
 
36
38
  @search = Order.ransack(params[:q])
37
- @orders = @search.result.includes([:user, :shipments, :payments]).page(params[:page]).per(Spree::Config[:orders_per_page])
39
+ @orders = @search.result(:distinct => true).includes([:user, :shipments, :payments]).page(params[:page]).per(Spree::Config[:orders_per_page])
38
40
 
39
41
  # Restore dates
40
42
  params[:q][:created_at_gt] = created_at_gt
@@ -19,13 +19,9 @@ module Spree
19
19
  end
20
20
  end
21
21
 
22
- # override the destory method to set deleted_at value
23
- # instead of actually deleting the product.
24
22
  def destroy
25
- @product = Product.find_by_permalink!(params[:id])
26
- @product.update_column(:deleted_at, Time.now)
27
-
28
- @product.variants_including_master.update_all(:deleted_at => Time.now)
23
+ @product = Product.where(:permalink => params[:id]).first!
24
+ @product.delete
29
25
 
30
26
  flash.notice = I18n.t('notice_messages.product_deleted')
31
27
 
@@ -29,8 +29,8 @@ module Spree
29
29
  private
30
30
 
31
31
  def set_habtm_associations
32
- @prototype.property_ids = params[:property][:id] if params[:property]
33
- @prototype.option_type_ids = params[:option_type][:id] if params[:option_type]
32
+ @prototype.property_ids = params[:option_type].blank? ? [] : params[:property][:id]
33
+ @prototype.option_type_ids = params[:option_type].blank? ? [] : params[:option_type][:id]
34
34
  end
35
35
  end
36
36
  end
@@ -39,14 +39,21 @@ module Spree
39
39
 
40
40
  private
41
41
  def ensure_valid_state
42
- if params[:state] && params[:state] != 'cart' &&
43
- !@order.checkout_steps.include?(params[:state])
44
- params[:state] == 'cart'
45
- @order.state = 'cart'
46
- redirect_to checkout_path
42
+ unless skip_state_validation?
43
+ if (params[:state] && !@order.checkout_steps.include?(params[:state])) ||
44
+ (!params[:state] && !@order.checkout_steps.include?(@order.state))
45
+ @order.state = 'cart'
46
+ redirect_to checkout_state_path(@order.checkout_steps.first)
47
+ end
47
48
  end
48
49
  end
49
50
 
51
+ # Should be overriden if you have areas of your checkout that don't match
52
+ # up to a step within checkout_steps, such as a registration step
53
+ def skip_state_validation?
54
+ false
55
+ end
56
+
50
57
  def load_order
51
58
  @order = current_order
52
59
  redirect_to cart_path and return unless @order and @order.checkout_allowed?
@@ -56,24 +63,6 @@ module Spree
56
63
  state_callback(:before)
57
64
  end
58
65
 
59
- def associate_user
60
- if try_spree_current_user && @order
61
- if @order.user.blank? || @order.email.blank?
62
- @order.associate_user!(try_spree_current_user)
63
- end
64
- end
65
-
66
- # This will trigger any "first order" promotions to be triggered
67
- # Assuming of course that this session variable was set correctly in
68
- # the authentication provider's registrations controller
69
- if session[:spree_user_signup]
70
- fire_event('spree.user.signup', :user => try_spree_current_user, :order => current_order(true))
71
- end
72
-
73
- session[:guest_token] = nil
74
- session[:spree_user_signup] = nil
75
- end
76
-
77
66
  # Provides a route to redirect after order completion
78
67
  def completion_route
79
68
  order_path(@order)
@@ -24,6 +24,7 @@ module Spree
24
24
  # Shows the current incomplete order from the session
25
25
  def edit
26
26
  @order = current_order(true)
27
+ associate_user
27
28
  end
28
29
 
29
30
  # Adds a new item to the order (creating a new order if none already exists)
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module Admin
3
+ module GeneralSettingsHelper
4
+ def currency_options
5
+ currencies = ::Money::Currency.table.map do |code, details|
6
+ iso = details[:iso_code]
7
+ [iso, "#{details[:name]} (#{iso})"]
8
+ end
9
+ options_from_collection_for_select(currencies, :first, :last)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,7 +3,7 @@ module Spree
3
3
  module UsersHelper
4
4
  def list_roles(user)
5
5
  # while testing spree-core itself user model does not have method roles
6
- user.respond_to?(:roles) ? user.roles.collect { |role| role.name }.join(", ") : []
6
+ user.respond_to?(:spree_roles) ? user.spree_roles.collect { |role| role.name }.join(", ") : []
7
7
  end
8
8
  end
9
9
  end
@@ -22,22 +22,13 @@ module Spree
22
22
  text = "#{text}: (#{t('empty')})"
23
23
  css_class = 'empty'
24
24
  else
25
- text = "#{text}: (#{current_order.item_count}) <span class='amount'>#{order_subtotal(current_order)}</span>".html_safe
25
+ text = "#{text}: (#{current_order.item_count}) <span class='amount'>#{current_order.display_total}</span>".html_safe
26
26
  css_class = 'full'
27
27
  end
28
28
 
29
29
  link_to text, cart_path, :class => css_class
30
30
  end
31
31
 
32
- def order_subtotal(order, options={})
33
- options.assert_valid_keys(:format_as_currency, :show_vat_text)
34
- options.reverse_merge! :format_as_currency => true, :show_vat_text => true
35
-
36
- amount = order.total
37
-
38
- options.delete(:format_as_currency) ? number_to_currency(amount) : amount
39
- end
40
-
41
32
  def todays_short_date
42
33
  utc_to_local(Time.now.utc).to_ordinalized_s(:stub)
43
34
  end
@@ -96,12 +87,12 @@ module Spree
96
87
  end
97
88
 
98
89
  def flash_messages(opts = {})
99
- flash.reject do |msg_type, text|
100
- opts[:ignore_types] && opts[:ignore_types].include?(msg_type)
101
- end
90
+ opts[:ignore_types] = [:commerce_tracking].concat(opts[:ignore_types] || [])
102
91
 
103
92
  flash.each do |msg_type, text|
104
- concat(content_tag :div, text, :class => "flash #{msg_type}") unless msg_type == :commerce_tracking
93
+ unless opts[:ignore_types].include?(msg_type)
94
+ concat(content_tag :div, text, :class => "flash #{msg_type}")
95
+ end
105
96
  end
106
97
  nil
107
98
  end
@@ -149,16 +140,6 @@ module Spree
149
140
  end.sort { |a, b| a.name <=> b.name }
150
141
  end
151
142
 
152
- def format_price(price, options={})
153
- options.assert_valid_keys(:show_vat_text)
154
- formatted_price = number_to_currency price
155
- if options[:show_vat_text]
156
- I18n.t(:price_with_vat_included, :price => formatted_price)
157
- else
158
- formatted_price
159
- end
160
- end
161
-
162
143
  # generates nested url to product based on supplied taxon
163
144
  def seo_url(taxon, product = nil)
164
145
  return spree.nested_taxons_path(taxon.permalink) if product.nil?
@@ -183,6 +164,10 @@ module Spree
183
164
  Gem.available?(name)
184
165
  end
185
166
 
167
+ def money(amount)
168
+ Spree::Money.new(amount)
169
+ end
170
+
186
171
  def method_missing(method_name, *args, &block)
187
172
  if image_style = image_style_from_method_name(method_name)
188
173
  define_image_method(image_style)
@@ -6,9 +6,9 @@ module Spree
6
6
  diff = variant.price - variant.product.price
7
7
  return nil if diff == 0
8
8
  if diff > 0
9
- "(#{t(:add)}: #{number_to_currency diff.abs})"
9
+ "(#{t(:add)}: #{Spree::Money.new(diff.abs)})"
10
10
  else
11
- "(#{t(:subtract)}: #{number_to_currency diff.abs})"
11
+ "(#{t(:subtract)}: #{Spree::Money.new(diff.abs)})"
12
12
  end
13
13
  end
14
14
 
@@ -17,10 +17,6 @@ module Spree
17
17
  raw(product.description.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>'))
18
18
  end
19
19
 
20
- def variant_images_hash(product)
21
- product.variant_images.inject({}) { |h, img| (h[img.viewable_id] ||= []) << img; h }
22
- end
23
-
24
20
  def line_item_description(variant)
25
21
  description = variant.product.description
26
22
  if description.present?
@@ -36,13 +36,13 @@ module Spree
36
36
  can :manage, :all
37
37
  else
38
38
  #############################
39
- can :read, LegacyUser do |resource|
39
+ can :read, Spree.user_class do |resource|
40
40
  resource == user
41
41
  end
42
- can :update, LegacyUser do |resource|
42
+ can :update, Spree.user_class do |resource|
43
43
  resource == user
44
44
  end
45
- can :create, LegacyUser
45
+ can :create, Spree.user_class
46
46
  #############################
47
47
  can :read, Order do |order, token|
48
48
  order.user == user || order.token && token == order.token
@@ -36,7 +36,7 @@ module Spree
36
36
  end
37
37
 
38
38
  def state_text
39
- state.nil? ? state_name : (state.abbr.blank? ? state.name : state.abbr)
39
+ state.try(:abbr) || state.try(:name) || state_name
40
40
  end
41
41
 
42
42
  def same_as?(other)
@@ -65,6 +65,10 @@ module Spree
65
65
  set_eligibility
66
66
  end
67
67
 
68
+ def display_amount
69
+ Spree::Money.new(amount).to_s
70
+ end
71
+
68
72
  private
69
73
 
70
74
  def update_adjustable
@@ -41,6 +41,8 @@ module Spree
41
41
  preference :checkout_zone, :string, :default => nil # replace with the name of a zone if you would like to limit the countries
42
42
  preference :company, :boolean, :default => false # Request company field for billing and shipping addr
43
43
  preference :create_inventory_units, :boolean, :default => true # should only be false when track_inventory_levels is false, also disables RMA's
44
+ preference :currency, :string, :default => "USD"
45
+ preference :display_currency, :boolean, :default => false
44
46
  preference :default_country_id, :integer, :default => 214
45
47
  preference :default_locale, :string, :default => Rails.application.config.i18n.default_locale || :en
46
48
  preference :default_meta_description, :string, :default => 'Spree demo site'
@@ -48,7 +50,7 @@ module Spree
48
50
  preference :default_seo_title, :string, :default => ''
49
51
  preference :dismissed_spree_alerts, :string, :default => ''
50
52
  preference :last_check_for_spree_alerts, :string, :default => nil
51
- preference :layout, :string, :default => '/spree/layouts/spree_application'
53
+ preference :layout, :string, :default => 'spree/layouts/spree_application'
52
54
  preference :logo, :string, :default => 'admin/bg/spree_50.png'
53
55
  preference :max_level_in_taxons_menu, :integer, :default => 1 # maximum nesting level in taxons menu
54
56
  preference :orders_per_page, :integer, :default => 15
@@ -30,7 +30,7 @@ module Spree
30
30
 
31
31
  # sets self.cc_type while we still have the card number
32
32
  def set_card_type
33
- self.cc_type ||= CardDetector.type?(number)
33
+ self.cc_type ||= CardDetector.brand?(number)
34
34
  end
35
35
 
36
36
  def name?
@@ -107,7 +107,7 @@ module Spree
107
107
  end
108
108
 
109
109
  def restock_variant
110
- variant.on_hand = (variant.on_hand + 1)
110
+ variant.on_hand += 1
111
111
  variant.save
112
112
  end
113
113
  end