2015年7月9日木曜日

Redmine + Backlogs の残り時間の集計表示をGreasemonkeyスクリプトで

要約

Redmine+Backlogs は便利だけど、あるスプリント内の担当者ごとの残り時間の合計がどこにも表示されないのが不便だよね、と思い、Greasemonkeyで手抜き解決した、というお話。





最近Redmineを使い始めました。
Backlogsプラグインを入れると、どっかの商用プロジェクト管理ソフトより
はるかに使いやすいです。

Redmine+Backlogsの環境構築は下手に自分で頑張るより、Bitnamiを使うのが良さそうです。インストールについては今回は割愛(インターネットのない環境へのインストールというなかなか厳しい作業でしたが、何とかなりました。Bitnamiは素晴らしいです。)。

プラグインは最低限にしておき、

  • Backlogs
  • Worktime
  • Wiki Extension
  • Parent issue filter

で十分です。

しかしひとつ不満があります。
スプリントにストーリーを登録し、タスクに分解し、工数と担当者を設定するところまではいいのですが、各担当者に割り当てられた工数の合計がよくわからないのです。
ちなみに、予定工数ではなく、残り時間を取りたいのです。
残り時間を見ながら、スプリントの計画を立てたり、日々の進捗を確認したりしたいのです。
みなさん不便に感じていないところを見ると、進め方が悪いような気もしますが。

残念ながら残り時間はREST API では取得できないようです。
プラグインに手を入れてみようかとソースを見てみましたが難しそうなので断念。Work Time の方から攻めてみようかとも思いましたが、こちらもなかなか厳しい。

ふと思いついたのが、クライアントサイドでやってしまおう、ということです。
ページのソースを見ると、簡単にデータが取れそうじゃないですか。

ということで、

  1. チケット検索画面で残り時間の合計をタイトルバーに表示する
  2. かんばん画面で担当者ごとの残り時間の集計をタイトルバーに表示する

をやってみました。

チケット検索画面

こんなかんじでGreasemonkeyスクリプトを記述。
ヘッダは省略。Greasemonkeyの
elms = document.getElementsByClassName("remaining_hours");
if (elms.length > 0) {
  var total = 0.0;
  for (i = 0; i < elms.length; i++){
    elm = elms[i];
    //document.title += ":" + elm.tagName + " " + elm.textContent;
    if(elm.textContent != ""){
      total += parseFloat(elm.textContent);
    }
  }

  document.title = "Remain: " + total + " - " + document.title;
}
チケットを検索し、 表示列に残り時間を追加してやると、タイトルに合計が出ます。便利!

かんばん画面

かんばん画面はもう少し頑張ってみます。
こんなかんじで、担当者ごとのデータ集計をしてみます。

relms = document.getElementsByClassName("remaining_hours");
aelms = document.getElementsByClassName("assigned_to_id");

if(relms.length > 0){
  names = new Object();
  for(i = 0; i < relms.length; i++){
    if (relms[i].textContent != ""){
      remain = parseFloat(relms[i].textContent);
    } else {
      remain = 0.0;
    }
    aelm_c = aelms[i].getElementsByClassName("t");
    if (aelm_c.length > 0){
      var name = aelm_c[0].textContent;
      
      if (name == ""){
        name = "NoOne";
        //continue;
      }
      if(name in names){
        names[name] += remain;
      } else {
        names[name] = remain;
      }
    }
  }

  var info = "";
  var total = 0.0;
  for(var key in names){
    var token = key.split(" ");
    if (token.length > 1) {
      lastname = token[1];
    } else {
      lastname = key;
    }
    info += lastname + ":" + names[key] + ", ";
    total += names[key];
  }
  info += "Total: " + total;
  
  document.title = info;
}
これを、http://redmineパス/rb/taskboards/*  で有効にしてやると、かんばんの画面を開くと苗字:残り時間合計 がタイトルバーにずらずらと並びます。
便利!

Javascriptはほとんど使ったことがないので怪しいところだらけかとは思いますが、動いていますので質についてはご容赦を(自由に改変してください)。
こういうのって今流行のGithubとかで公開するといいのかな。

※今サーバーにアクセス出来ないところで書いているので、スクリーンショット取れず。すんません。


1 件のコメント:

  1. 環境を書き忘れました。
    Ubuntu 14.04 server上で構築しています。
    ・Bitnami Redmine 2.6.5-0 (3系はインストール失敗)
    ・Backlog v1.0.6

    返信削除