spree_core 1.2.0.rc2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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