spree_core 1.3.2 → 1.3.3

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 (182) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/credit_cards/icons/diners_club.png +0 -0
  3. data/app/assets/javascripts/admin/address_states.js +1 -1
  4. data/app/assets/javascripts/admin/admin.js.erb +18 -13
  5. data/app/assets/javascripts/admin/calculator.js +2 -2
  6. data/app/assets/javascripts/admin/checkouts/edit.js +3 -1
  7. data/app/assets/javascripts/admin/image_settings.js.erb +5 -5
  8. data/app/assets/javascripts/admin/orders/edit.js +1 -1
  9. data/app/assets/javascripts/admin/payments/new.js +9 -2
  10. data/app/assets/javascripts/admin/spree_core.js +13 -1
  11. data/app/assets/javascripts/admin/taxon_autocomplete.js.erb +2 -1
  12. data/app/assets/javascripts/admin/variant_autocomplete.js.erb +23 -19
  13. data/app/assets/javascripts/spree.js.coffee +37 -0
  14. data/app/assets/javascripts/store/checkout.js.coffee +8 -0
  15. data/app/assets/javascripts/store/product.js.coffee +1 -1
  16. data/app/assets/javascripts/store/spree_core.js +1 -0
  17. data/app/assets/stylesheets/admin/components/_sidebar.scss +7 -6
  18. data/app/assets/stylesheets/admin/components/_states.scss +16 -12
  19. data/app/assets/stylesheets/admin/globals/_variables.scss +102 -96
  20. data/app/assets/stylesheets/admin/shared/_forms.scss +2 -1
  21. data/app/assets/stylesheets/admin/shared/_icons.scss +2 -1
  22. data/app/assets/stylesheets/admin/shared/_layout.scss +4 -1
  23. data/app/assets/stylesheets/admin/shared/_tables.scss +8 -0
  24. data/app/assets/stylesheets/store/screen.css.scss +28 -16
  25. data/app/assets/stylesheets/store/variables.css.scss +4 -2
  26. data/app/controllers/spree/admin/adjustments_controller.rb +7 -3
  27. data/app/controllers/spree/admin/base_controller.rb +10 -5
  28. data/app/controllers/spree/admin/line_items_controller.rb +3 -2
  29. data/app/controllers/spree/admin/orders/customer_details_controller.rb +3 -2
  30. data/app/controllers/spree/admin/orders_controller.rb +2 -2
  31. data/app/controllers/spree/admin/payments_controller.rb +1 -1
  32. data/app/controllers/spree/admin/resource_controller.rb +5 -5
  33. data/app/controllers/spree/admin/shipments_controller.rb +1 -1
  34. data/app/controllers/spree/admin/taxons_controller.rb +1 -1
  35. data/app/controllers/spree/admin/users_controller.rb +96 -0
  36. data/app/controllers/spree/checkout_controller.rb +18 -7
  37. data/app/controllers/spree/locale_controller.rb +1 -1
  38. data/app/controllers/spree/orders_controller.rb +20 -2
  39. data/app/controllers/spree/taxons_controller.rb +8 -2
  40. data/app/helpers/spree/admin/images_helper.rb +6 -2
  41. data/app/helpers/spree/admin/navigation_helper.rb +23 -3
  42. data/app/helpers/spree/base_helper.rb +9 -5
  43. data/app/helpers/spree/orders_helper.rb +13 -0
  44. data/app/helpers/spree/products_helper.rb +9 -4
  45. data/app/mailers/spree/base_mailer.rb +16 -0
  46. data/app/mailers/spree/order_mailer.rb +12 -11
  47. data/app/mailers/spree/shipment_mailer.rb +4 -7
  48. data/app/mailers/spree/test_mailer.rb +2 -3
  49. data/app/models/spree/adjustment.rb +1 -1
  50. data/app/models/spree/app_configuration.rb +9 -3
  51. data/app/models/spree/calculator/default_tax.rb +5 -1
  52. data/app/models/spree/calculator/per_item.rb +1 -1
  53. data/app/models/spree/classification.rb +7 -0
  54. data/app/models/spree/credit_card.rb +1 -5
  55. data/app/models/spree/gateway.rb +10 -2
  56. data/app/models/spree/gateway/bogus.rb +5 -5
  57. data/app/models/spree/inventory_unit.rb +4 -4
  58. data/app/models/spree/line_item.rb +1 -1
  59. data/app/models/spree/order.rb +15 -35
  60. data/app/models/spree/order/checkout.rb +52 -0
  61. data/app/models/spree/order_populator.rb +11 -3
  62. data/app/models/spree/order_updater.rb +3 -4
  63. data/app/models/spree/payment.rb +23 -1
  64. data/app/models/spree/payment/processing.rb +18 -5
  65. data/app/models/spree/payment_method.rb +4 -0
  66. data/app/models/spree/price.rb +2 -3
  67. data/app/models/spree/product.rb +12 -4
  68. data/app/models/spree/product/scopes.rb +29 -16
  69. data/app/models/spree/return_authorization.rb +1 -1
  70. data/app/models/spree/shipment.rb +1 -1
  71. data/app/models/spree/taxon.rb +21 -6
  72. data/app/models/spree/variant.rb +7 -2
  73. data/app/views/spree/admin/adjustments/_adjustments_table.html.erb +2 -2
  74. data/app/views/spree/admin/countries/index.html.erb +1 -0
  75. data/app/views/spree/admin/general_settings/edit.html.erb +10 -2
  76. data/app/views/spree/admin/images/index.html.erb +7 -3
  77. data/app/views/spree/admin/mail_methods/index.html.erb +2 -2
  78. data/app/views/spree/admin/orders/_form.html.erb +3 -3
  79. data/app/views/spree/admin/orders/_line_item.html.erb +1 -1
  80. data/app/views/spree/admin/orders/customer_details/_form.html.erb +4 -4
  81. data/app/views/spree/admin/orders/index.html.erb +60 -52
  82. data/app/views/spree/admin/payment_methods/_form.html.erb +2 -2
  83. data/app/views/spree/admin/payment_methods/index.html.erb +39 -35
  84. data/app/views/spree/admin/payments/_list.html.erb +1 -1
  85. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +10 -10
  86. data/app/views/spree/admin/products/_form.html.erb +7 -12
  87. data/app/views/spree/admin/products/index.html.erb +13 -15
  88. data/app/views/spree/admin/products/new.html.erb +3 -1
  89. data/app/views/spree/admin/return_authorizations/_form.html.erb +7 -7
  90. data/app/views/spree/admin/return_authorizations/edit.html.erb +17 -11
  91. data/app/views/spree/admin/return_authorizations/index.html.erb +4 -4
  92. data/app/views/spree/admin/return_authorizations/new.html.erb +13 -6
  93. data/app/views/spree/admin/shared/_alert.html.erb +1 -1
  94. data/app/views/spree/admin/shared/_configuration_menu.html.erb +6 -2
  95. data/app/views/spree/admin/shared/_order_details.html.erb +6 -6
  96. data/app/views/spree/admin/shared/_order_tabs.html.erb +20 -37
  97. data/app/views/spree/admin/shared/_routes.html.erb +1 -1
  98. data/app/views/spree/admin/shared/_tabs.html.erb +1 -2
  99. data/app/views/spree/admin/shared/_update_order_state.js +1 -1
  100. data/app/views/spree/admin/shipments/_form.html.erb +24 -24
  101. data/app/views/spree/admin/shipments/edit.html.erb +13 -13
  102. data/app/views/spree/admin/shipments/index.html.erb +35 -31
  103. data/app/views/spree/admin/shipping_methods/index.html.erb +35 -32
  104. data/app/views/spree/admin/tax_rates/_form.html.erb +2 -1
  105. data/app/views/spree/admin/taxons/_form.html.erb +17 -0
  106. data/app/views/spree/admin/taxons/edit.html.erb +3 -1
  107. data/app/views/spree/admin/trackers/_form.html.erb +2 -2
  108. data/app/views/spree/admin/trackers/index.html.erb +2 -2
  109. data/app/views/spree/admin/users/_form.html.erb +37 -0
  110. data/app/views/spree/admin/users/edit.html.erb +28 -0
  111. data/app/views/spree/admin/users/index.html.erb +53 -0
  112. data/app/views/spree/admin/users/new.html.erb +23 -0
  113. data/app/views/spree/admin/users/show.html.erb +21 -0
  114. data/app/views/spree/admin/variants/edit.html.erb +6 -4
  115. data/app/views/spree/admin/variants/index.html.erb +1 -1
  116. data/app/views/spree/admin/zones/_form.html.erb +4 -4
  117. data/app/views/spree/admin/zones/index.html.erb +3 -1
  118. data/app/views/spree/checkout/_delivery.html.erb +1 -1
  119. data/app/views/spree/checkout/_payment.html.erb +1 -1
  120. data/app/views/spree/checkout/_summary.html.erb +2 -2
  121. data/app/views/spree/checkout/payment/_gateway.html.erb +6 -6
  122. data/app/views/spree/layouts/spree_application.html.erb +0 -1
  123. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  124. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
  125. data/app/views/spree/orders/_adjustments.html.erb +1 -1
  126. data/app/views/spree/orders/_line_item.html.erb +2 -2
  127. data/app/views/spree/orders/edit.html.erb +1 -1
  128. data/app/views/spree/payments/_payment.html.erb +16 -0
  129. data/app/views/spree/products/_cart_form.html.erb +2 -2
  130. data/app/views/spree/products/_thumbnails.html.erb +3 -3
  131. data/app/views/spree/products/index.html.erb +1 -1
  132. data/app/views/spree/shared/_google_analytics.html.erb +1 -1
  133. data/app/views/spree/shared/_main_nav_bar.html.erb +1 -1
  134. data/app/views/spree/shared/_order_details.html.erb +10 -24
  135. data/app/views/spree/shared/_products.html.erb +1 -1
  136. data/app/views/spree/shared/_search.html.erb +1 -1
  137. data/app/views/spree/taxons/show.html.erb +1 -1
  138. data/config/initializers/check_for_orphaned_preferences.rb +5 -2
  139. data/config/locales/en.yml +24 -5
  140. data/config/routes.rb +4 -3
  141. data/db/default/spree/countries.rb +229 -0
  142. data/db/default/spree/roles.rb +2 -0
  143. data/db/default/spree/states.rb +57 -0
  144. data/db/default/spree/zones.rb +17 -0
  145. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +9 -0
  146. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +5 -0
  147. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +5 -0
  148. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +5 -0
  149. data/db/migrate/20130226054936_add_variant_id_index_to_spree_prices.rb +5 -0
  150. data/db/migrate/20130319062004_change_orders_total_precision.rb +8 -0
  151. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +7 -0
  152. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +7 -0
  153. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +7 -0
  154. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +9 -0
  155. data/lib/generators/spree/dummy/templates/rails/database.yml +9 -6
  156. data/lib/spree/core/calculated_adjustments.rb +1 -1
  157. data/lib/spree/core/controller_helpers/auth.rb +3 -3
  158. data/lib/spree/core/controller_helpers/common.rb +1 -11
  159. data/lib/spree/core/controller_helpers/order.rb +15 -12
  160. data/lib/spree/core/engine.rb +5 -1
  161. data/lib/spree/core/mail_interceptor.rb +4 -6
  162. data/lib/spree/core/mail_settings.rb +52 -23
  163. data/lib/spree/core/permalinks.rb +1 -3
  164. data/lib/spree/core/testing_support/authorization_helpers.rb +1 -1
  165. data/lib/spree/core/testing_support/capybara_ext.rb +30 -0
  166. data/lib/spree/core/testing_support/common_rake.rb +8 -0
  167. data/lib/spree/core/testing_support/factories/payment_factory.rb +1 -1
  168. data/lib/spree/core/testing_support/factories/product_factory.rb +7 -2
  169. data/lib/spree/core/testing_support/factories/variant_factory.rb +4 -2
  170. data/lib/spree/core/validators/email.rb +1 -1
  171. data/lib/spree/core/version.rb +1 -1
  172. data/lib/spree/money.rb +14 -3
  173. data/lib/spree/product_filters.rb +1 -1
  174. data/vendor/assets/javascripts/jquery.jstree/jquery.jstree.js +3 -2
  175. data/vendor/assets/javascripts/jsuri.js +2 -0
  176. data/vendor/assets/javascripts/modernizr.js +3 -3
  177. metadata +78 -69
  178. data/db/default/spree/countries.yml +0 -1589
  179. data/db/default/spree/roles.yml +0 -5
  180. data/db/default/spree/states.yml +0 -256
  181. data/db/default/spree/zone_members.yml +0 -169
  182. data/db/default/spree/zones.yml +0 -13
