【4日目】Redmine - チケットのフィルタに独自の項目を入れ込む方法

Redmine Advent Calendar jp 2011 : ATND 4日目です。

現行のRedmineだともっとスマートに書けるかもしれません。
良い実装をご存知のかた、ぜひ、教えてください :D

Hudson プラグインが入れ込んだもの

Hudson Plugin をインストールすると、チケットのフィルタに

  • Hudson(ジョブ名)
  • Hudson(ビルド番号)

という、見慣れない項目が登場します。これがそうですね。

フィルタを管理しているのはどこ?

Query クラスが親玉です。狙いどころは以下。

avalable_filters
フィルタで利用できる項目の一覧を返します。
sql_for_field
フィルタの項目に応じてSQL(WHERE句の条件)を作成します。

available_filters でジョブ番号とビルド番号を項目に追加して、
sql_for_field で追加した項目に応じたSQLを作成できるようにすれば良い訳です。

奥義! alias_method_chain!

時間がないのでいきなり奥義。

上記の Query#available_filters, Query#sql_for_field は新しい項目を追加できるように設計されていません。
また、Query クラスを入れ替えることもできないので、Queryクラスを継承してメソッドをオーバーライドする戦法も取れません。

手詰まり… orz

そこで登場するのが alias_method_chain です。

Query.class_eval do
  alias_method_chain :available_filters, :redmine_hudson
end

のように書いておくと(ここちょっと自信ない)、

  • available_filers を available_filters_with_redmine_hudson でオーバーライドする
  • 元のメソッドは available_filters_without_redmine_hudson で呼び出すことができる

ようになります。
これを使ってあれこれすれば、フィルタに項目を追加することができるのですが……。

時間がなくなったので今日はここまで。2回目があれば続きを!