RedmineのEasy Ganttの関連付けを改善してみる

技術
この記事は約12分で読めます。

皆さんRedmine使われてますか。

弊社では複数のRedmineが稼働しており、その一つをようやく最新(と言っても3系ですが)にしたので、Easy Ganttのフリー版をインストールしてみました。

Easy Ganttのガントチャートイメージ

ガントチャート上でタスクをグリグリ動かせるのは楽しいですよね(現場としては楽しくないか)。いや、作業がとっても楽になりますよね。そうなると使いたくなるのがEasy Ganttで拡張された関連付けです。

他のプロジェクト管理ツールで使われる、Start to Start(SSあるいは開始-開始), Start to Finish(SFあるいは開始-終了), Finish to Finish(FFあるいは終了-終了)が使えます。

これでPMBOKに準拠したWBSも作れるゼ!とは思わなかったですが、便利に使えそうだと思いました。ところが!これ、依存の向きがチケットで表示されないのです。依存元も依存先も同じ関連付け名なのですよ。

Easy Gantt関連付けの例

Redmineならば、こういう関連付けですよね。

  • 関連している⇔関連している (同じで良い)
  • 次のチケット重複 ⇔ 次のチケット重複
  • ブロック⇔ ブロック
  • 次のチケットに先行 ⇔ 次のチケットに後続
  • コピー⇔ コピー

ということでハッキングタイムです。

Easy Ganttの処理確認

まずはライセンス確認です。遵法精神は大事です。

LICENCE

All Easy Redmine Extensions are distributed under GNU/GPL 2 license (see below).
If not otherwise stated, all images, cascading style sheets, and included JavaScript are NOT GPL, and are released under the Easy Redmine Commercial Use License (see below).

GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
(以下略)

ソースはGPL2ですね。大丈夫です。では参りましょう。

「開始-開始」といった文字列をgrepしてみます。easy_gantt/config/locales/ja.ymlにありました。

label_finish_to_finish: 終了‐終了
label_parent_issue_plural: 親タスク
label_start_to_finish: 開始‐終了
label_start_to_start: 開始‐開始

となるとlabel_start_to_startは?ということでeasy_gantt/lib/easy_gantt/redmine_patch/models/issue_relation_patch.rbが参照しています。

start_to_start = 'start_to_start'
finish_to_finish = 'finish_to_finish'
start_to_finish = 'start_to_finish'

new_types = base::TYPES.merge(

    start_to_start => {
      name: :label_start_to_start,
      sym_name: :label_start_to_start,
      order: 20,
      sym: start_to_start
    },

    finish_to_finish => {
      name: :label_finish_to_finish,
      sym_name: :label_finish_to_finish,
      order: 21,
      sym: finish_to_finish
    },

    start_to_finish => {
      name: :label_start_to_finish,
      sym_name: :label_start_to_finish,
      order: 22,
      sym: start_to_finish
    }

  )

なるほどbase::TYPESにmergeしてる訳ですね。mergeしているのは、名称とかだけで、機能は別途と。これは楽ちんかもしれません。

次はRedmineオリジナル側の処理ですが、app/models/issue_relation.rbに処理がありました。

TYPE_RELATES      = "relates"
TYPE_DUPLICATES   = "duplicates"
TYPE_DUPLICATED   = "duplicated"
TYPE_BLOCKS       = "blocks"
TYPE_BLOCKED      = "blocked"
TYPE_PRECEDES     = "precedes"
TYPE_FOLLOWS      = "follows"
TYPE_COPIED_TO    = "copied_to"
TYPE_COPIED_FROM  = "copied_from"