@@ -4,8 +4,8 @@ module Spree
4
4
  # order that this approach is waranted.
5
5
 
6
6
  # Much of this file, especially the update action is overriden in the promo gem.
7
- # This is to allow for the promo behavior but also allow the promo gem to be
8
- # removed if the functionality is not needed.
7
+ # This is to allow for the promo behavior but also allow the promo gem to be
8
+ # removed if the functionality is not needed.
9
9
 
10
10
  class CheckoutController < Spree::StoreController
11
11
  ssl_required
@@ -13,12 +13,15 @@ module Spree
13
13
  before_filter :load_order
14
14
  before_filter :ensure_valid_state
15
15
  before_filter :associate_user
16
+ before_filter :check_authorization
16
17
  rescue_from Spree::Core::GatewayError, :with => :rescue_from_spree_gateway_error
17
18
 
18
19
  respond_to :html
19
20
 
21
+ helper 'spree/orders'
22
+
20
23
  # Updates the order and advances to the next state (when possible.)
21
- # Overriden by the promo gem if it exists.
24
+ # Overriden by the promo gem if it exists.
22
25
  def update
23
26
  if @order.update_attributes(object_params)
24
27
  fire_event('spree.checkout.update')
@@ -46,8 +49,8 @@ module Spree
46
49
  private
