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は変わるけどまあしょうがないってことで。