##// END OF EJS Templates
Don't add the inclusion error when tracker is not set, the blank error is enough....
Don't add the inclusion error when tracker is not set, the blank error is enough. git-svn-id: http://svn.redmine.org/redmine/trunk@15492 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r15108:e3875ffd5739
r15110:90d14b71b365
Show More
issue_import.rb
182 lines | 5.6 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueImport < Import
# Returns the objects that were imported
def saved_objects
object_ids = saved_items.pluck(:obj_id)
objects = Issue.where(:id => object_ids).order(:id).preload(:tracker, :priority, :status)
end
# Returns a scope of projects that user is allowed to
# import issue to
def allowed_target_projects
Project.allowed_to(user, :import_issues)
end
def project
project_id = mapping['project_id'].to_i
allowed_target_projects.find_by_id(project_id) || allowed_target_projects.first
end
# Returns a scope of trackers that user is allowed to
# import issue to
def allowed_target_trackers
Jean-Philippe Lang
Limit trackers for new issue to certain roles (#7839)....
r15082 Issue.allowed_target_trackers(project, user)
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 end
def tracker
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108 if mapping['tracker'].to_s =~ /\Avalue:(\d+)\z/
tracker_id = $1.to_i
allowed_target_trackers.find_by_id(tracker_id)
end
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 end
# Returns true if missing categories should be created during the import
def create_categories?
user.allowed_to?(:manage_categories, project) &&
mapping['create_categories'] == '1'
end
# Returns true if missing versions should be created during the import
def create_versions?
user.allowed_to?(:manage_versions, project) &&
mapping['create_versions'] == '1'
end
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108 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
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 private
def build_object(row)
issue = Issue.new
issue.author = user
issue.notify = false
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108 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
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 attributes = {
'project_id' => mapping['project_id'],
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108 'tracker_id' => tracker_id,
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 'subject' => row_value(row, 'subject'),
'description' => row_value(row, 'description')
}
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108 attributes
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 issue.send :safe_attributes=, attributes, user
attributes = {}
if priority_name = row_value(row, 'priority')
if priority_id = IssuePriority.active.named(priority_name).first.try(:id)
attributes['priority_id'] = priority_id
end
end
if issue.project && category_name = row_value(row, 'category')
if category = issue.project.issue_categories.named(category_name).first
attributes['category_id'] = category.id
elsif create_categories?
category = issue.project.issue_categories.build
category.name = category_name
if category.save
attributes['category_id'] = category.id
end
end
end
if assignee_name = row_value(row, 'assigned_to')
Jean-Philippe Lang
Use same logic for finding user when importing a file (#950)....
r14119 if assignee = Principal.detect_by_keyword(issue.assignable_users, assignee_name)
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 attributes['assigned_to_id'] = assignee.id
end
end
if issue.project && version_name = row_value(row, 'fixed_version')
Jean-Philippe Lang
Use named scope to find the matching version (#950)....
r14115 if version = issue.project.versions.named(version_name).first
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 attributes['fixed_version_id'] = version.id
elsif create_versions?
version = issue.project.versions.build
version.name = version_name
if version.save
attributes['fixed_version_id'] = version.id
end
end
end
if is_private = row_value(row, 'is_private')
if yes?(is_private)
attributes['is_private'] = '1'
end
end
if parent_issue_id = row_value(row, 'parent_issue_id')
if parent_issue_id =~ /\A(#)?(\d+)\z/
parent_issue_id = $2
if $1
attributes['parent_issue_id'] = parent_issue_id
elsif issue_id = items.where(:position => parent_issue_id).first.try(:obj_id)
attributes['parent_issue_id'] = issue_id
end
else
attributes['parent_issue_id'] = parent_issue_id
end
end
Jean-Philippe Lang
Adds support for custom date format when importing a CSV file (#950)....
r14113 if start_date = row_date(row, 'start_date')
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 attributes['start_date'] = start_date
end
Jean-Philippe Lang
Adds support for custom date format when importing a CSV file (#950)....
r14113 if due_date = row_date(row, 'due_date')
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 attributes['due_date'] = due_date
end
Jean-Philippe Lang
Add column `estimated_hours` for CSV import (#21867)....
r14749 if estimated_hours = row_value(row, 'estimated_hours')
attributes['estimated_hours'] = estimated_hours
end
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 if done_ratio = row_value(row, 'done_ratio')
attributes['done_ratio'] = done_ratio
end
attributes['custom_field_values'] = issue.custom_field_values.inject({}) do |h, v|
Jean-Philippe Lang
Adds support for custom date format when importing a CSV file (#950)....
r14113 value = case v.custom_field.field_format
when 'date'
row_date(row, "cf_#{v.custom_field.id}")
else
row_value(row, "cf_#{v.custom_field.id}")
end
if value
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 h[v.custom_field.id.to_s] = v.custom_field.value_from_keyword(value, issue)
end
h
end
issue.send :safe_attributes=, attributes, user
Jean-Philippe Lang
Make Tracker map-able for CSV import (#22951)....
r15108
if issue.tracker_id != tracker_id
issue.tracker_id = nil
end
Jean-Philippe Lang
Import issues from CSV file (#950)....
r14111 issue
end
end