47
50
  def ensure_valid_state
48
51
  unless skip_state_validation?
49
- if (params[:state] && !@order.checkout_steps.include?(params[:state])) ||
50
- (!params[:state] && !@order.checkout_steps.include?(@order.state))
52
+ if (params[:state] && !@order.has_checkout_step?(params[:state])) ||
53
+ (!params[:state] && !@order.has_checkout_step?(@order.state))
51
54
  @order.state = 'cart'
52
55
  redirect_to checkout_state_path(@order.checkout_steps.first)
53
56
  end
@@ -65,7 +68,11 @@ module Spree
65
68
  redirect_to cart_path and return unless @order and @order.checkout_allowed?
66
69
  raise_insufficient_quantity and return if @order.insufficient_stock_lines.present?
67
70
  redirect_to cart_path and return if @order.completed?
68
- @order.state = params[:state] if params[:state]
71
+
72
+ if params[:state]
73
+ redirect_to checkout_state_path(@order.state) if @order.can_go_to_state?(params[:state]) && !skip_state_validation?
74
+ @order.state = params[:state]
75
+ end
69
76
  state_callback(:before)
70
77
  end
71
78
 
@@ -76,7 +83,7 @@ module Spree
76
83
 
77
84
  def object_params
78
85
  # For payment step, filter order parameters to produce the expected nested attributes for a single payment and its source, discarding attributes for payment methods other than the one selected
79
- if @order.payment?
86
+ if @order.has_checkout_step?("payment") && @order.payment?
80
87
  if params[:payment_source].present? && source_params = params.delete(:payment_source)[params[:order][:payments_attributes].first[:payment_method_id].underscore]
81
88
  params[:order][:payments_attributes].first[:source_attributes] = source_params
82
89
  end
@@ -115,5 +122,9 @@ module Spree
115
122
  flash[:error] = t(:spree_gateway_error_flash_for_checkout)
116
123
  render :edit
117
124
  end
125
+
126
+ def check_authorization
127
+ authorize!(:edit, current_order, session[:access_token])
128
+ end
118
129
  end
119
130
  end
@@ -10,7 +10,7 @@ module Spree
10
10
  else
11
11
  flash[:error] = t(:locale_not_changed)
12
12
  end
13
- redirect_back_or_default(root_path)
13
+ redirect_back_or_default(spree.root_path)
14
14
  end
15
15
  end
16
16
  end
@@ -2,8 +2,9 @@ module Spree
2
2
  class OrdersController < Spree::StoreController
3
3
  ssl_required :show
4
4
 
5
+ before_filter :check_authorization
5
6
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
6
- helper 'spree/products'
7
+ helper 'spree/products', 'spree/orders'
7
8
 
