GoogleChart の GraphViz Charts で Redmine のワークフローを視覚化してみた

Google Chart が GraphViz をサポートしたので、懸案だったワークフローの視覚化をやってみました。
http://code.google.com/intl/ja/apis/chart/docs/gallery/graphviz.html

気力とやる気の問題からプラグイン化はしていません。

環境

Redmine: 1.0.0(RC)

コード

WorkFlowHelper にチャート出力用URL+パラメータ出力メソッドを追加

module WorkflowsHelper
  def generate_graph(role, tracker)
    edges = role.workflows.inject("") do |edge, workflow| 
      workflow.tracker_id == tracker.id ? "#{edge}#{workflow.old_status}->#{workflow.new_status};" : edge 
    end
    "http://chart.apis.google.com/chart?cht=gv&chl=digraph{#{CGI.escape(edges.gsub(/ /, '_').toutf8)}}&chs=500x500"
  end
end

ワークフロー編集ビューにグラフ描画を追加
app/views/workflows/edit.rhtmlの最後に以下を加える。

 <%= image_tag(generate_graph(@role, @tracker)) if @role %>

結果

こんな感じ。

うまく出力できました。

制約

  • GoogleChart API の制限として、長すぎるURLははじかれます。なので、ステータス数が増えてくると表示できなくなります。
  • ノード名にスペースが入ると二つのノードと認識されるらしく、今回はワークアラウンドとしてスペースをアンダースコアに変換しています。
  • さらに、漢字は以下のように化けてしまうので、基本的に日本語ステータス名は不可。


まとめ

  • GraphViz Chart の日本語サポートに期待
  • app/views/workflows/edit.rhtml の最後にビューフックが欲しい。それがあれば綺麗にプラグイン化できる。
  • GraphViz Chart のドキュメントはろくに読んでいない。それでも使える Google Chart API はすばらしい:)