diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/models/import.rb | 11 | ||||
-rw-r--r-- | app/models/issue_import.rb | 30 | ||||
-rw-r--r-- | app/views/imports/_issues_fields_mapping.html.erb | 12 |
3 files changed, 41 insertions, 12 deletions
diff --git a/app/models/import.rb b/app/models/import.rb index 102bcde73..696cd4d38 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -157,8 +157,8 @@ class Import < ActiveRecord::Base # Adds a callback that will be called after the item at given position is imported def add_callback(position, name, *args) settings['callbacks'] ||= {} - settings['callbacks'][position.to_i] ||= [] - settings['callbacks'][position.to_i] << [name, args] + settings['callbacks'][position] ||= [] + settings['callbacks'][position] << [name, args] save! end @@ -190,6 +190,7 @@ class Import < ActiveRecord::Base if position > resume_after item = items.build item.position = position + item.unique_id = row_value(row, 'unique_id') if use_unique_id? if object = build_object(row, item) if object.save @@ -202,7 +203,7 @@ class Import < ActiveRecord::Base item.save! imported += 1 - do_callbacks(item.position, object) + do_callbacks(use_unique_id? ? item.unique_id : item.position, object) end current = position end @@ -283,4 +284,8 @@ class Import < ActiveRecord::Base def yes?(value) value == lu(user, :general_text_yes) || value == '1' end + + def use_unique_id? + mapping['unique_id'].present? + end end diff --git a/app/models/issue_import.rb b/app/models/issue_import.rb index 5f99007fe..700d659ba 100644 --- a/app/models/issue_import.rb +++ b/app/models/issue_import.rb @@ -150,18 +150,30 @@ class IssueImport < Import end end if parent_issue_id = row_value(row, 'parent_issue_id') - if parent_issue_id =~ /\A(#)?(\d+)\z/ - parent_issue_id = $2.to_i - if $1 - attributes['parent_issue_id'] = parent_issue_id + if parent_issue_id.start_with? '#' + # refers to existing issue + attributes['parent_issue_id'] = parent_issue_id[1..-1] + elsif use_unique_id? + # refers to other row with unique id + issue_id = items.where(:unique_id => parent_issue_id).first.try(:obj_id) + + if issue_id + attributes['parent_issue_id'] = issue_id else - if parent_issue_id > item.position - add_callback(parent_issue_id, 'set_as_parent', item.position) - elsif issue_id = items.where(:position => parent_issue_id).first.try(:obj_id) - attributes['parent_issue_id'] = issue_id - end + add_callback(parent_issue_id, 'set_as_parent', item.position) end + elsif parent_issue_id =~ /\A\d+\z/ + # refers to other row by position + parent_issue_id = parent_issue_id.to_i + + if parent_issue_id > item.position + add_callback(parent_issue_id, 'set_as_parent', item.position) + elsif issue_id = items.where(:position => parent_issue_id).first.try(:obj_id) + attributes['parent_issue_id'] = issue_id + end + else + # Something is odd. Assign parent_issue_id to trigger validation error attributes['parent_issue_id'] = parent_issue_id end end diff --git a/app/views/imports/_issues_fields_mapping.html.erb b/app/views/imports/_issues_fields_mapping.html.erb index 542a956ff..05bf92e9a 100644 --- a/app/views/imports/_issues_fields_mapping.html.erb +++ b/app/views/imports/_issues_fields_mapping.html.erb @@ -1,3 +1,5 @@ +<div class="splitcontent"> +<div class="splitcontentleft"> <p> <label for="import_mapping_project_id"><%= l(:label_project) %></label> <%= select_tag 'import_settings[mapping][project_id]', @@ -13,6 +15,16 @@ <label for="import_mapping_status"><%= l(:field_status) %></label> <%= mapping_select_tag @import, 'status' %> </p> +</div> + +<div class="splitcontentright"> +<p></p> +<p> + <label for="import_mapping_unique_id"><%= l(:field_unique_id) %></label> + <%= mapping_select_tag @import, 'unique_id' %> +</p> +</div> +</div> <div class="splitcontent"> <div class="splitcontentleft"> |