8
9
  respond_to :html
9
10
 
@@ -14,6 +15,11 @@ module Spree
14
15
 
15
16
  def update
16
17
  @order = current_order
18
+ unless @order
19
+ flash[:error] = t(:order_not_found)
20
+ redirect_to root_path and return
21
+ end
22
+
17
23
  if @order.update_attributes(params[:order])
18
24
  @order.line_items = @order.line_items.select {|li| li.quantity > 0 }
19
25
  fire_event('spree.order.contents_changed')
@@ -62,7 +68,19 @@ module Spree
62
68
  end
63
69
 
64
70
  def accurate_title
65
- @order && @order.completed? ? "#{Order.model_name.human} #{@order.number}" : t(:shopping_cart)
71
+ @order && @order.completed? ? "#{t(:order)} #{@order.number}" : t(:shopping_cart)
72
+ end
73
+
74
+ def check_authorization
75
+ session[:access_token] ||= params[:token]
76
+ order = Spree::Order.find_by_number(params[:id]) || current_order
77
+
78
+ if order
79
+ authorize! :edit, order, session[:access_token]
80
+ else
81
+ authorize! :create, Spree::Order
82
+ end
66
83
  end
84
+
67
85
  end
68
86
  end
@@ -18,8 +18,14 @@ module Spree
18
18
  end
19
19
 
20
20
  private
21
- def accurate_title
22
- @taxon ? @taxon.name : super
21
+
22
+ def accurate_title
23
+ if @taxon
24
+ @taxon.seo_title
25
+ else
26
+ super
23
27
  end
28
+ end
29
+
24
30
  end
25
31
  end
@@ -3,9 +3,13 @@ module Spree
3
3
  module ImagesHelper
4
4
  def options_text_for(image)
5
5
  if image.viewable.is_a?(Spree::Variant)
6
- image.viewable.options_text
6
+ if image.viewable.is_master?
7
+ I18n.t(:all)
8
+ else
9
+ image.viewable.options_text
10
+ end
7
11
  else
8
- "All"
12
+ I18n.t(:all)
9
13
  end
10
14
  end
11
15
  end
@@ -8,6 +8,10 @@ module Spree
8
8
  # * :match_path as an alternative way to control when the tab is active, /products would match /admin/products, /admin/products/5/variants etc.
9
9
  def tab(*args)
10
10
  options = {:label => args.first.to_s}
11
+
12
+ # Return if resource is found and user is not allowed to :admin
13
+ return '' if klass = klass_for(options[:label]) and cannot?(:admin, klass)
14
+
11
15
  if args.last.is_a?(Hash)
12
16
  options = options.merge(args.pop)
13
17
  end
@@ -27,7 +31,7 @@ module Spree
27
31
  end
28
32
 
29
33
  selected = if options[:match_path]
30
- request.fullpath.starts_with?("#{root_path}admin#{options[:match_path]}")
34
+ request.fullpath.starts_with?("#{spree.root_path}admin#{options[:match_path]}")
31
35
  else
32
36
  args.include?(controller.controller_name.to_sym)
33
37
  end
@@ -39,6 +43,22 @@ module Spree
39
43
  content_tag('li', link, :class => css_classes.join(' '))
40
44
  end
41
45
 
