Skip to content

Commit e3875ff

Browse files
committed
Make Tracker map-able for CSV import (#22951).
git-svn-id: http://svn.redmine.org/redmine/trunk@15490 e93f8b46-1217-0410-a6f0-8f06a7374b81
1 parent b935539 commit e3875ff

File tree

8 files changed

+81
-22
lines changed

8 files changed

+81
-22
lines changed

app/controllers/imports_controller.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,7 @@ def settings
5757
end
5858

5959
def mapping
60-
issue = Issue.new
61-
issue.project = @import.project
62-
issue.tracker = @import.tracker
63-
@attributes = issue.safe_attribute_names
64-
@custom_fields = issue.editable_custom_field_values.map(&:custom_field)
60+
@custom_fields = @import.mappable_custom_fields
6561

6662
if request.post?
6763
respond_to do |format|

app/helpers/imports_helper.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ def options_for_mapping_select(import, field, options={})
2323
blank_text = options[:required] ? "-- #{l(:actionview_instancetag_blank_option)} --" : " ".html_safe
2424
tags << content_tag('option', blank_text, :value => '')
2525
tags << options_for_select(import.columns_options, import.mapping[field])
26+
if values = options[:values]
27+
tags << content_tag('option', '--', :disabled => true)
28+
tags << options_for_select(values.map {|text, value| [text, "value:#{value}"]}, import.mapping[field])
29+
end
2630
tags
2731
end
2832

2933
def mapping_select_tag(import, field, options={})
3034
name = "import_settings[mapping][#{field}]"
31-
select_tag name, options_for_mapping_select(import, field, options)
35+
select_tag name, options_for_mapping_select(import, field, options), :id => "import_mapping_#{field}"
3236
end
3337

3438
# Returns the options for the date_format setting

app/models/issue_import.rb

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ def allowed_target_trackers
4141
end
4242

4343
def tracker
44-
tracker_id = mapping['tracker_id'].to_i
45-
allowed_target_trackers.find_by_id(tracker_id) || allowed_target_trackers.first
44+
if mapping['tracker'].to_s =~ /\Avalue:(\d+)\z/
45+
tracker_id = $1.to_i
46+
allowed_target_trackers.find_by_id(tracker_id)
47+
end
4648
end
4749

4850
# Returns true if missing categories should be created during the import
@@ -57,19 +59,40 @@ def create_versions?
5759
mapping['create_versions'] == '1'
5860
end
5961

62+
def mappable_custom_fields
63+
if tracker
64+
issue = Issue.new
65+
issue.project = project
66+
issue.tracker = tracker
67+
issue.editable_custom_field_values(user).map(&:custom_field)
68+
elsif project
69+
project.all_issue_custom_fields
70+
else
71+
[]
72+
end
73+
end
74+
6075
private
6176

6277
def build_object(row)
6378
issue = Issue.new
6479
issue.author = user
6580
issue.notify = false
6681

82+
tracker_id = nil
83+
if tracker
84+
tracker_id = tracker.id
85+
elsif tracker_name = row_value(row, 'tracker')
86+
tracker_id = allowed_target_trackers.named(tracker_name).first.try(:id)
87+
end
88+
6789
attributes = {
6890
'project_id' => mapping['project_id'],
69-
'tracker_id' => mapping['tracker_id'],
91+
'tracker_id' => tracker_id,
7092
'subject' => row_value(row, 'subject'),
7193
'description' => row_value(row, 'description')
7294
}
95+
attributes
7396
issue.send :safe_attributes=, attributes, user
7497

7598
attributes = {}
@@ -149,6 +172,11 @@ def build_object(row)
149172
end
150173

151174
issue.send :safe_attributes=, attributes, user
175+
176+
if issue.tracker_id != tracker_id
177+
issue.tracker_id = nil
178+
end
179+
152180
issue
153181
end
154182
end

app/views/imports/_fields_mapping.html.erb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
<div class="splitcontent">
2-
<div class="splitcontentleft">
31
<p>
42
<label><%= l(:label_project) %></label>
53
<%= select_tag 'import_settings[mapping][project_id]',
64
options_for_select(project_tree_options_for_select(@import.allowed_target_projects, :selected => @import.project)),
7-
:id => 'issue_project_id' %>
5+
:id => 'import_mapping_project_id' %>
86
</p>
97
<p>
108
<label><%= l(:label_tracker) %></label>
11-
<%= select_tag 'import_settings[mapping][tracker_id]',
12-
options_for_select(@import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]}, @import.tracker.try(:id)),
13-
:id => 'issue_tracker_id' %>
9+
<%= mapping_select_tag @import, 'tracker', :required => true,
10+
:values => @import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]} %>
1411
</p>
12+
13+
<div class="splitcontent">
14+
<div class="splitcontentleft">
1515
<p>
1616
<label><%= l(:field_subject) %></label>
1717
<%= mapping_select_tag @import, 'subject', :required => true %>

