spree_core 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/app/assets/javascripts/admin/admin.js.erb +21 -20
  2. data/app/assets/stylesheets/store/screen.css.scss +4 -0
  3. data/app/controllers/spree/admin/payment_methods_controller.rb +1 -1
  4. data/app/controllers/spree/admin/products_controller.rb +1 -1
  5. data/app/controllers/spree/admin/shipping_methods_controller.rb +1 -1
  6. data/app/controllers/spree/admin/taxons_controller.rb +1 -1
  7. data/app/controllers/spree/content_controller.rb +1 -1
  8. data/app/controllers/spree/products_controller.rb +5 -4
  9. data/app/helpers/spree/admin/products_helper.rb +0 -9
  10. data/app/helpers/spree/products_helper.rb +14 -1
  11. data/app/helpers/spree/taxons_helper.rb +1 -0
  12. data/app/models/spree/address.rb +1 -1
  13. data/app/models/spree/app_configuration.rb +1 -0
  14. data/app/models/spree/creditcard.rb +1 -1
  15. data/app/models/spree/image.rb +1 -0
  16. data/app/models/spree/line_item.rb +1 -1
  17. data/app/models/spree/order.rb +2 -2
  18. data/app/models/spree/payment_method.rb +1 -1
  19. data/app/models/spree/product.rb +2 -1
  20. data/app/models/spree/product/scopes.rb +0 -11
  21. data/app/models/spree/shipment.rb +6 -7
  22. data/app/models/spree/tax_category.rb +1 -1
  23. data/app/models/spree/taxonomy.rb +1 -1
  24. data/app/models/spree/tracker.rb +2 -1
  25. data/app/models/spree/variant.rb +5 -0
  26. data/app/models/spree/zone.rb +5 -11
  27. data/app/models/spree/zone_member.rb +1 -1
  28. data/app/views/spree/admin/image_settings/edit.html.erb +7 -0
  29. data/app/views/spree/admin/images/index.html.erb +2 -0
  30. data/app/views/spree/admin/option_types/index.html.erb +2 -0
  31. data/app/views/spree/admin/orders/customer_details/edit.html.erb +1 -1
  32. data/app/views/spree/admin/shared/_head.html.erb +9 -6
  33. data/app/views/spree/admin/variants/index.html.erb +2 -0
  34. data/app/views/spree/checkout/_address.html.erb +6 -6
  35. data/app/views/spree/layouts/spree_application.html.erb +7 -7
  36. data/app/views/spree/orders/_line_item.html.erb +1 -1
  37. data/app/views/spree/shared/_google_analytics.html.erb +27 -27
  38. data/app/views/spree/taxons/show.html.erb +5 -5
  39. data/config/locales/en.yml +1 -0
  40. data/config/routes.rb +2 -7
  41. data/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +2 -2
  42. data/db/migrate/20091015153048_add_openid_field_to_users.rb +1 -1
  43. data/db/migrate/20091021133257_charge_refactoring.rb +2 -2
  44. data/db/migrate/20100105132138_shipment_id_for_inventory_units.rb +1 -1
  45. data/db/migrate/20120712172620_add_counter_cache_to_zone_members.rb +14 -0
  46. data/lib/spree/core/controller_helpers.rb +0 -5
  47. data/lib/spree/core/mail_interceptor.rb +1 -1
  48. data/lib/spree/core/permalinks.rb +2 -2
  49. data/lib/spree/core/testing_support/factories/product_factory.rb +1 -3
  50. data/lib/spree/core/version.rb +1 -1
  51. metadata +32 -31
