From 67e4c90db990fb726267ecc24d47eae4d8527765 Mon Sep 17 00:00:00 2001 From: baptou12 Date: Sun, 13 Nov 2016 19:36:56 +0100 Subject: [PATCH 01/11] Linter --- app/models/csv_db.rb | 10 ++++--- app/views/admin/csv/upload_csv.html.erb | 37 +++++++++++-------------- lib/active_admin_importable/dsl.rb | 4 +-- lib/active_admin_importable/engine.rb | 4 +-- lib/active_admin_importable/version.rb | 2 +- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/app/models/csv_db.rb b/app/models/csv_db.rb index f15b4d1..b18da65 100644 --- a/app/models/csv_db.rb +++ b/app/models/csv_db.rb @@ -1,18 +1,20 @@ require 'csv' + class CsvDb class << self def convert_save(target_model, csv_data, &block) csv_file = csv_data.read + CSV.parse(csv_file, :headers => true, header_converters: :symbol ) do |row| data = row.to_hash if data.present? if (block_given?) block.call(target_model, data) - else + else target_model.create!(data) - end - end + end + end end end end -end \ No newline at end of file +end diff --git a/app/views/admin/csv/upload_csv.html.erb b/app/views/admin/csv/upload_csv.html.erb index 97a9659..80259b5 100644 --- a/app/views/admin/csv/upload_csv.html.erb +++ b/app/views/admin/csv/upload_csv.html.erb @@ -1,22 +1,17 @@ -<%= form_for :dump, :url => {:action => "import_csv"}, :html => {:multipart => true} do |f| %> - - - - - - + + + + +
- <%= label_tag "dump_file", "Select a CSV File" %> - - <%= f.file_field :file %> +<%= form_for :dump, :url => {:action => 'import_csv'}, :html => {:multipart => true} do |f| %> + + + - - - - - -
+ <%= label_tag 'dump_file', 'Select a CSV File' %>
- <%= submit_tag 'Submit' %> -
- - -<% end %> \ No newline at end of file +
+ <%= f.file_field :file %> +
+ <%= submit_tag 'Submit' %> +
+<% end %> diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index ea79938..9358447 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -6,7 +6,7 @@ def active_admin_importable(&block) end collection_action :upload_csv do - render "admin/csv/upload_csv" + render 'admin/csv/upload_csv' end collection_action :import_csv, :method => :post do @@ -15,4 +15,4 @@ def active_admin_importable(&block) end end end -end \ No newline at end of file +end diff --git a/lib/active_admin_importable/engine.rb b/lib/active_admin_importable/engine.rb index 05f9246..24a8dd5 100644 --- a/lib/active_admin_importable/engine.rb +++ b/lib/active_admin_importable/engine.rb @@ -3,8 +3,6 @@ module ActiveAdminImportable class Engine < Rails::Engine - config.mount_at = '/' - end -end \ No newline at end of file +end diff --git a/lib/active_admin_importable/version.rb b/lib/active_admin_importable/version.rb index 1b77c53..9e57c76 100644 --- a/lib/active_admin_importable/version.rb +++ b/lib/active_admin_importable/version.rb @@ -1,3 +1,3 @@ module ActiveAdminImportable - VERSION = "1.1.2" + VERSION = '1.1.2' end From 514d7fbfd18931bdc9f31f15de55bccb87c002dc Mon Sep 17 00:00:00 2001 From: baptou12 Date: Sun, 13 Nov 2016 21:35:55 +0100 Subject: [PATCH 02/11] Put importation into an activerecord transaction --- lib/active_admin_importable/dsl.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index 9358447..f41dd47 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -10,7 +10,9 @@ def active_admin_importable(&block) end collection_action :import_csv, :method => :post do - CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) + ActiveRecord::Base.transaction do + CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], options[:transaction], &block) + end redirect_to :action => :index, :notice => "#{active_admin_config.resource_name.to_s} imported successfully!" end end From c01674bb40c0676a84c7aa69c998ff0abacdaa64 Mon Sep 17 00:00:00 2001 From: baptou12 Date: Sun, 13 Nov 2016 21:36:04 +0100 Subject: [PATCH 03/11] add options to change name --- lib/active_admin_importable/dsl.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index f41dd47..9fc5a94 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -1,8 +1,9 @@ module ActiveAdminImportable module DSL - def active_admin_importable(&block) + def active_admin_importable(options={}, &block) action_item :only => :index do - link_to "Import #{active_admin_config.resource_name.to_s.pluralize}", :action => 'upload_csv' + link_name = options[:name] || "Import #{active_admin_config.resource_name.to_s.pluralize}" + link_to link_name, :action => 'upload_csv' end collection_action :upload_csv do @@ -11,7 +12,7 @@ def active_admin_importable(&block) collection_action :import_csv, :method => :post do ActiveRecord::Base.transaction do - CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], options[:transaction], &block) + CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) end redirect_to :action => :index, :notice => "#{active_admin_config.resource_name.to_s} imported successfully!" end From 854014960da2a6b23fb3ae9dff9e5c627b808d1a Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 09:48:02 +0000 Subject: [PATCH 04/11] Update to .gitignore For RubyMine --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d87d4be..4d24529 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ spec/reports test/tmp test/version_tmp tmp +# RubyMine project files +.idea \ No newline at end of file From 61682ae417482e1a14068356259b246b10c4fd4f Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 09:49:10 +0000 Subject: [PATCH 05/11] Active Admin: using `action_item` without a name is deprecated --- lib/active_admin_importable/dsl.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index 9fc5a94..c323ef4 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -1,7 +1,7 @@ module ActiveAdminImportable module DSL def active_admin_importable(options={}, &block) - action_item :only => :index do + action_item :edit, :only => :index do link_name = options[:name] || "Import #{active_admin_config.resource_name.to_s.pluralize}" link_to link_name, :action => 'upload_csv' end From 873b7ba6a22890ec0813094e50d2eb3b59a7a5a2 Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 09:49:56 +0000 Subject: [PATCH 06/11] Fix success flash notice on redirecting. --- lib/active_admin_importable/dsl.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index c323ef4..abf96c9 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -14,7 +14,8 @@ def active_admin_importable(options={}, &block) ActiveRecord::Base.transaction do CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) end - redirect_to :action => :index, :notice => "#{active_admin_config.resource_name.to_s} imported successfully!" + flash[:notice] = "#{active_admin_config.resource_name.to_s} imported successfully!" + redirect_to :action => :index end end end From 419fe99748c8a3cfbd627d2a5da7ad5900a102f1 Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 12:13:27 +0000 Subject: [PATCH 07/11] Tell the user if there is an import error --- lib/active_admin_importable/dsl.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index abf96c9..fdd4af6 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -11,10 +11,15 @@ def active_admin_importable(options={}, &block) end collection_action :import_csv, :method => :post do - ActiveRecord::Base.transaction do - CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) + begin + ActiveRecord::Base.transaction do + CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) + end + flash[:notice] = "#{active_admin_config.resource_name.to_s.pluralize} imported successfully!" + rescue StandardError => e + flash[:alert] = "Error: #{e.message}" end - flash[:notice] = "#{active_admin_config.resource_name.to_s} imported successfully!" + redirect_to :action => :index end end From a0e51bdc9ea9b55bb88fb5603c4a840b8e514ee4 Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 12:23:16 +0000 Subject: [PATCH 08/11] Handle (usually Excel) character encoding issues --- active_admin_importable.gemspec | 2 ++ app/models/csv_db.rb | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/active_admin_importable.gemspec b/active_admin_importable.gemspec index 3b8e2ca..382e409 100644 --- a/active_admin_importable.gemspec +++ b/active_admin_importable.gemspec @@ -8,6 +8,8 @@ Gem::Specification.new do |gem| gem.summary = "Add CSV import to Active Admin resources with one line." gem.homepage = "http://github.com/krhorst/active_admin_importable" + gem.add_runtime_dependency 'rchardet', '~> 1.6' + gem.files = `git ls-files`.split($\) gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) diff --git a/app/models/csv_db.rb b/app/models/csv_db.rb index b18da65..5b3b7b7 100644 --- a/app/models/csv_db.rb +++ b/app/models/csv_db.rb @@ -1,10 +1,12 @@ require 'csv' +require 'rchardet' class CsvDb class << self def convert_save(target_model, csv_data, &block) csv_file = csv_data.read - + encoding = CharDet.detect(csv_file)['encoding'] + csv_file.encode!('UTF-8', encoding) CSV.parse(csv_file, :headers => true, header_converters: :symbol ) do |row| data = row.to_hash if data.present? From 419a835bdbef928e2569a114904e54d1f0aa89c8 Mon Sep 17 00:00:00 2001 From: peterwake Date: Fri, 18 Nov 2016 13:46:45 +0000 Subject: [PATCH 09/11] Bump version number --- lib/active_admin_importable/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_admin_importable/version.rb b/lib/active_admin_importable/version.rb index 9e57c76..7e1e8d2 100644 --- a/lib/active_admin_importable/version.rb +++ b/lib/active_admin_importable/version.rb @@ -1,3 +1,3 @@ module ActiveAdminImportable - VERSION = '1.1.2' + VERSION = '1.1.3' end From fd24b29d9a68c527de2bf52d5b843062fab142a4 Mon Sep 17 00:00:00 2001 From: CJ Turtle Date: Mon, 17 Feb 2020 20:36:03 +0000 Subject: [PATCH 10/11] allow a validator to be passed in so that we can check the dataset as a whole --- app/models/csv_db.rb | 12 ++++++++---- lib/active_admin_importable/dsl.rb | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/models/csv_db.rb b/app/models/csv_db.rb index 5b3b7b7..3a88ec4 100644 --- a/app/models/csv_db.rb +++ b/app/models/csv_db.rb @@ -3,17 +3,21 @@ class CsvDb class << self - def convert_save(target_model, csv_data, &block) + def convert_save(target_model, csv_data, validator, &block) csv_file = csv_data.read encoding = CharDet.detect(csv_file)['encoding'] csv_file.encode!('UTF-8', encoding) - CSV.parse(csv_file, :headers => true, header_converters: :symbol ) do |row| + + dataset = CSV.parse(csv_file, :headers => true, header_converters: :symbol) + validator.call(dataset) if validator.present? + + dataset.each do |row| data = row.to_hash if data.present? if (block_given?) - block.call(target_model, data) + block.call(target_model, data) else - target_model.create!(data) + target_model.create!(data) end end end diff --git a/lib/active_admin_importable/dsl.rb b/lib/active_admin_importable/dsl.rb index fdd4af6..45b6e6d 100644 --- a/lib/active_admin_importable/dsl.rb +++ b/lib/active_admin_importable/dsl.rb @@ -13,7 +13,7 @@ def active_admin_importable(options={}, &block) collection_action :import_csv, :method => :post do begin ActiveRecord::Base.transaction do - CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], &block) + CsvDb.convert_save(active_admin_config.resource_class, params[:dump][:file], options[:validator], &block) end flash[:notice] = "#{active_admin_config.resource_name.to_s.pluralize} imported successfully!" rescue StandardError => e From 8abc235db70444b4c4e38a7ea9065d72ecd542fb Mon Sep 17 00:00:00 2001 From: CJ Turtle Date: Mon, 17 Feb 2020 20:40:26 +0000 Subject: [PATCH 11/11] bumped version --- lib/active_admin_importable/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_admin_importable/version.rb b/lib/active_admin_importable/version.rb index 7e1e8d2..3d1c8dc 100644 --- a/lib/active_admin_importable/version.rb +++ b/lib/active_admin_importable/version.rb @@ -1,3 +1,3 @@ module ActiveAdminImportable - VERSION = '1.1.3' + VERSION = '1.2.0' end