46
+ # finds class for a given symbol / string
47
+ #
48
+ # Example :
49
+ # :products returns Spree::Product
50
+ # :my_products returns MyProduct if MyProduct is defined
51
+ # :my_products returns My::Product if My::Product is defined
52
+ # if cannot constantize it returns nil
53
+ # This will allow us to use cancan abilities on tab
54
+ def klass_for(name)
55
+ model_name = name.to_s
56
+
57
+ ["Spree::#{model_name.classify}", model_name.classify, model_name.gsub('_', '/').classify].find do |t|
58
+ t.safe_constantize
59
+ end.try(:safe_constantize)
60
+ end
61
+
42
62
  def link_to_clone(resource, options={})
43
63
  options[:data] = {:action => 'clone'}
44
64
  link_to_with_icon('icon-copy', t(:clone), clone_admin_product_url(resource), options)
@@ -96,9 +116,9 @@ module Spree
96
116
  object_name, action = url.split('/')[-2..-1]
97
117
  html_options['data-update'] = [action, object_name.singularize].join('_')
98
118
  end
99
-
119
+
100
120
  html_options.delete('data-update') unless html_options['data-update']
101
-
121
+
102
122
  html_options[:class] = 'button'
103
123
 
104
124
  if html_options[:icon]
@@ -22,11 +22,11 @@ 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'>#{current_order.display_total}</span>".html_safe
25
+ text = "#{text}: (#{current_order.item_count}) <span class='amount'>#{current_order.display_total.to_html}</span>".html_safe
26
26
  css_class = 'full'
27
27
  end
28
28
 
29
- link_to text, spree.cart_path, :class => css_class
29
+ link_to text, spree.cart_path, :class => "cart-info #{css_class}"
30
30
  end
31
31
 
32
32
  # human readable list of variant options
@@ -56,7 +56,7 @@ module Spree
56
56
  end
57
57
 
58
58
  if meta[:description].blank? && object.kind_of?(Spree::Product)
59
- meta[:description] = strip_tags(object.description)
59
+ meta[:description] = strip_tags(truncate(object.description, :length => 160, :separator => ' '))
60
60
  end
61
61
 
62
62
  meta.reverse_merge!({
@@ -75,7 +75,7 @@ module Spree
75
75
  end
76
76
 
77
77
  def logo(image_path=Spree::Config[:logo])
78
- link_to image_tag(image_path), root_path
78
+ link_to image_tag(image_path), spree.root_path
79
79
  end
80
80
 
81
81
  def flash_messages(opts = {})
@@ -92,7 +92,7 @@ module Spree
92
92
  def breadcrumbs(taxon, separator="&nbsp;&raquo;&nbsp;")
93
93
  return "" if current_page?("/") || taxon.nil?
94
94
  separator = raw(separator)
95
- crumbs = [content_tag(:li, link_to(t(:home) , root_path) + separator)]
95
+ crumbs = [content_tag(:li, link_to(t(:home) , spree.root_path) + separator)]
96
96
  if taxon
97
97
  crumbs << content_tag(:li, link_to(t(:products) , products_path) + separator)
98
98
  crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, link_to(ancestor.name , seo_url(ancestor)) + separator) } unless taxon.ancestors.empty?
@@ -149,6 +149,10 @@ module Spree
149
149
  Spree::Money.new(amount)
150
150
  end
151
151
 
152
+ def display_price(product_or_variant)
153
+ product_or_variant.price_in(current_currency).display_price.to_html
154
+ end
155
+
152
156
  def pretty_time(time)
153
157
  [I18n.l(time.to_date, :format => :long),
154
158
  time.strftime("%H:%m %p")].join(" ")
@@ -0,0 +1,13 @@
1
+ require 'truncate_html'
2
+ require 'app/helpers/truncate_html_helper'
3
+
4
+ module Spree
5
+ module OrdersHelper
6
+ include TruncateHtmlHelper
7
+
8
+ def truncated_product_description(product)
9
+ truncate_html(raw(product.description))
10
+ end
11
+ end
12
+ end
13
+
@@ -14,10 +14,11 @@ module Spree
14
14
  def variant_price_diff(variant)
15
15
  diff = variant.amount_in(current_currency) - variant.product.amount_in(current_currency)
16
16
  return nil if diff == 0