app/views/imports/mapping.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
<%= javascript_tag do %>
3737
$(document).ready(function() {
38-
$('#fields-mapping').on('change', '#issue_project_id, #issue_tracker_id', function(){
38+
$('#fields-mapping').on('change', '#import_mapping_project_id, #import_mapping_tracker', function(){
3939
$.ajax({
4040
url: '<%= import_mapping_path(@import, :format => 'js') %>',
4141
type: 'post',

test/fixtures/files/import_issues.csv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
priority;subject;description;start_date;due_date;parent;private;progress;custom;version;category;user;estimated_hours
2-
High;First;First description;2015-07-08;2015-08-25;;no;;PostgreSQL;;New category;dlopper;1
3-
Normal;Child 1;Child description;;;1;yes;10;MySQL;2.0;New category;;2
4-
Normal;Child of existing issue;Child description;;;#2;no;20;;2.1;Printing;;3
1+
priority;subject;description;start_date;due_date;parent;private;progress;custom;version;category;user;estimated_hours;tracker
2+
High;First;First description;2015-07-08;2015-08-25;;no;;PostgreSQL;;New category;dlopper;1;bug
3+
Normal;Child 1;Child description;;;1;yes;10;MySQL;2.0;New category;;2;feature request
4+
Normal;Child of existing issue;Child description;;;#2;no;20;;2.1;Printing;;3;bug

test/object_helpers.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def generate_import_with_mapping(fixture_name='import_issues.csv')
235235

236236
import.settings = {
237237
'separator' => ";", 'wrapper' => '"', 'encoding' => "UTF-8",
238-
'mapping' => {'project_id' => '1', 'tracker_id' => '2', 'subject' => '1'}
238+
'mapping' => {'project_id' => '1', 'tracker' => '13', 'subject' => '1'}
239239
}
240240
import.save!
241241
import

test/unit/issue_import_test.rb

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,37 @@ def test_create_categories_should_create_missing_categories
5858
assert_equal 'New category', category.name
5959
end
6060

61+
def test_mapping_with_fixed_tracker
62+
import = generate_import_with_mapping
63+
import.mapping.merge!('tracker' => 'value:2')
64+
import.save!
65+
66+
issues = new_records(Issue, 3) { import.run }
67+
assert_equal [2], issues.map(&:tracker_id).uniq
68+
end
69+
70+
def test_mapping_with_mapped_tracker
71+
import = generate_import_with_mapping
72+
import.mapping.merge!('tracker' => '13')
73+
import.save!
74+
75+
issues = new_records(Issue, 3) { import.run }
76+
assert_equal [1, 2, 1], issues.map(&:tracker_id)
77+
end
78+
79+
def test_should_not_import_with_default_tracker_when_tracker_is_invalid
80+
Tracker.find_by_name('Feature request').update!(:name => 'Feature')
81+
82+
import = generate_import_with_mapping
83+
import.mapping.merge!('tracker' => '13')
84+
import.save!
85+
import.run
86+
87+
assert_equal 1, import.unsaved_items.count
88+
item = import.unsaved_items.first
89+
assert_include "Tracker cannot be blank", item.message
90+
end
91+
6192
def test_parent_should_be_set
6293
import = generate_import_with_mapping
6394
import.mapping.merge!('parent_issue_id' => '5')
@@ -101,7 +132,7 @@ def test_dates_should_be_parsed_using_date_format_setting
101132
field = IssueCustomField.generate!(:field_format => 'date', :is_for_all => true, :trackers => Tracker.all)
102133
import = generate_import_with_mapping('import_dates.csv')
103134
import.settings.merge!('date_format' => Import::DATE_FORMATS[1])
104-
import.mapping.merge!('subject' => '0', 'start_date' => '1', 'due_date' => '2', "cf_#{field.id}" => '3')
135+
import.mapping.merge!('tracker' => 'value:1', 'subject' => '0', 'start_date' => '1', 'due_date' => '2', "cf_#{field.id}" => '3')
105136
import.save!
106137

107138
issue = new_record(Issue) { import.run } # only 1 valid issue

0 commit comments

Comments
 (0)