From e5791b001acafb064f6cd78ba4dfe6cefb1f5415 Mon Sep 17 00:00:00 2001 From: Keitaroh Kobayashi Date: Thu, 29 Aug 2013 11:10:11 +0900 Subject: [PATCH 1/4] database_cleaner seems to be broken on version 1.1.0 Discussion: https://github.com/bmabey/database_cleaner/issues/224 --- spree_export.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spree_export.gemspec b/spree_export.gemspec index 27ace96..d7e2b3f 100644 --- a/spree_export.gemspec +++ b/spree_export.gemspec @@ -20,7 +20,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'capybara', '~> 2.1' s.add_development_dependency 'coffee-rails' - s.add_development_dependency 'database_cleaner' + s.add_development_dependency 'database_cleaner', '< 1.1.0' s.add_development_dependency 'factory_girl', '~> 4.2' s.add_development_dependency 'ffaker' s.add_development_dependency 'rspec-rails', '~> 2.13' From 25527f0c1df6b44cbc9aeea67a1d5885d8fcb285 Mon Sep 17 00:00:00 2001 From: Keitaroh Kobayashi Date: Thu, 29 Aug 2013 11:14:14 +0900 Subject: [PATCH 2/4] appropriate filenames for the CSV downloads --- app/controllers/spree/admin/base_controller_decorator.rb | 9 +++++++++ .../spree/admin/orders_controller_decorator.rb | 2 +- .../spree/admin/users_controller_decorator.rb | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 app/controllers/spree/admin/base_controller_decorator.rb diff --git a/app/controllers/spree/admin/base_controller_decorator.rb b/app/controllers/spree/admin/base_controller_decorator.rb new file mode 100644 index 0000000..821d4d7 --- /dev/null +++ b/app/controllers/spree/admin/base_controller_decorator.rb @@ -0,0 +1,9 @@ +Spree::Admin::BaseController.class_eval do + def csv_filename args + args = {:name => 'report'}.merge(args) + fmt = '%Y-%m-%d' + parts = [args[:name]] + [:date_start, :date_end].each { |k| parts << args[k].strftime(fmt) if args.has_key?(k) } + parts.join('_') + '.csv' + end +end diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index 6eed8a9..58f85fb 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -4,6 +4,6 @@ def export_csv created_at_lt = Time.zone.parse(params[:created_at_lt]).end_of_day rescue "" @orders = Spree::Order.paid_and_ready_to_ship.completed_between(created_at_gt, created_at_lt).order("created_at") - send_data @orders.export_csv + send_data @orders.export_csv, :filename => csv_filename(:name => 'orders', :date_start => created_at_gt, :date_end => created_at_lt) end end diff --git a/app/controllers/spree/admin/users_controller_decorator.rb b/app/controllers/spree/admin/users_controller_decorator.rb index 5886f84..0da0007 100644 --- a/app/controllers/spree/admin/users_controller_decorator.rb +++ b/app/controllers/spree/admin/users_controller_decorator.rb @@ -1,6 +1,6 @@ Spree::Admin::UsersController.class_eval do def export_csv @users = Spree::User.order("created_at") - send_data @users.export_csv + send_data @users.export_csv, :filename => csv_filename(:name => 'users', :date_end => Time.now) end end From a1ee802e2ecb561c6bcfc83f13dc68a547cd1277 Mon Sep 17 00:00:00 2001 From: Keitaroh Kobayashi Date: Thu, 29 Aug 2013 11:49:43 +0900 Subject: [PATCH 3/4] CSV options and explicit output encoding --- .../spree/admin/orders_controller_decorator.rb | 2 +- .../spree/admin/users_controller_decorator.rb | 2 +- app/models/spree/order_decorator.rb | 2 ++ app/models/spree/user_decorator.rb | 2 ++ .../spree_export/install/install_generator.rb | 13 +++++++++++++ lib/spree_export.rb | 14 ++++++++++++++ 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/controllers/spree/admin/orders_controller_decorator.rb b/app/controllers/spree/admin/orders_controller_decorator.rb index 58f85fb..6feefe3 100644 --- a/app/controllers/spree/admin/orders_controller_decorator.rb +++ b/app/controllers/spree/admin/orders_controller_decorator.rb @@ -4,6 +4,6 @@ def export_csv created_at_lt = Time.zone.parse(params[:created_at_lt]).end_of_day rescue "" @orders = Spree::Order.paid_and_ready_to_ship.completed_between(created_at_gt, created_at_lt).order("created_at") - send_data @orders.export_csv, :filename => csv_filename(:name => 'orders', :date_start => created_at_gt, :date_end => created_at_lt) + send_data @orders.export_csv.encode(SpreeExport.output_encoding, :invalid => :replace, :replace => '?'), :filename => csv_filename(:name => 'orders', :date_start => created_at_gt, :date_end => created_at_lt) end end diff --git a/app/controllers/spree/admin/users_controller_decorator.rb b/app/controllers/spree/admin/users_controller_decorator.rb index 0da0007..ab06683 100644 --- a/app/controllers/spree/admin/users_controller_decorator.rb +++ b/app/controllers/spree/admin/users_controller_decorator.rb @@ -1,6 +1,6 @@ Spree::Admin::UsersController.class_eval do def export_csv @users = Spree::User.order("created_at") - send_data @users.export_csv, :filename => csv_filename(:name => 'users', :date_end => Time.now) + send_data @users.export_csv.encode(SpreeExport.output_encoding, :invalid => :replace, :replace => '?'), :filename => csv_filename(:name => 'users', :date_end => Time.now) end end diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 2c56230..9f22510 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -10,6 +10,8 @@ def self.paid_and_ready_to_ship end def self.export_csv(options = {}) + options = SpreeExport.csv_options.merge options + CSV.generate(options) do |csv| address_column_names = ["firstname", "lastname", "address1", "address2", "city", "zipcode", "phone", "state_name", "alternative_phone", "company"] order_column_names = ["id", "number", "total", "state", "shipment_state", "email", "user_id", "completed_at", "payment_state", "special_instructions"] diff --git a/app/models/spree/user_decorator.rb b/app/models/spree/user_decorator.rb index d59767b..ebbfe59 100644 --- a/app/models/spree/user_decorator.rb +++ b/app/models/spree/user_decorator.rb @@ -2,6 +2,8 @@ Spree::User.instance_eval do def self.export_csv(options = {}) + options = SpreeExport.csv_options.merge options + CSV.generate(options) do |csv| user_column_names = ["id", "email", "login"] column_headers = user_column_names diff --git a/lib/generators/spree_export/install/install_generator.rb b/lib/generators/spree_export/install/install_generator.rb index 41f182b..fb29433 100644 --- a/lib/generators/spree_export/install/install_generator.rb +++ b/lib/generators/spree_export/install/install_generator.rb @@ -14,6 +14,19 @@ def add_stylesheets inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_export\n", :before => /\*\//, :verbose => true end + def create_initializer + create_file 'config/initializers/spree_export.rb' do + string = <<-RUBY.gsub /^ {12}/, '' + # config/initializers/spree_export.rb + + SpreeExport.config do |config| + config.csv_options = {} + config.output_encoding = Encoding::UTF_8 + end + RUBY + end + end + def add_migrations run 'bundle exec rake railties:install:migrations FROM=spree_export' end diff --git a/lib/spree_export.rb b/lib/spree_export.rb index dea5dec..f01dad8 100644 --- a/lib/spree_export.rb +++ b/lib/spree_export.rb @@ -1,2 +1,16 @@ require 'spree_core' require 'spree_export/engine' + +module SpreeExport + + mattr_accessor :csv_options + self.csv_options = {} + + mattr_accessor :output_encoding + self.output_encoding = Encoding::UTF_8 + + def self.config &block + yield(self) + end + +end From 348b7f20ddddb5c131bfb948dadb4a2618b73c80 Mon Sep 17 00:00:00 2001 From: Keitaroh Kobayashi Date: Thu, 29 Aug 2013 13:49:56 +0900 Subject: [PATCH 4/4] support for custom blocks to generate custom CSV content --- app/models/spree/order_decorator.rb | 20 +++++++++++++------- app/models/spree/user_decorator.rb | 16 ++++++++++------ lib/spree_export.rb | 3 +++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb index 9f22510..d6c60f5 100644 --- a/app/models/spree/order_decorator.rb +++ b/app/models/spree/order_decorator.rb @@ -13,13 +13,19 @@ def self.export_csv(options = {}) options = SpreeExport.csv_options.merge options CSV.generate(options) do |csv| - address_column_names = ["firstname", "lastname", "address1", "address2", "city", "zipcode", "phone", "state_name", "alternative_phone", "company"] - order_column_names = ["id", "number", "total", "state", "shipment_state", "email", "user_id", "completed_at", "payment_state", "special_instructions"] - column_headers = order_column_names + address_column_names - csv << column_headers - all.each do |order| - values = order.attributes.values_at(*order_column_names) + order.ship_address.attributes.values_at(*address_column_names) - csv << values + + if SpreeExport.order_csv_block.nil? + + address_column_names = ["firstname", "lastname", "address1", "address2", "city", "zipcode", "phone", "state_name", "alternative_phone", "company"] + order_column_names = ["id", "number", "total", "state", "shipment_state", "email", "user_id", "completed_at", "payment_state", "special_instructions"] + column_headers = order_column_names + address_column_names + csv << column_headers + all.each do |order| + values = order.attributes.values_at(*order_column_names) + order.ship_address.attributes.values_at(*address_column_names) + csv << values + end + else + SpreeExport.order_csv_block.call csv, all end end end diff --git a/app/models/spree/user_decorator.rb b/app/models/spree/user_decorator.rb index ebbfe59..c4b5458 100644 --- a/app/models/spree/user_decorator.rb +++ b/app/models/spree/user_decorator.rb @@ -5,12 +5,16 @@ def self.export_csv(options = {}) options = SpreeExport.csv_options.merge options CSV.generate(options) do |csv| - user_column_names = ["id", "email", "login"] - column_headers = user_column_names - csv << column_headers - all.each do |user| - values = user.attributes.values_at(*user_column_names) - csv << values + if SpreeExport.user_csv_block.nil? + user_column_names = ["id", "email", "login"] + column_headers = user_column_names + csv << column_headers + all.each do |user| + values = user.attributes.values_at(*user_column_names) + csv << values + end + else + SpreeExport.user_csv_block.call csv, all end end end diff --git a/lib/spree_export.rb b/lib/spree_export.rb index f01dad8..53a4705 100644 --- a/lib/spree_export.rb +++ b/lib/spree_export.rb @@ -9,6 +9,9 @@ module SpreeExport mattr_accessor :output_encoding self.output_encoding = Encoding::UTF_8 + mattr_accessor :order_csv_block + mattr_accessor :user_csv_block + def self.config &block yield(self) end