6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/active_admin_csv_import/dsl.rb', line 6
def csv_importable(options={})
columns = options[:columns] ||= active_admin_config.resource_class.columns.map(&:name) - ["id", "updated_at", "created_at"]
required_columns = options[:required_columns] ||= columns
action_item :only => :index do
link_to "Import #{active_admin_config.resource_name.to_s.pluralize}", :action => 'import_csv'
end
collection_action :example_csv do
csv_column_names = CSV.generate do |csv|
csv << columns.map(&:to_s).map(&:humanize)
end
send_data(csv_column_names, :type => 'text/csv; charset=utf-8; header=present', :filename => active_admin_config.resource_class.name.to_s.pluralize + ".csv")
end
collection_action :import_csv do
@columns = columns
@required_columns = required_columns
@post_path = options[:path].try(:call)
@post_path ||= collection_path + "/import_rows"
@redirect_path = options[:redirect_path].try(:call)
@redirect_path ||= collection_path
@delimiter = options[:delimiter]
render "admin/csv/import_csv"
end
collection_action :import_rows, :method => :post do
@failures = []
csv_resource_params.values.each do |row_params|
row_params = row_params.with_indifferent_access
row_number = row_params.delete('_row')
resource = existing_row_resource(options[:import_unique_key], row_params)
resource ||= active_admin_config.resource_class.new()
if not update_row_resource(resource, row_params)
@failures << {
row_number: row_number,
resource: resource
}
end
end
render :partial => "admin/csv/import_csv_failed_row", :status => 200
end
controller do
def csv_resource_params
if respond_to?(:permitted_params)
permitted_params[active_admin_config.resource_class.name.underscore]
else
params[active_admin_config.resource_class.name.underscore]
end
end
def update_row_resource(resource, params)
resource.attributes = params
resource.save
end
def existing_row_resource(lookup_column, params)
return unless lookup_column
finder_method = "find_by_#{lookup_column}".to_sym
value = params[lookup_column]
return unless value.present?
return active_admin_config.resource_class.send(finder_method, value)
end
end
end
|