皆さんRedmine使われてますか。
弊社では複数のRedmineが稼働しており、その一つをようやく最新(と言っても3系ですが)にしたので、Easy Ganttのフリー版をインストールしてみました。
ガントチャート上でタスクをグリグリ動かせるのは楽しいですよね(現場としては楽しくないか)。いや、作業がとっても楽になりますよね。そうなると使いたくなるのがEasy Ganttで拡張された関連付けです。
他のプロジェクト管理ツールで使われる、Start to Start(SSあるいは開始-開始), Start to Finish(SFあるいは開始-終了), Finish to Finish(FFあるいは終了-終了)が使えます。
これでPMBOKに準拠したWBSも作れるゼ!とは思わなかったですが、便利に使えそうだと思いました。ところが!これ、依存の向きがチケットで表示されないのです。依存元も依存先も同じ関連付け名なのですよ。
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関連付け改善パッチ
というわけでパッチファイルはこちらからダウンロードできます。パッチの使い方は適当にググってくださいませ。
Enjoy Redmine Life !!