summaryrefslogtreecommitdiffstats
path: root/app/controllers/imports_controller.rb
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2015-08-14 08:20:32 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2015-08-14 08:20:32 +0000
commit035edd39c422c9434147a1b0ac457cb9383c9b5b (patch)
tree4b25e158e04068c535e828c04f336c769ac9db9c /app/controllers/imports_controller.rb
parent763d5dddde2c7dda03fe529c9dfe0d553669c277 (diff)
downloadredmine-035edd39c422c9434147a1b0ac457cb9383c9b5b.tar.gz
redmine-035edd39c422c9434147a1b0ac457cb9383c9b5b.zip
Import issues from CSV file (#950).
git-svn-id: http://svn.redmine.org/redmine/trunk@14493 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/controllers/imports_controller.rb')
-rw-r--r--app/controllers/imports_controller.rb124
1 files changed, 124 insertions, 0 deletions
diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb
new file mode 100644
index 000000000..2499a20ad
--- /dev/null
+++ b/app/controllers/imports_controller.rb
@@ -0,0 +1,124 @@
+# Redmine - project management software
+# Copyright (C) 2006-2015 Jean-Philippe Lang
+#
+# 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.
+
+require 'csv'
+
+class ImportsController < ApplicationController
+
+ before_filter :find_import, :only => [:show, :settings, :mapping, :run]
+ before_filter :authorize_global
+
+ helper :issues
+
+ def new
+ end
+
+ def create
+ @import = IssueImport.new
+ @import.user = User.current
+ @import.file = params[:file]
+ @import.set_default_settings
+
+ if @import.save
+ redirect_to import_settings_path(@import)
+ else
+ render :action => 'new'
+ end
+ end
+
+ def show
+ end
+
+ def settings
+ if request.post? && @import.parse_file
+ redirect_to import_mapping_path(@import)
+ end
+
+ rescue CSV::MalformedCSVError => e
+ flash.now[:error] = l(:error_invalid_csv_file_or_settings)
+ rescue ArgumentError, Encoding::InvalidByteSequenceError => e
+ flash.now[:error] = l(:error_invalid_file_encoding, :encoding => ERB::Util.h(@import.settings['encoding']))
+ rescue SystemCallError => e
+ flash.now[:error] = l(:error_can_not_read_import_file)
+ 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)
+
+ if request.post?
+ respond_to do |format|
+ format.html {
+ if params[:previous]
+ redirect_to import_settings_path(@import)
+ else
+ redirect_to import_run_path(@import)
+ end
+ }
+ format.js # updates mapping form on project or tracker change
+ end
+ end
+ end
+
+ def run
+ if request.post?
+ @current = @import.run(
+ :max_items => max_items_per_request,
+ :max_time => 10.seconds
+ )
+ respond_to do |format|
+ format.html {
+ if @import.finished?
+ redirect_to import_path(@import)
+ else
+ redirect_to import_run_path(@import)
+ end
+ }
+ format.js
+ end
+ end
+ end
+
+ private
+
+ def find_import
+ @import = Import.where(:user_id => User.current.id, :filename => params[:id]).first
+ if @import.nil?
+ render_404
+ return
+ elsif @import.finished? && action_name != 'show'
+ redirect_to import_path(@import)
+ return
+ end
+ update_from_params if request.post?
+ end
+
+ def update_from_params
+ if params[:import_settings].is_a?(Hash)
+ @import.settings ||= {}
+ @import.settings.merge!(params[:import_settings])
+ @import.save!
+ end
+ end
+
+ def max_items_per_request
+ 5
+ end
+end