17
+ amount = Spree::Money.new(diff.abs, { :currency => current_currency }).to_html
17
18
  if diff > 0
18
- "(#{t(:add)}: #{Spree::Money.new(diff.abs, { :currency => current_currency })})"
19
+ "(#{t(:add)}: #{amount})".html_safe
19
20
  else
20
- "(#{t(:subtract)}: #{Spree::Money.new(diff.abs, { :currency => current_currency })})"
21
+ "(#{t(:subtract)}: #{amount})".html_safe
21
22
  end
22
23
  end
23
24
 
@@ -25,13 +26,17 @@ module Spree
25
26
  def variant_full_price(variant)
26
27
  product = variant.product
27
28
  unless product.variants.active(current_currency).all? { |v| v.price == product.price }
28
- Spree::Money.new(variant.price, { :currency => current_currency }).to_s
29
+ Spree::Money.new(variant.price, { :currency => current_currency }).to_html
29
30
  end
30
31
  end
31
32
 
32
33
  # converts line breaks in product description into <p> tags (for html display purposes)
33
34
  def product_description(product)
34
- raw(product.description.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>'))
35
+ if Spree::Config[:show_raw_product_description]
36
+ raw(product.description)
37
+ else
38
+ raw(product.description.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>'))
39
+ end
35
40
  end
36
41
 
37
42
  def line_item_description(variant)
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ class BaseMailer < ActionMailer::Base
3
+ def from_address
4
+ if MailMethod.current
5
+ MailMethod.current.preferred_mails_from
6
+ else
7
+ Spree::Config.emails_sent_from
8
+ end
9
+ end
10
+
11
+ def money(amount)
12
+ Spree::Money.new(amount).to_s
13
+ end
14
+ helper_method :money
15
+ end
16
+ end
@@ -1,21 +1,22 @@
1
1
  module Spree
2
- class OrderMailer < ActionMailer::Base
3
- helper 'spree/base'
4
-
2
+ class OrderMailer < BaseMailer
5
3
  def confirm_email(order, resend = false)
6
- @order = order
4
+ find_order(order)
7
5
  subject = (resend ? "[#{t(:resend).upcase}] " : '')
8
- subject += "#{Spree::Config[:site_name]} #{t('order_mailer.confirm_email.subject')} ##{order.number}"
9
- mail(:to => order.email,
10
- :subject => subject)
6
+ subject += "#{Spree::Config[:site_name]} #{t('order_mailer.confirm_email.subject')} ##{@order.number}"
7
+ mail(:to => @order.email, :from => from_address, :subject => subject)
11
8
  end
12
9
 
13
10
  def cancel_email(order, resend = false)
14
- @order = order
11
+ find_order(order)
15
12
  subject = (resend ? "[#{t(:resend).upcase}] " : '')
16
- subject += "#{Spree::Config[:site_name]} #{t('order_mailer.cancel_email.subject')} ##{order.number}"
17
- mail(:to => order.email,
18
- :subject => subject)
13
+ subject += "#{Spree::Config[:site_name]} #{t('order_mailer.cancel_email.subject')} ##{@order.number}"
14
+ mail(:to => @order.email, :from => from_address, :subject => subject)
19
15
  end
16
+
17
+ private
18
+ def find_order(order)
19
+ @order = order.is_a?(Spree::Order) ? order : Spree::Order.find(order)
20
+ end
20
21
  end
21
22
  end
@@ -1,13 +1,10 @@
1
1
  module Spree
2
- class ShipmentMailer < ActionMailer::Base
3
- helper 'spree/base'
4
-
2
+ class ShipmentMailer < BaseMailer
5
3
  def shipped_email(shipment, resend = false)
6
- @shipment = shipment
4
+ @shipment = shipment.is_a?(Spree::Shipment) ? shipment : Spree::Shipment.find(shipment)
7
5
  subject = (resend ? "[#{t(:resend).upcase}] " : '')
8
- subject += "#{Spree::Config[:site_name]} #{t('shipment_mailer.shipped_email.subject')} ##{shipment.order.number}"
9
- mail(:to => shipment.order.email,
10
- :subject => subject)
6
+ subject += "#{Spree::Config[:site_name]} #{t('shipment_mailer.shipped_email.subject')} ##{@shipment.order.number}"
7
+ mail(:to => @shipment.order.email, :from => from_address, :subject => subject)
11
8
  end
12
9
  end
13
10
  end
@@ -1,10 +1,9 @@
1
1
  module Spree
2
- class TestMailer < ActionMailer::Base
2
+ class TestMailer < BaseMailer
3
3
  def test_email(mail_method, user)
4
4
  @mail_method = mail_method
5
5
  subject = "#{Spree::Config[:site_name]} #{t('test_mailer.test_email.subject')}"
6
- mail(:to => user.email,
7
- :subject => subject)
6
+ mail(:to => user.email, :from =>from_address, :subject => subject)
8
7
  end
9
8
  end
10
9
  end
@@ -70,7 +70,7 @@ module Spree
70
70
  end
71
71
 
72
72
  def display_amount
73
- Spree::Money.new(amount, { :currency => currency }).to_s
73
+ Spree::Money.new(amount, { :currency => currency })
74
74
  end
75
75
 
76
76
  private
@@ -15,6 +15,8 @@
15
15
  # a.get :color
16
16
  # a.preferred_color
17
17
  #
18
+ require "spree/core/search/base"
19
+
18
20
  module Spree
19
21
  class AppConfiguration < Preferences::Configuration
20
22
 
@@ -39,18 +41,23 @@ module Spree
39
41
  preference :company, :boolean, :default => false # Request company field for billing and shipping addr
40
42
  preference :create_inventory_units, :boolean, :default => true # should only be false when track_inventory_levels is false, also disables RMA's
41
43
  preference :currency, :string, :default => "USD"
44
+ preference :currency_decimal_mark, :string, :default => "."
42
45
  preference :currency_symbol_position, :string, :default => "before"
46
+ preference :currency_thousands_separator, :string, :default => ","
43
47
  preference :display_currency, :boolean, :default => false
44
- preference :default_country_id, :integer, :default => 214
48
+ preference :default_country_id, :integer
45
49
  preference :default_meta_description, :string, :default => 'Spree demo site'
46
50
  preference :default_meta_keywords, :string, :default => 'spree, demo'
47
51
  preference :default_seo_title, :string, :default => ''
48
52
  preference :dismissed_spree_alerts, :string, :default => ''
53
+ preference :emails_sent_from, :string, :default => 'spree@example.com'
49
54
  preference :hide_cents, :boolean, :default => false
50
55
  preference :last_check_for_spree_alerts, :string, :default => nil
51
56
  preference :layout, :string, :default => 'spree/layouts/spree_application'
52
57
  preference :logo, :string, :default => 'admin/bg/spree_50.png'
53
58
  preference :max_level_in_taxons_menu, :integer, :default => 1 # maximum nesting level in taxons menu
59
+ preference :max_quantity, :integer, :default => 1000 # Maximum allowable quantity when checking out
60
+ preference :override_actionmailer_config, :boolean, :default => true
54
61
  preference :orders_per_page, :integer, :default => 15
55
62
  preference :prices_inc_tax, :boolean, :default => false
56
63
  preference :products_per_page, :integer, :default => 12
@@ -59,6 +66,7 @@ module Spree
59
66
  preference :shipping_instructions, :boolean, :default => false # Request instructions/info for shipping
60
67
  preference :show_descendents, :boolean, :default => true
61
68
  preference :show_only_complete_orders_by_default, :boolean, :default => true
69
+ preference :show_raw_product_description, :boolean, :default => false
62
70
  preference :show_zero_stock_products, :boolean, :default => true
63
71
  preference :show_variant_full_price, :boolean, :default => false #Displays variant full price or difference with product price. Default false to be compatible with older behavior
64
72
  preference :show_products_without_price, :boolean, :default => false
@@ -89,7 +97,5 @@ module Spree
89
97
  def searcher_class=(sclass)
90
98
  @searcher_class = sclass
91
99
  end
92
-
93
100
  end
94
-
95
101
  end