TYPES = {
  TYPE_RELATES =>     { :name => :label_relates_to, :sym_name => :label_relates_to,
                        :order => 1, :sym => TYPE_RELATES },
  TYPE_DUPLICATES =>  { :name => :label_duplicates, :sym_name => :label_duplicated_by,
                        :order => 2, :sym => TYPE_DUPLICATED },
  TYPE_DUPLICATED =>  { :name => :label_duplicated_by, :sym_name => :label_duplicates,
                        :order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES },
  TYPE_BLOCKS =>      { :name => :label_blocks, :sym_name => :label_blocked_by,
                        :order => 4, :sym => TYPE_BLOCKED },
  TYPE_BLOCKED =>     { :name => :label_blocked_by, :sym_name => :label_blocks,
                        :order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS },
  TYPE_PRECEDES =>    { :name => :label_precedes, :sym_name => :label_follows,
                        :order => 6, :sym => TYPE_FOLLOWS },
  TYPE_FOLLOWS =>     { :name => :label_follows, :sym_name => :label_precedes,
                        :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES },
  TYPE_COPIED_TO =>   { :name => :label_copied_to, :sym_name => :label_copied_from,
                        :order => 8, :sym => TYPE_COPIED_FROM },
  TYPE_COPIED_FROM => { :name => :label_copied_from, :sym_name => :label_copied_to,
                        :order => 9, :sym => TYPE_COPIED_TO, :reverse => TYPE_COPIED_TO }
}.freeze

先程見かけなかったreverseというキーがあります。なるほど。ということでハックしましょう。

Easy Ganttのハッキング

新しい関連づけ項目が増えるので文字列が追加になります。最低限 easy_gantt/config/locales の ja.yml と en.yml を修正すれば大丈夫でしょう。几帳面な方は全言語どうぞ。

label_finish_to_finish_precede: 終了-終了で先行
label_start_to_finish_precede: 開始-終了で先行
label_start_to_start_precede: 開始-開始で先行
label_finish_to_finish_follow: 終了-終了で後続
label_start_to_finish_follow: 開始-終了で後続
label_start_to_start_follow: 開始-開始で後続
label_finish_to_finish_precede: Finish to finish precede
label_start_to_finish_precede: Start to finish precede
label_start_to_start_precede: Start to start precede
label_finish_to_finish_follow: Finish to finish follow
label_start_to_finish_follow: Start to finish follow
label_start_to_start_follow: Start to start follow

やっつけな名称ですが、まあ判れば良いので。そして、関連付けの設定は以下のようにしておきます。 (easy_gantt/lib/easy_gantt/redmine_patch/models/issue_relation_patch.rbです)

start_to_start = 'start_to_start'
finish_to_finish = 'finish_to_finish'
start_to_finish = 'start_to_finish'
start_to_start_follow = 'start_to_start_follow'
finish_to_finish_follow = 'finish_to_finish_follow'
start_to_finish_follow = 'start_to_finish_follow'

new_types = base::TYPES.merge(

    start_to_start => {
      name: :label_start_to_start_precede,
      sym_name: :label_start_to_start_follow,
      order: 20,
      sym: start_to_start_follow
    },

    finish_to_finish => {
      name: :label_finish_to_finish_precede,
      sym_name: :label_finish_to_finish_follow,
      order: 21,
      sym: finish_to_finish_follow
    },

    start_to_finish => {
      name: :label_start_to_finish_precede,
      sym_name: :label_start_to_finish_follow,
      order: 22,
      sym: start_to_finish_follow
    },

    start_to_start_follow => {
      name: :label_start_to_start_follow,
      sym_name: :label_start_to_start_precede,
      order: 23,
      sym: start_to_start,
      reverse: start_to_start
    },

    finish_to_finish_follow => {
      name: :label_finish_to_finish_follow,
      sym_name: :label_finish_to_finish_precede,
      order: 24,
      sym: finish_to_finish,
      reverse: finish_to_finish
    },

    start_to_finish_follow => {
      name: :label_start_to_finish_follow,
      sym_name: :label_start_to_finish_precede,
      order: 25,
      sym: start_to_finish,
      reverse: start_to_finish
    }

  )

配列だけ修正してもそこから参照されているstart_to_start_followが無いとか怒られるので、適当な文字列を定義しておきましょう。試してみてエラーが出たら考えるようにします(超適当)。

そうしたらRedmineを再起動。ほら!

Easy Gantt関連付け変更後

もっと良い表示名を模索中ですが、とりあえずこれでも十分です。

Easy Gantt関連付け改善パッチ

というわけでパッチファイルはこちらからダウンロードできます。パッチの使い方は適当にググってくださいませ。

Enjoy Redmine Life !!