Redmine CSV Import Plugin

前回の続き。
RedmineからデーターのmigrationをするためにCSV経由でやることに。

なぜなら旧Redmineはユーザー作成ポリシーがないために名前に日本語と英語が入り交じるという燦々たる状況。
仕方がないのでユーザーは全部手動で登録しなおし。

問題がチケット。
Redmineから移行予定のプロジェクトにある全チケットはExportできたのでこれをImportするプラグインを使う。


http://daipresents.com/weblog/fujihalab/archives/2010/03/redmine-csv-import-plugin.php

ここにあるpluginをQuickHackしてつかうことにする。

ソースをざっと眺めて
・入力日と作成日は保持して欲しい
・テーブルにある二つのユーザー情報については、名前ベースでQueryしているみたいなので、idをkeyにしてQueryしたほうがいい
・ステータスについても同様
#書き出したcsvはユーザー名とステータスは名前ではいってるのでそれを新規対応に手動で書換。
の対応をしてimport成功!


とおもったら、なぜかチケットのステータスが全部新規に。
詳しくは追ってないけどfilterが、どうも新規に追加されたチケットを全部ステータスを新規にしているみたいなので、saveした後に
updateするようにHack。Rails使いの同僚がみたら微妙な顔しそうだけど、いまの要求はとりあえず動けばOKなので勘弁してねw

というわけで以下patch

git diff importer_controller.rb
diff --git a/app/controllers/importer_controller.rb b/app/controllers/importer_c
index f8ecb6d..506c959 100644
--- a/app/controllers/importer_controller.rb
+++ b/app/controllers/importer_controller.rb
@@ -8,7 +8,7 @@ class ImporterController < ApplicationController
 
   ISSUE_ATTRS = [:id, :subject, :assigned_to, :fixed_version,
     :author, :description, :category, :priority, :tracker, :status,
-    :start_date, :due_date, :done_ratio, :estimated_hours]
+    :start_date, :due_date, :done_ratio, :estimated_hours, :created_on, :update
  
   def index
   end
@@ -111,14 +111,14 @@ class ImporterController < ApplicationController
 
     attrs_map = fields_map.invert
     FasterCSV.foreach(tmpfile.path, {:headers=>true, :encoding=>encoding, :quot
-
+       
       project = Project.find_by_name(row[attrs_map["project"]])
       tracker = Tracker.find_by_name(row[attrs_map["tracker"]])
-      status = IssueStatus.find_by_name(row[attrs_map["status"]])
-      author = User.find_by_login(row[attrs_map["author"]])
+      status = IssueStatus.find_by_id(row[attrs_map["status"]])
+      author = User.find_by_id(row[attrs_map["author"]])
       priority = Enumeration.find_by_name(row[attrs_map["priority"]])
       category = IssueCategory.find_by_name(row[attrs_map["category"]])
-      assigned_to = User.find_by_login(row[attrs_map["assigned_to"]])
+      assigned_to = User.find_by_id(row[attrs_map["assigned_to"]])
       fixed_version = Version.find_by_name(row[attrs_map["fixed_version"]])
       # new issue or find exists one
       issue = Issue.new
@@ -209,6 +209,8 @@ class ImporterController < ApplicationController
       issue.fixed_version_id = fixed_version != nil ? fixed_version.id : issue.
       issue.done_ratio = row[attrs_map["done_ratio"]] || issue.done_ratio
       issue.estimated_hours = row[attrs_map["estimated_hours"]] || issue.estima
+      issue.created_on = row[attrs_map["created_on"]] || issue.created_on
+      issue.updated_on = row[attrs_map["updated_on"]] || issue.updated_on
 
       # custom fields
       issue.custom_field_values = issue.available_custom_fields.inject({}) do |
@@ -223,10 +225,14 @@ class ImporterController < ApplicationController
         @failed_count += 1
         @failed_issues[@handle_count + 1] = row
       end
-  
+
+
+      Issue.update_all "status_id = #{status.id}", ["id = ?", issue.id]      
+
       if journal
         journal
       end
+
       
       @handle_count += 1
     end # do

こんな感じ無事importできました。IDは変わるけどまあしょうがないってことで。