GitLab wurde erfolgreich aktualisiert. Dank regelmäßiger Updates bleibt das THM GitLab sicher und Sie profitieren von den neuesten Funktionen. Danke für Ihre Geduld.

Commit 6488896e authored by jplang's avatar jplang

Make Tracker map-able for CSV import (#22951).

git-svn-id: https://svn.redmine.org/redmine/trunk@15490 e93f8b46-1217-0410-a6f0-8f06a7374b81
parent ac7496a7
......@@ -57,11 +57,7 @@ class ImportsController < ApplicationController
end
def mapping
issue = Issue.new
issue.project = @import.project
issue.tracker = @import.tracker
@attributes = issue.safe_attribute_names
@custom_fields = issue.editable_custom_field_values.map(&:custom_field)
@custom_fields = @import.mappable_custom_fields
if request.post?
respond_to do |format|
......
......@@ -23,12 +23,16 @@ module ImportsHelper
blank_text = options[:required] ? "-- #{l(:actionview_instancetag_blank_option)} --" : "&nbsp;".html_safe
tags << content_tag('option', blank_text, :value => '')
tags << options_for_select(import.columns_options, import.mapping[field])
if values = options[:values]
tags << content_tag('option', '--', :disabled => true)
tags << options_for_select(values.map {|text, value| [text, "value:#{value}"]}, import.mapping[field])
end
tags
end
def mapping_select_tag(import, field, options={})
name = "import_settings[mapping][#{field}]"
select_tag name, options_for_mapping_select(import, field, options)
select_tag name, options_for_mapping_select(import, field, options), :id => "import_mapping_#{field}"
end
# Returns the options for the date_format setting
......
......@@ -41,8 +41,10 @@ class IssueImport < Import
end
def tracker
tracker_id = mapping['tracker_id'].to_i
allowed_target_trackers.find_by_id(tracker_id) || allowed_target_trackers.first
if mapping['tracker'].to_s =~ /\Avalue:(\d+)\z/
tracker_id = $1.to_i
allowed_target_trackers.find_by_id(tracker_id)
end
end
# Returns true if missing categories should be created during the import
......@@ -57,6 +59,19 @@ class IssueImport < Import
mapping['create_versions'] == '1'
end
def mappable_custom_fields
if tracker
issue = Issue.new
issue.project = project
issue.tracker = tracker
issue.editable_custom_field_values(user).map(&:custom_field)
elsif project
project.all_issue_custom_fields
else
[]
end
end
private
def build_object(row)
......@@ -64,12 +79,20 @@ class IssueImport < Import
issue.author = user
issue.notify = false
tracker_id = nil
if tracker
tracker_id = tracker.id
elsif tracker_name = row_value(row, 'tracker')
tracker_id = allowed_target_trackers.named(tracker_name).first.try(:id)
end
attributes = {
'project_id' => mapping['project_id'],
'tracker_id' => mapping['tracker_id'],
'tracker_id' => tracker_id,
'subject' => row_value(row, 'subject'),
'description' => row_value(row, 'description')
}
attributes
issue.send :safe_attributes=, attributes, user
attributes = {}
......@@ -149,6 +172,11 @@ class IssueImport < Import
end
issue.send :safe_attributes=, attributes, user
if issue.tracker_id != tracker_id
issue.tracker_id = nil
end
issue
end
end
<div class="splitcontent">
<div class="splitcontentleft">
<p>
<label><%= l(:label_project) %></label>
<%= select_tag 'import_settings[mapping][project_id]',
options_for_select(project_tree_options_for_select(@import.allowed_target_projects, :selected => @import.project)),
:id => 'issue_project_id' %>
:id => 'import_mapping_project_id' %>
</p>
<p>
<label><%= l(:label_tracker) %></label>
<%= select_tag 'import_settings[mapping][tracker_id]',
options_for_select(@import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]}, @import.tracker.try(:id)),
:id => 'issue_tracker_id' %>
<%= mapping_select_tag @import, 'tracker', :required => true,
:values => @import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]} %>
</p>
<div class="splitcontent">
<div class="splitcontentleft">
<p>
<label><%= l(:field_subject) %></label>
<%= mapping_select_tag @import, 'subject', :required => true %>
......
......@@ -35,7 +35,7 @@
<%= javascript_tag do %>
$(document).ready(function() {
$('#fields-mapping').on('change', '#issue_project_id, #issue_tracker_id', function(){
$('#fields-mapping').on('change', '#import_mapping_project_id, #import_mapping_tracker', function(){
$.ajax({
url: '<%= import_mapping_path(@import, :format => 'js') %>',
type: 'post',
......
priority;subject;description;start_date;due_date;parent;private;progress;custom;version;category;user;estimated_hours
High;First;First description;2015-07-08;2015-08-25;;no;;PostgreSQL;;New category;dlopper;1
Normal;Child 1;Child description;;;1;yes;10;MySQL;2.0;New category;;2
Normal;Child of existing issue;Child description;;;#2;no;20;;2.1;Printing;;3
priority;subject;description;start_date;due_date;parent;private;progress;custom;version;category;user;estimated_hours;tracker
High;First;First description;2015-07-08;2015-08-25;;no;;PostgreSQL;;New category;dlopper;1;bug
Normal;Child 1;Child description;;;1;yes;10;MySQL;2.0;New category;;2;feature request
Normal;Child of existing issue;Child description;;;#2;no;20;;2.1;Printing;;3;bug
......@@ -235,7 +235,7 @@ module ObjectHelpers
import.settings = {
'separator' => ";", 'wrapper' => '"', 'encoding' => "UTF-8",
'mapping' => {'project_id' => '1', 'tracker_id' => '2', 'subject' => '1'}
'mapping' => {'project_id' => '1', 'tracker' => '13', 'subject' => '1'}
}
import.save!
import
......
......@@ -58,6 +58,37 @@ class IssueImportTest < ActiveSupport::TestCase
assert_equal 'New category', category.name
end
def test_mapping_with_fixed_tracker
import = generate_import_with_mapping
import.mapping.merge!('tracker' => 'value:2')
import.save!
issues = new_records(Issue, 3) { import.run }
assert_equal [2], issues.map(&:tracker_id).uniq
end
def test_mapping_with_mapped_tracker
import = generate_import_with_mapping
import.mapping.merge!('tracker' => '13')
import.save!
issues = new_records(Issue, 3) { import.run }
assert_equal [1, 2, 1], issues.map(&:tracker_id)
end
def test_should_not_import_with_default_tracker_when_tracker_is_invalid
Tracker.find_by_name('Feature request').update!(:name => 'Feature')
import = generate_import_with_mapping
import.mapping.merge!('tracker' => '13')
import.save!
import.run
assert_equal 1, import.unsaved_items.count
item = import.unsaved_items.first
assert_include "Tracker cannot be blank", item.message
end
def test_parent_should_be_set
import = generate_import_with_mapping
import.mapping.merge!('parent_issue_id' => '5')
......@@ -101,7 +132,7 @@ class IssueImportTest < ActiveSupport::TestCase
field = IssueCustomField.generate!(:field_format => 'date', :is_for_all => true, :trackers => Tracker.all)
import = generate_import_with_mapping('import_dates.csv')
import.settings.merge!('date_format' => Import::DATE_FORMATS[1])
import.mapping.merge!('subject' => '0', 'start_date' => '1', 'due_date' => '2', "cf_#{field.id}" => '3')
import.mapping.merge!('tracker' => 'value:1', 'subject' => '0', 'start_date' => '1', 'due_date' => '2', "cf_#{field.id}" => '3')
import.save!
issue = new_record(Issue) { import.run } # only 1 valid issue
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment