この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
redmine ガントチャート チケットの開始日順でソートする
■ Redmineでタスク管理
Redmineで公私含めたタスクの管理を行っています。
なんといってもガントチャートが出るのが便利ですね。
Redmineでタスク管理を行うノウハウについては
ほかにたくさんの優れた情報がありますのでここでは詳しくは触れませんが、
個人的にガントチャートを出したいという点を踏まえて気をつけていることは
・チケットには必ず開始日、期日を入力する
・進捗(~%)をつけていく
という点です。
きっちりしすぎると管理コストが高くなりますので、あまり原則にとらわれずにやってます。
本記事はRedmine trunkバージョン リビジョン10485 をもとに書いています。
記事内でソースコードを変更する箇所がありますが、利用する場合は自己責任でお願いします。
■ ガントチャートがちょっとみづらい?
本題に入っていきます。
ガントチャートを見てみましょう。
チケット#6の中に子チケットが並んでいます。
現時点ではソートがチケット番号順になっていて、どの順番で作業を行うか少しみづらいです。
■ ソース改修
ソート順を変えるため、ソースを変更します。
下記は改修後のソースをsvn diffした結果です。
Index: lib/redmine/helpers/gantt.rb
===================================================================
--- lib/redmine/helpers/gantt.rb (リビジョン 10485)
+++ lib/redmine/helpers/gantt.rb (作業コピー)
@@ -638,7 +638,21 @@
# Sorts a collection of issues by start_date, due_date, id for gantt rendering
def sort_issues!(issues)
- issues.sort! { |a, b| gantt_issue_compare(a, b, issues) }
+ default_date = Date.new(1970, 1, 1)
+ issues.sort! do |a, b|
+ a_is_child = a.id != a.root_id ? 1 : 0
+ b_is_child = b.id != b.root_id ? 1 : 0
+ a_start_date = a.start_date || default_date
+ b_start_date = b.start_date || default_date
+ a_child_start_date = Issue.find(a.root_id).children.minimum(:start_date)
+ b_child_start_date = Issue.find(b.root_id).children.minimum(:start_date)
+ a_root_start_date = a_child_start_date || a_start_date
+ b_root_start_date = b_child_start_date || b_start_date
+ (a_root_start_date <=> b_root_start_date).nonzero? ||
+ (a.root_id <=> b.root_id).nonzero? ||
+ (a_is_child <=> b_is_child).nonzero? ||
+ (a_start_date <=> b_start_date)
+ end
end
# TODO: top level issues should be sorted by start date
第一ソート: チケットの開始日(子チケットを持つ場合は子チケットの中で最も古い開始日)
第二ソート: 親チケットのチケット番号
第三ソート: チケットの開始日
と複数の条件でソートしています。
ここで単純にチケットの開始日順だけでソートしてしまうと、親チケットは開始日情報を持たずにエラーとなります。また強制的に何か日付を持たせると今度はチケットの親子関係が崩れてしまい、これまたみづらい状況になってしまいます。
■ 改修後のガントチャート
開始日順になっています。
チケットの親子関係も崩れていないですね。
見やすくなりました。