@@ -164,9 +164,9 @@ $.fn.product_autocomplete = function(){
164
164
  $.fn.objectPicker = function(url){
165
165
  $(this).tokenInput(url + "&authenticity_token=" + escape(AUTH_TOKEN), {
166
166
  searchDelay : 600,
167
- hintText : strings.type_to_search,
168
- noResultsText : strings.no_results,
169
- searchingText : strings.searching,
167
+ hintText : Spree.strings.type_to_search,
168
+ noResultsText : Spree.strings.no_results,
169
+ searchingText : Spree.strings.searching,
170
170
  prePopulateFromInput : true
171
171
  });
172
172
  };
@@ -174,26 +174,11 @@ $.fn.objectPicker = function(url){
174
174
  $.fn.productPicker = function(){
175
175
  $(this).objectPicker(Spree.routes.product_search_basic);
176
176
  }
177
+
177
178
  $.fn.userPicker = function(){
178
179
  $(this).objectPicker(Spree.routes.user_search);
179
180
  }
180
181
 
181
- $(".observe_field").on('change', function() {
182
- target = $(this).attr("data-update");
183
- ajax_indicator = $(this).attr("data-ajax-indicator") || '#busy_indicator';
184
- $(target).hide();
185
- $(ajax_indicator).show();
186
- $.ajax({ dataType: 'html',
187
- url: $(this).attr("data-base-url")+encodeURIComponent($(this).val()),
188
- type: 'get',
189
- success: function(data){
190
- $(target).html(data);
191
- $(ajax_indicator).hide();
192
- $(target).show();
193
- }
194
- });
195
- });
196
-
197
182
  handle_date_picker_fields = function(){
198
183
  $('.datepicker').datepicker({
199
184
  dateFormat: "<%= ::I18n.t(:format, :scope => 'spree.date_picker', :default => 'yy/mm/dd') %>",
@@ -209,6 +194,22 @@ handle_date_picker_fields = function(){
209
194
  }
210
195
 
211
196
  $(document).ready(function(){
197
+ $(".observe_field").on('change', function() {
198
+ target = $(this).attr("data-update");
199
+ ajax_indicator = $(this).attr("data-ajax-indicator") || '#busy_indicator';
200
+ $(target).hide();
201
+ $(ajax_indicator).show();
202
+ $.ajax({ dataType: 'html',
203
+ url: $(this).attr("data-base-url")+encodeURIComponent($(this).val()),
204
+ type: 'get',
205
+ success: function(data){
206
+ $(target).html(data);
207
+ $(ajax_indicator).hide();
208
+ $(target).show();
209
+ }
210
+ });
211
+ });
212
+
212
213
  $('.add_fields').click(function() {
213
214
  var target = $(this).data("target");
214
215
  var new_table_row = $(target + ' tr:visible:last').clone();
@@ -255,7 +256,7 @@ $(document).ready(function(){
255
256
 
256
257
  handle_date_picker_fields();
257
258
 
258
- $(".select_properties_from_prototype").on("click", function(){
259
+ $('body').on('click', '.select_properties_from_prototype', function(){
259
260
  $("#busy_indicator").show();
260
261
  var clicked_link = $(this);
261
262
  $.ajax({ dataType: 'script', url: clicked_link.attr("href"), type: 'get',
@@ -530,6 +530,10 @@ mark {background-color: $link_text_color; color: $layout_background_color; font-
530
530
  text-align: center;
531
531
  border: 1px solid lighten($body_text_color, 60);
532
532
  background-color: $product_background_color;
533
+
534
+ img {
535
+ min-height: 240px;
536
+ }
533
537
  }
534
538
  #product-thumbnails {
535
539
  li {
@@ -22,7 +22,7 @@ module Spree
22
22
  invoke_callbacks(:update, :before)
23
23
  payment_method_type = params[:payment_method].delete(:type)
24
24
  if @payment_method['type'].to_s != payment_method_type
25
- @payment_method.update_attribute(:type, payment_method_type)
25
+ @payment_method.update_column(:type, payment_method_type)
26
26
  @payment_method = PaymentMethod.find(params[:id])
27
27
  end
28
28
 
@@ -23,7 +23,7 @@ module Spree
23
23
  # instead of actually deleting the product.
24
24
  def destroy
25
25
  @product = Product.find_by_permalink!(params[:id])
26
- @product.update_attribute(:deleted_at, Time.now)
26
+ @product.update_column(:deleted_at, Time.now)
27
27
 
28
28
  @product.variants_including_master.update_all(:deleted_at => Time.now)
29
29
 
@@ -5,7 +5,7 @@ module Spree
5
5
  before_filter :set_shipping_category, :only => [:create, :update]
6
6
 
7
7
  def destroy
8
- @object.update_attribute(:deleted_at, Time.now)
8
+ @object.touch :deleted_at
9
9
 
10
10
  flash.notice = flash_message_for(@object, :successfully_removed)
11
11
 
@@ -58,7 +58,7 @@ module Spree
58
58
  @taxon.move_to_right_of(new_siblings[new_position]) # we move down
59
59
  end
60
60
  # Reset legacy position, if any extensions still rely on it
61
- new_parent.children.reload.each{|t| t.update_attribute(:position, t.position)}
61
+ new_parent.children.reload.each{|t| t.update_column(:position, t.position)}
62
62
 
63
63
  if parent_id
64
64
  @taxon.reload
@@ -16,7 +16,7 @@ module Spree
16
16
 
17
17
  def cvv
18
18
  respond_with do |format|
19
- format.html { render 'cvv', :layout => false }
19
+ format.html { render :layout => false }
20
20
  end
21
21
  end
22
22
  end
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  class ProductsController < BaseController
3
- HTTP_REFERER_REGEXP = /^https?:\/\/[^\/]+\/t\/([a-z0-9\-\/]+)$/
4
3
  before_filter :load_product, :only => :show
5
4
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
6
5
  helper 'spree/taxons'
@@ -20,9 +19,11 @@ module Spree
20
19
  @product_properties = ProductProperty.includes(:property).where(:product_id => @product.id)
21
20
 
22
21
  referer = request.env['HTTP_REFERER']
23
-
24
- if referer && referer.match(HTTP_REFERER_REGEXP)
25
- @taxon = Taxon.find_by_permalink($1)
22
+ if referer
23
+ referer_path = URI.parse(request.env['HTTP_REFERER']).path
24
+ if referer_path && referer_path.match(/\/t\/(.*)/)
25
+ @taxon = Taxon.find_by_permalink($1)
26
+ end
26
27
  end
27
28
 
28
29
  respond_with(@product)
@@ -1,15 +1,6 @@
1
1
  module Spree
2
2
  module Admin
3
3
  module ProductsHelper
4
- def option_type_select(so)
5
- select(:new_variant,
6
- so.option_type.presentation,
7
- so.option_type.option_values.collect { |ov| [ ov.presentation, ov.id ] })
8
- end
9
-
10
- def pv_tag_id(product_value)
11
- "product-property-value-#{product_value.id}"
12
- end
13
4
  end
14
5
  end
15
6
  end
@@ -14,11 +14,24 @@ module Spree
14
14
 
15
15
  # converts line breaks in product description into <p> tags (for html display purposes)
16
16
  def product_description(product)
17
- raw(product.description.gsub(/(.*?)\n\n/m, '<p>\1</p>\n\n'))
17
+ raw(product.description.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>'))
18
18
  end
19
19
 
20
20
  def variant_images_hash(product)
21
21
  product.variant_images.inject({}) { |h, img| (h[img.viewable_id] ||= []) << img; h }
22
22
  end
23
+
24
+ def line_item_description(variant)
25
+ description = variant.product.description
26
+ if description.present?
27
+ truncate(strip_tags(description.gsub('&nbsp;', ' ')), :length => 100)
28
+ else
29
+ t(:product_has_no_description)
30
+ end
31
+ end
32
+
33
+ def get_taxonomies
34
+ @taxonomies ||= Spree::Taxonomy.includes(:root => :children)
35
+ end
23
36
  end
24
37
  end
@@ -9,6 +9,7 @@ module Spree
9
9
  taxon.descendants.each do |taxon|
10
10
  to_get = max - products.length
11
11
  products += taxon.active_products.limit(to_get)
12
+ products = products.uniq
12
13
  break if products.size >= max
13
14
  end
14
15
  end
@@ -44,7 +44,7 @@ module Spree
44
44
  end
45
45
 
46
46
  def zones
47
- Zone.match(self)
47
+ @zones ||= Zone.match(self)
48
48
  end
49
49
 
50
50
  def same_as?(other)
@@ -76,6 +76,7 @@ module Spree
76
76
  preference :s3_secret, :string
77
77
  preference :s3_headers, :string, :default => "{\"Cache-Control\":\"max-age=31557600\"}"
78
78
  preference :use_s3, :boolean, :default => false # Use S3 for images rather than the file system
79
+ preference :s3_protocol, :string
79
80
 
80
81
  # searcher_class allows spree extension writers to provide their own Search class
81
82
  def searcher_class
@@ -12,7 +12,7 @@ module Spree
12
12
  validates :verification_value, :presence => true, :unless => :has_payment_profile?, :on => :create
13
13
 
14
14
  attr_accessible :first_name, :last_name, :number, :verification_value, :year,
15
- :month, :gateway_customer_profile_id
15
+ :month, :gateway_customer_profile_id, :gateway_payment_profile_id
16
16
 
17
17
  scope :with_payment_profile, where('gateway_customer_profile_id IS NOT NULL')
18
18
 
@@ -21,6 +21,7 @@ module Spree
21
21
  Spree::Image.attachment_definitions[:attachment][:s3_credentials] = s3_creds
22
22
  Spree::Image.attachment_definitions[:attachment][:s3_headers] = ActiveSupport::JSON.decode(Spree::Config[:s3_headers])
23
23
  Spree::Image.attachment_definitions[:attachment][:bucket] = Spree::Config[:s3_bucket]
24
+ Spree::Image.attachment_definitions[:attachment][:s3_protocol] = Spree::Config[:s3_protocol] unless Spree::Config[:s3_protocol].blank?
24
25
  end
25
26
 
26
27
  Spree::Image.attachment_definitions[:attachment][:styles] = ActiveSupport::JSON.decode(Spree::Config[:attachment_styles])
@@ -15,7 +15,7 @@ module Spree
15
15
  validate :stock_availability
16
16
  validate :quantity_no_less_than_shipped
17
17
 
18
- attr_accessible :quantity
18
+ attr_accessible :quantity, :variant_id
19
19
 
20
20
  before_save :update_inventory
21
21
  before_destroy :ensure_not_shipped, :remove_inventory
@@ -383,10 +383,10 @@ module Spree
383
383
  # Finalizes an in progress order after checkout is complete.
384
384
  # Called after transition to complete state when payments will have been processed
385
385
  def finalize!
386
- update_attribute(:completed_at, Time.now)
386
+ touch :completed_at
387
387
  InventoryUnit.assign_opening_inventory(self)
388
388
  # lock any optional adjustments (coupon promotions, etc.)
389
- adjustments.optional.each { |adjustment| adjustment.update_attribute('locked', true) }
389
+ adjustments.optional.each { |adjustment| adjustment.update_column('locked', true) }
390
390
  deliver_order_confirmation_email
391
391
 
392
392
  self.state_changes.create({
@@ -35,7 +35,7 @@ module Spree
35
35
  end
36
36
 
37
37
  def destroy
38
- self.update_attribute(:deleted_at, Time.now.utc)
38
+ touch :deleted_at
39
39
  end
40
40
 
41
41
  def self.find_with_destroyed *args
@@ -60,7 +60,8 @@ module Spree
60
60
 
61
61
  def variant_images
62
62
  Image.joins("LEFT JOIN #{Variant.quoted_table_name} ON #{Variant.quoted_table_name}.id = #{Asset.quoted_table_name}.viewable_id").
63
- where("#{Variant.quoted_table_name}.product_id = #{self.id}").
63
+ where("(#{Asset.quoted_table_name}.viewable_type = ? AND #{Asset.quoted_table_name}.viewable_id = ?) OR
64
+ (#{Asset.quoted_table_name}.viewable_type = ? AND #{Asset.quoted_table_name}.viewable_id = ?)", Variant.name, self.master.id, Product.name, self.id).
64
65
  order("#{Asset.quoted_table_name}.position").
65
66
  extend(Spree::Core::RelationSerialization)
66
67
  end
@@ -34,17 +34,6 @@ module Spree
34
34
  joins(:variants_with_only_master).order("#{variant_table_name}.price DESC")
35
35
  end
36
36
 
37
- # Ryan Bates - http://railscasts.com/episodes/112
38
- # general merging of conditions, names following the searchlogic pattern
39
- add_search_scope :conditions do |*args|
40
- where(args)
41
- end
42
-
43
- # conditions_all is a more descriptively named enhancement of the above
44
- add_search_scope :conditions_all do |*args|
45
- where([args].flatten)
46
- end
47
-
48
37
  add_search_scope :price_between do |low, high|
49
38
  joins(:master).where(Variant.table_name => { :price => low..high })
50
39
  end
@@ -86,7 +86,7 @@ module Spree
86
86
  def update!(order)
87
87
  old_state = state
88
88
  new_state = determine_state(order)
89
- update_attribute_without_callbacks 'state', determine_state(order)
89
+ update_column 'state', new_state
90
90
  after_ship if new_state == 'shipped' and old_state != 'shipped'
91
91
  end
92
92
 
@@ -105,12 +105,6 @@ module Spree
105
105
  "#{I18n.t(:shipping)} (#{shipping_method.name})"
106
106
  end
107
107
 
108
- # def transition_order
109
- # update_attribute(:shipped_at, Time.now)
110
- # # transition order to shipped if all shipments have been shipped
111
- # order.ship! if order.shipments.all?(&:shipped?)
112
- # end
113
-
114
108
  def validate_shipping_method
115
109
  unless shipping_method.nil?
116
110
  errors.add :shipping_method, I18n.t(:is_not_available_to_shipment_address) unless shipping_method.zone.include?(address)
@@ -138,6 +132,11 @@ module Spree
138
132
 
139
133
  def after_ship
140
134
  inventory_units.each &:ship!
135
+ send_shipped_email
136
+ touch :shipped_at
137
+ end
138
+
139
+ def send_shipped_email
141
140
  ShipmentMailer.shipped_email(self).deliver
142
141
  end
143
142
 
@@ -14,7 +14,7 @@ module Spree
14
14
  #set existing default tax category to false if this one has been marked as default
15
15
 
16
16
  if is_default && tax_category = self.class.where(:is_default => true).first
17
- tax_category.update_attribute(:is_default, false) unless tax_category == self
17
+ tax_category.update_column(:is_default, false) unless tax_category == self
18
18
  end
19
19
  end
20
20
 
@@ -13,7 +13,7 @@ module Spree
13
13
  private
14
14
  def set_name
15
15
  if root
16
- root.update_attribute(:name, name)
16
+ root.update_column(:name, name)
17
17
  else
18
18
  self.root = Taxon.create!({ :taxonomy_id => id, :name => name }, :without_protection => true)
19
19
  end
@@ -3,7 +3,8 @@ module Spree
3
3
  attr_accessible :analytics_id, :environment, :active
4
4
 
5
5
  def self.current
6
- first(:conditions => { :active => true, :environment => Rails.env })
6
+ tracker = first(:conditions => { :active => true, :environment => Rails.env })
7
+ tracker.analytics_id.present? ? tracker : nil if tracker
7
8
  end
8
9
  end
9
10
  end
@@ -22,6 +22,7 @@ module Spree
22
22
  validates :count_on_hand, :numericality => true
23
23
 
24
24
  before_save :touch_product
25
+ after_save :recalculate_product_on_hand, :if => :is_master?
25
26
 
26
27
  # default variant scope only lists non-deleted variants
27
28
  scope :active, where(:deleted_at => nil)
@@ -166,6 +167,10 @@ module Spree
166
167
  def touch_product
167
168
  product.touch unless is_master?
168
169
  end
170
+
171
+ def recalculate_product_on_hand
172
+ product.update_column(:count_on_hand, product.on_hand)
173
+ end
169
174
  end
170
175
  end
171
176
 
@@ -14,13 +14,8 @@ module Spree
14
14
  attr_accessible :name, :description, :default_tax, :kind, :zone_members, :zone_members_attributes
15
15
 
16
16
  def kind
17
- member = members.last
18
-
19
- case member && member.zoneable_type
20
- when 'Spree::State' then 'state'
21
- else
22
- 'country'
23
- end
17
+ return nil if members.empty? || members.any? { |member| member.try(:zoneable_type).nil? }
18
+ members.last.zoneable_type.demodulize.downcase
24
19
  end
25
20
 
26
21
  def kind=(value)
@@ -46,7 +41,7 @@ module Spree
46
41
  # Returns the matching zone with the highest priority zone type (State, Country, Zone.)
47
42
  # Returns nil in the case of no matches.
48
43
  def self.match(address)
49
- return unless matches = self.order('created_at').select { |zone| zone.include? address }
44
+ return unless matches = self.includes(:zone_members).order('zone_members_count', 'created_at').select { |zone| zone.include? address }
50
45
 
51
46
  ['state', 'country'].each do |zone_kind|
52
47
  if match = matches.detect { |zone| zone_kind == zone.kind }
@@ -58,7 +53,7 @@ module Spree
58
53
 
59
54
  # convenience method for returning the countries contained within a zone
60
55
  def country_list
61
- members.map { |zone_member|
56
+ @countries ||= members.includes(:zoneable).map { |zone_member|
62
57
  case zone_member.zoneable_type
63
58
  when 'Spree::Country'
64
59
  zone_member.zoneable
@@ -111,9 +106,8 @@ module Spree
111
106
 
112
107
  def remove_previous_default
113
108
  return unless default_tax
114
-
115
109
  Zone.all.each do |zone|
116
- zone.update_attribute 'default_tax', false unless zone == self
110
+ zone.update_column 'default_tax', false unless zone == self
117
111
  end
118
112
  end
119
113
  end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class ZoneMember < ActiveRecord::Base
3
- belongs_to :zone, :class_name => "Spree::Zone"
3
+ belongs_to :zone, :class_name => "Spree::Zone", :counter_cache => true
4
4
  belongs_to :zoneable, :polymorphic => true
5
5
 
6
6
  attr_accessible :zone, :zone_id, :zoneable, :zoneable_id, :zoneable_type
@@ -71,6 +71,13 @@
71
71
  </label>
72
72
  </p>
73
73
 
74
+ <p data-hook="s3_protocol">
75
+ <label>
76
+ <%= label_tag 'preferences[s3_protocol]', t(:s3_protocol) %>
77
+ <%= preference_field_tag 'preferences[s3_protocol]', Spree::Config[:s3_protocol], :type => :string %>
78
+ </label>
79
+ </p>
80
+
74
81
  <h2><%= t(:s3_headers) %></h2>
75
82
  <ul id="headers_list">
76
83
  <% @headers.each do |header_name, header_value| %>
@@ -12,6 +12,7 @@
12
12
  <th><%= t(:action) %></th>
13
13
  </tr>
14
14
 
15
+ <tbody>
15
16
  <% @product.images.each do |image| %>
16
17
  <tr id="<%= spree_dom_id image %>" data-hook="images_row">
17
18
  <td>
@@ -46,6 +47,7 @@
46
47
  </tr>
47
48
  <% end %>
48
49
  <% end %>
50
+ </tbody>
49
51
  </table>
50
52
 
51
53
  <div id="images" data-hook></div>
@@ -19,6 +19,7 @@
19
19
  <th><%= t(:presentation) %></th>
20
20
  <th></th>
21
21
  </tr>
22
+ <tbody>
22
23
  <% @option_types.each do |option_type| %>
23
24
  <tr class="spree_option_type" id="<%= spree_dom_id option_type %>" data-hook="option_row">
24
25
  <td><span class="handle"></span> <%= option_type.name %></td>
@@ -30,4 +31,5 @@
30
31
  </td>
31
32
  </tr>
32
33
  <% end %>
34
+ </tbody>
33
35
  </table>
@@ -2,7 +2,7 @@
2
2
  <%= csrf_meta_tags %>
3
3
 
4
4
  <% if @order.cart? %>
5
- <div id="add-line-item" data-hook>
5
+ <div id="customer-search" data-hook>
6
6
  <fieldset>
7
7
  <legend><%= t(:customer_search) %></legend>
8
8
  <%= label_tag :customer_search, t(:enter_at_least_five_letters) %>
@@ -7,16 +7,19 @@
7
7
  <%= javascript_include_tag 'admin/all' %>
8
8
 
9
9
  <%= javascript_tag do %>
10
- Spree.routes = <%== {
10
+ var Spree = {
11
+ routes: <%== {
11
12
  :product_search => spree.admin_products_path(:format => 'json'),
12
13
  :product_search_basic => spree.admin_products_path(:format => 'json', :json_format => 'basic', :limit => 10),
13
14
  :user_search => spree.admin_users_path(:format => 'json', :limit => 10)
14
- }.to_json %>;
15
+ }.to_json %>,
15
16
 
16
- strings = <%==
17
- [:no_results, :type_to_search, :searching].
18
- inject({}){|memo, item| {item => t(item) }}.to_json
19
- %>
17
+ strings: {
18
+ no_results: '<%== t(:no_results) %>',
19
+ type_to_search: '<%== t(:type_to_search) %>',
20
+ searching: '<%== t(:searching) %>'
21
+ }
22
+ }
20
23
  <% end %>
21
24
 
22
25
  <%= javascript_tag do -%>
@@ -13,6 +13,7 @@
13
13
  <th><%= t(:on_hand) %></th>
14
14
  <th><%= t(:action) %></th>
15
15
  </tr>
16
+ <tbody>
16
17
  <% @variants.each do |variant| %>
17
18
  <!-- you can skip variant with no options: that's just the default variant that all products have -->
18
19
  <% next if variant.option_values.empty? %>
@@ -34,6 +35,7 @@
34
35
  <% unless @product.has_variants? %>
35
36
  <tr><td colspan="9"><%= t(:none) %></td></tr>
36
37
  <% end %>
38
+ </tbody>
37
39
  </table>
38
40
 
39
41
  <% if @product.empty_option_values? %>
@@ -42,9 +42,6 @@
42
42
  <p class="field" id="bstate">
43
43
  <% have_states = !@order.bill_address.country.states.empty? %>
44
44
  <%= bill_form.label :state, t(:state) %><span class="required">*</span><br />
45
- <noscript>
46
- <%= bill_form.text_field :state_name, :class => 'required' %>
47
- </noscript>
48
45
  <% state_elements = [
49
46
  bill_form.collection_select(:state_id, @order.bill_address.country.states,
50
47
  :id, :name,
@@ -60,6 +57,9 @@
60
57
  document.write("<%== state_elements %>");
61
58
  <% end -%>
62
59
  </p>
60
+ <noscript>
61
+ <%= bill_form.text_field :state_name, :class => 'required' %>
62
+ </noscript>
63
63
  <% end %>
64
64
 
65
65
  <p class="field" id="bzipcode">
@@ -129,9 +129,6 @@
129
129
  <p class="field" id="sstate">
130
130
  <% have_states = !@order.ship_address.country.states.empty? %>
131
131
  <%= ship_form.label :state, t(:state) %><span class="required">*</span><br />
132
- <noscript>
133
- <%= ship_form.text_field :state_name, :class => 'required' %>
134
- </noscript>
135
132
  <% state_elements = [
136
133
  ship_form.collection_select(:state_id, @order.ship_address.country.states,
137
134
  :id, :name,
@@ -147,6 +144,9 @@
147
144
  document.write("<%== state_elements %>");
148
145
  <% end %>
149
146
  </p>
147
+ <noscript>
148
+ <%= ship_form.text_field :state_name, :class => 'required' %>
149
+ </noscript>
150
150
  <% end %>
151
151
 
152
152
  <p class="field" id="szipcode">
@@ -6,20 +6,20 @@
6
6
  <!--[if IE 9 ]> <html class="ie ie9" lang="en"> <![endif]-->
7
7
  <!--[if gt IE 9]><!--><html lang="en"><!--<![endif]-->
8
8
 
9
-
9
+
10
10
  <head data-hook="inside_head">
11
11
  <%= render :partial => 'spree/shared/head' %>
12
12
  </head>
13
13
 
14
14
  <body class="<%= body_class %>" id="<%= @body_id || 'default' %>" data-hook="body">
15
-
15
+
16
16
  <div class="container">
17
17
 
18
18
  <header id="header" class="row" data-hook>
19
-
19
+
20
20
  <figure id="logo" class="columns alpha six" data-hook>
21
21
  <%= logo %>
22
- </figure>
22
+ </figure>
23
23
 
24
24
  <nav id="top-nav-bar" class="columns omega ten">
25
25
  <ul id="nav-bar" class="inline" data-hook>
@@ -29,16 +29,16 @@
29
29
 
30
30
  <% if store_menu? %>
31
31
  <nav class="columns alpha omega sixteen">
32
- <ul id="main-nav-bar" class="inline" data-hook>
32
+ <ul id="main-nav-bar" class="inline" data-hook>
33
33
  <%= render :partial => 'spree/shared/store_menu' %>
34
34
  </ul>
35
35
  </nav>
36
36
  <% end %>
37
-
37
+
38
38
  </header>
39
39
 
40
40
  <div id="wrapper" class="row" data-hook>
41
-
41
+
42
42
  <% if content_for?(:sidebar) %>
43
43
  <aside id="sidebar" class="columns alpha four" data-hook>
44
44
  <%= yield :sidebar %>
@@ -14,7 +14,7 @@
14
14
  <%= variant.in_stock? ? t(:insufficient_stock, :on_hand => variant.on_hand) : t(:out_of_stock) %><br />
15
15
  </span>
16
16
  <% end %>
17
- <%= truncate(variant.product.description.gsub(/<(.*?)>/,""), :length => 100, :omission => "...") %>
17
+ <%= line_item_description(variant) %>
18
18
  </td>
19
19
  <td class="cart-item-price" data-hook="cart_item_price">
20
20
  <%= number_to_currency line_item.price %>
@@ -1,38 +1,38 @@
1
1
  <% if tracker = Spree::Tracker.current %>
2
2
 
3
- <%= javascript_tag do -%>
3
+ <%= javascript_tag do %>
4
4
  var _gaq = _gaq || [];
5
- _gaq.push(['_setAccount', '<%= tracker.analytics_id -%>']);
5
+ _gaq.push(['_setAccount', '<%= tracker.analytics_id %>']);
6
6
  _gaq.push(['_trackPageview']);
7
7
 
8
+ <% if flash[:commerce_tracking] %>
9
+ <%# report e-commerce transaction information when applicable %>
10
+ _gaq.push(['_addTrans',
11
+ "<%= @order.number %>", <%# Order Number %>
12
+ "", <%# Affiliation %>
13
+ "<%= @order.total %>", <%# Order total %>
14
+ "<%= @order.adjustments.tax.sum(:amount) %>", <%# Tax Amount %>
15
+ "<%= @order.adjustments.shipping.sum(:amount) %>",<%# Ship Amount %>
16
+ "", <%# City %>
17
+ "", <%# State %>
18
+ "" <%# Country %>
19
+ ]);
20
+ <% @order.line_items.each do |line_item| %>
21
+ _gaq.push(['_addItem',
22
+ "<%= @order.number %>", <%# order ID - required %>
23
+ "<%= line_item.variant.sku %>", <%# SKU/code - required %>
24
+ "<%= line_item.variant.product.name %>",<%# product name %>
25
+ "", <%# category or variation, Product Category %>
26
+ "<%= line_item.price %>", <%# unit price - required %>
27
+ "<%= line_item.quantity %>" <%# quantity - required %>
28
+ ]);
29
+ <% end %>
30
+ <% end %>
31
+
8
32
  (function() {
9
33
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
10
34
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
11
35
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
12
36
  })();
13
- <% end -%>
14
-
15
- <% if flash[:commerce_tracking] %>
16
-
17
- <%= javascript_tag do -%>
18
- // report e-commerce transaction information when applicable
19
- pageTracker._addTrans(
20
- "<%= @order.number %>", //Order Number
21
- "", //Affiliation
22
- "<%= @order.total %>", //Order total
23
- "<%= @order.adjustments.tax.sum(:amount).to_s %>", //Tax Amount
24
- "<%= @order.adjustments.shipping.sum(:amount).to_s %>", //Ship Amount
25
- "", //City
26
- "", //State
27
- "" //Country
28
- );
29
- <% @order.line_items.each do |line_item| %>
30
- pageTracker._addItem("<%= @order.number %>", "<%= line_item.variant.sku %>", "<%= line_item.variant.product.name %>",
31
- "" /*Product Category*/, "<%= line_item.price %>", "<%= line_item.quantity %>");
32
- <% end %>
33
- pageTracker._trackTrans();
34
- <% end -%>
35
-
36
37
  <% end %>
37
-
38
- <% end %>
38
+ <% end %>
@@ -7,11 +7,11 @@
7
7
  </div>
8
8
  <% end %>
9
9
 
10
- <% if @taxon.children.empty? || !params[:keywords].blank? %>
11
- <div data-hook="taxon_products">
12
- <%= render :partial => 'spree/shared/products', :locals => { :products => @products, :taxon => @taxon } %>
13
- </div>
14
- <% else %>
10
+ <div data-hook="taxon_products">
11
+ <%= render :partial => 'spree/shared/products', :locals => { :products => @products, :taxon => @taxon } %>
12
+ </div>
13
+
14
+ <% unless params[:keyword].present? %>
15
15
  <div data-hook="taxon_children">
16
16
  <%= render :partial => 'taxon', :collection => @taxon.children %>
17
17
  </div>
@@ -858,6 +858,7 @@ en:
858
858
  s3_bucket: "Bucket"
859
859
  s3_headers: "S3 Headers"
860
860
  s3_secret: "Secret Key"
861
+ s3_protocol: "S3 Protocol"
861
862
  s3_used_for_product_images: "S3 is being used for product images"
862
863
  s3_not_used_for_product_images: "S3 is not being used for product images"
863
864
  sales_tax: "Sales Tax"
data/config/routes.rb CHANGED
@@ -40,13 +40,8 @@ Spree::Core::Engine.routes.draw do
40
40
  end
41
41
  end
42
42
 
43
- # # route globbing for pretty nested taxon and product paths
43
+ # route globbing for pretty nested taxon and product paths
44
44
  match '/t/*id', :to => 'taxons#show', :as => :nested_taxons
45
- #
46
- # #moved old taxons route to after nested_taxons so nested_taxons will be default route
47
- # #this route maybe removed in the near future (no longer used by core)
48
- # map.resources :taxons
49
- #
50
45
 
51
46
  namespace :admin do
52
47
  resources :adjustments
@@ -195,6 +190,6 @@ Spree::Core::Engine.routes.draw do
195
190
 
196
191
  match '/admin', :to => 'admin/orders#index', :as => :admin
197
192
 
198
- match '/content/cvv', :to => 'content#cvv'
193
+ match '/content/cvv', :to => 'content#cvv', :as => :cvv
199
194
  match '/content/*path', :to => 'content#show', :via => :get, :as => :content
200
195
  end
@@ -16,7 +16,7 @@ class AddCountOnHandToVariantsAndProducts < ActiveRecord::Migration
16
16
 
17
17
  say_with_time 'Transfering inventory units with status on_hand to variants table...' do
18
18
  Spree::Variant.all.each do |v|
19
- v.update_attribute(:count_on_hand, v.inventory_units.with_state('on_hand').size)
19
+ v.update_column(:count_on_hand, v.inventory_units.with_state('on_hand').size)
20
20
  Spree::InventoryUnit.destroy_all(:variant_id => v.id, :state => 'on_hand')
21
21
  end
22
22
  end
@@ -26,7 +26,7 @@ class AddCountOnHandToVariantsAndProducts < ActiveRecord::Migration
26
26
  product_count_on_hand = p.has_variants? ?
27
27
  p.variants.inject(0) { |acc, v| acc + v.count_on_hand } :
28
28
  (p.master ? p.master.count_on_hand : 0)
29
- p.update_attribute(:count_on_hand, product_count_on_hand)
29
+ p.update_column(:count_on_hand, product_count_on_hand)
30
30
  end
31
31
  end
32
32
 
@@ -15,7 +15,7 @@ class AddOpenidFieldToUsers < ActiveRecord::Migration
15
15
  Spree::User.table_name = 'users'
16
16
 
17
17
  [:login, :crypted_password, :salt].each do |field|
18
- Spree::User.where(field => nil).each { |user| user.update_attribute(field, '') if user.send(field).nil? }
18
+ Spree::User.where(field => nil).each { |user| user.update_column(field, '') if user.send(field).nil? }
19
19
  change_column :users, field, :string, :default => '', :null => false
20
20
  end
21
21
 
@@ -12,7 +12,7 @@ class ChargeRefactoring < ActiveRecord::Migration
12
12
 
13
13
  add_column :orders, :completed_at, :timestamp
14
14
  Order.reset_column_information
15
- Order.all.each { |o| o.update_attribute(:completed_at, o.checkout && o.checkout.read_attribute(:completed_at)) }
15
+ Order.all.each { |o| o.update_column(:completed_at, o.checkout && o.checkout.read_attribute(:completed_at)) }
16
16
  remove_column :checkouts, :completed_at
17
17
 
18
18
  change_column :adjustments, :amount, :decimal, :null => true, :default => nil, :precision => 8, :scale => 2
@@ -27,7 +27,7 @@ class ChargeRefactoring < ActiveRecord::Migration
27
27
  def down
28
28
  add_column :checkouts, :completed_at, :timestamp
29
29
  Spree::Checkout.reset_column_information
30
- Spree::Checkout.all.each { |c| c.update_attribute(:completed_at, c.order && c.order.completed_at) }
30
+ Spree::Checkout.all.each { |c| c.update_column(:completed_at, c.order && c.order.completed_at) }
31
31
  remove_column :orders, :completed_at
32
32
 
33
33
  add_column :adjustments, :secondary_type, :string
@@ -12,7 +12,7 @@ class ShipmentIdForInventoryUnits < ActiveRecord::Migration
12
12
  next
13
13
  end
14
14
  shipment.order.inventory_units.each do |unit|
15
- unit.update_attribute('shipment_id', shipment.id)
15
+ unit.update_column('shipment_id', shipment.id)
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,14 @@
1
+ class AddCounterCacheToZoneMembers < ActiveRecord::Migration
2
+ def up
3
+ add_column :spree_zones, :zone_members_count, :integer, :default => 0
4
+
5
+ Spree::Zone.reset_column_information
6
+ Spree::Zone.find(:all).each do |zone|
7
+ Spree::Zone.update_counters zone.id, :zone_members_count => zone.zone_members.length
8
+ end
9
+ end
10
+
11
+ def down
12
+ remove_column :spree_zones, :zone_members_count
13
+ end
14
+ end
@@ -5,7 +5,6 @@ module Spree
5
5
  receiver.send :layout, :get_layout
6
6
  receiver.send :before_filter, 'instantiate_controller_and_action_names'
7
7
  receiver.send :before_filter, 'set_user_language'
8
-
9
8
  receiver.send :helper_method, 'title'
10
9
  receiver.send :helper_method, 'title='
11
10
  receiver.send :helper_method, 'accurate_title'
@@ -78,10 +77,6 @@ module Spree
78
77
  @current_controller = controller_name
79
78
  end
80
79
 
81
- def get_taxonomies
82
- @taxonomies ||= Taxonomy.includes(:root => :children).joins(:root)
83
- end
84
-
85
80
  def associate_user
86
81
  return unless current_user and current_order
87
82
  current_order.associate_user!(current_user)
@@ -16,7 +16,7 @@ module Spree
16
16
  end
17
17
 
18
18
  if mail_method.preferred_mail_bcc.present?
19
- message.bcc = mail_method.preferred_mail_bcc
19
+ message.bcc ||= mail_method.preferred_mail_bcc
20
20
  end
21
21
  end
22
22
 
@@ -47,8 +47,8 @@ module Spree
47
47
  permalink_value = self.to_param
48
48
  field = self.class.permalink_field
49
49
  # Do other links exist with this permalink?
50
- other = self.class.all(:conditions => "#{field} LIKE '#{permalink_value}%'")
51
- unless other.empty?
50
+ other = self.class.where("#{field} LIKE ?", "#{permalink_value}%")
51
+ if other.any?
52
52
  # Find the existing permalink with the highest number, and increment that number.
53
53
  # (If none of the existing permalinks have a number, this will evaluate to 1.)
54
54
  number = other.map { |o| o.send(field)[/-(\d+)$/, 1].to_i }.max + 1
@@ -1,8 +1,6 @@
1
1
  FactoryGirl.define do
2
- sequence(:product_sequence) { |n| "Product ##{n} - #{rand(9999)}" }
3
-
4
2
  factory :simple_product, :class => Spree::Product do
5
- name { FactoryGirl.generate :product_sequence }
3
+ sequence(:name) { |n| "Product ##{n} - #{rand(9999)}" }
6
4
  description { Faker::Lorem.paragraphs(1 + Kernel.rand(5)).join("\n") }
7
5
  price 19.99
8
6
  cost_price 17.00
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "1.1.2"
3
+ "1.1.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-05 00:00:00.000000000 Z
12
+ date: 2012-07-27 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: acts_as_list
16
- requirement: &70163167995040 !ruby/object:Gem::Requirement
16
+ requirement: &70251996737660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.1.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70163167995040
24
+ version_requirements: *70251996737660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nested_set
27
- requirement: &70163167992340 !ruby/object:Gem::Requirement
27
+ requirement: &70251996735520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.7.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70163167992340
35
+ version_requirements: *70251996735520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: jquery-rails
38
- requirement: &70163167989400 !ruby/object:Gem::Requirement
38
+ requirement: &70251996380040 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.0.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70163167989400
46
+ version_requirements: *70251996380040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: highline
49
- requirement: &70163168002860 !ruby/object:Gem::Requirement
49
+ requirement: &70251996377420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.11
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70163168002860
57
+ version_requirements: *70251996377420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: state_machine
60
- requirement: &70163167999340 !ruby/object:Gem::Requirement
60
+ requirement: &70251996375460 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70163167999340
68
+ version_requirements: *70251996375460
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ffaker
71
- requirement: &70163167996220 !ruby/object:Gem::Requirement
71
+ requirement: &70251996373560 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.12.0
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70163167996220
79
+ version_requirements: *70251996373560
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: paperclip
82
- requirement: &70163168010080 !ruby/object:Gem::Requirement
82
+ requirement: &70251996372140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.7'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70163168010080
90
+ version_requirements: *70251996372140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: aws-sdk
93
- requirement: &70163168007600 !ruby/object:Gem::Requirement
93
+ requirement: &70251996370680 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.3.4
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70163168007600
101
+ version_requirements: *70251996370680
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ransack
104
- requirement: &70163168005980 !ruby/object:Gem::Requirement
104
+ requirement: &70251996369560 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.6.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70163168005980
112
+ version_requirements: *70251996369560
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: activemerchant
115
- requirement: &70163168019780 !ruby/object:Gem::Requirement
115
+ requirement: &70251996368240 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - =
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.20.4
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70163168019780
123
+ version_requirements: *70251996368240
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rails
126
- requirement: &70163168017400 !ruby/object:Gem::Requirement
126
+ requirement: &70251996367220 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 3.2.6
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70163168017400
134
+ version_requirements: *70251996367220
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: kaminari
137
- requirement: &70163168015260 !ruby/object:Gem::Requirement
137
+ requirement: &70251996365100 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 0.13.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70163168015260
145
+ version_requirements: *70251996365100
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: deface
148
- requirement: &70163168013540 !ruby/object:Gem::Requirement
148
+ requirement: &70251996351260 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.9.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *70163168013540
156
+ version_requirements: *70251996351260
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: stringex
159
- requirement: &70163168012340 !ruby/object:Gem::Requirement
159
+ requirement: &70251996338660 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,7 +164,7 @@ dependencies:
164
164
  version: 1.3.2
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *70163168012340
167
+ version_requirements: *70251996338660
168
168
  description: Required dependency for Spree
169
169
  email: sean@spreecommerce.com
170
170
  executables: []
@@ -872,6 +872,7 @@ files:
872
872
  - db/migrate/20120523061241_convert_sales_tax_to_default_tax.rb
873
873
  - db/migrate/20120604030249_add_deleted_at_to_spree_shipping_methods.rb
874
874
  - db/migrate/20120605211305_make_users_email_index_unique.rb
875
+ - db/migrate/20120712172620_add_counter_cache_to_zone_members.rb
875
876
  - db/sample/users.rb
876
877
  - db/seeds.rb
877
878
  - vendor/assets/images/datepicker/cal.gif
@@ -972,7 +973,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
972
973
  version: '0'
973
974
  segments:
974
975
  - 0
975
- hash: 3949392994446669213
976
+ hash: 173937272433649960
976
977
  requirements:
977
978
  - none
978
979
  rubyforge_project: spree_core