[自分用メモ] Redmineのガントチャートのデフォルト開始月を当月の1ヶ月前にする修正

[Sponsored Link]


当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

Redmineの、特にガントチャートに関する修正要求が職場で結構多い。rubyは使ったことも勉強したこともないのだけれど、それでも要求に応じて修正をしなければならない。まあエンジニアとしてある程度好きにやらせてもらっている以上はdutyを払う必要はあると思っているので、こういうことも嫌がらずにやるしかないのである。


今回の修正は特に難しくはない。
ガントチャートの表示の際、デフォルトでは当月からの表示になっているのだが、これを前月からにしてほしいという。
「月頭は便利だけれど、月の終わりだと不便にならないですか?」
「構いません、修正してください」
ということで要求が出たので修正。

この手のはどうせ変数初期化のあたりで表示開始月を指定しているに決まっているので、redmine/lib/redmine/helpers/gantt.rbをviで開いて「month」で検索を掛けてみた。
やはり最初にヒットしたのが、

      attr_reader :year_from, :month_from, :date_from, :date_to, :zoom, :months, :truncated, :max_rows

という行だった。ていうか検索かける以前に、のっけから目に飛び込んできたほど最初の行だったんだけれど。
そしてもうこれしかないっしょ、っていうほどキーワード的に「month_from」という変数が定義されているので、これを調べていくと、直下にあるinitialize()メソッドがまさにそれで、ここで初期値を与えられている。
で、この部分がその処理に該当しそうだ。

        if options[:year] && options[:year].to_i >0
          @year_from = options[:year].to_i
          if options[:month] && options[:month].to_i >=1 && options[:month].to_i <= 12
            @month_from = options[:month].to_i
          else
            @month_from = 1
          end
        else
          @month_from ||= Date.today.month
          @year_from ||= Date.today.year
        end
[Sponsored Link]


年を条件に分岐をしている。年が指定されていて0より大きければ(たぶん.to_iってのはto integerなんだろうな……)、年を考慮した処理をするということなんだろう。
私が依頼されているのはデフォルト表示の場合だけなので、else~endの間の値に加工を施せばいいことがわかる。
従って、以下のように修正した(diffコマンドによる出力)。

$ diff gantt.rb.OLD gantt.rb
53,54c53,61
<           @month_from ||= Date.today.month
<           @year_from ||= Date.today.year
---
>           #@month_from ||= Date.today.month
>           #@year_from ||= Date.today.year
>           if Date.today.month == 1
>             @month_from ||= 12
>             @year_from ||= Date.today.year - 1
>           else
>             @month_from ||= Date.today.month - 1
>             @year_from ||= Date.today.year
>           end

単純に-1すると当月が1月の場合0月になってしまうので、当月が1月の場合は前年の12月にする処理を入れている。条件式を使うと(人によっては?)表記上美しいかもしれないけれど、年も-1する必要が出てくるので、条件式を2行書くよりは普通にif文で処理させるほうが条件判断に掛かる計算コストが半減することから素直にif文で処理した。
また、修正を明確にするためにも、オリジナルの2行はコメントアウトしてその直下にif文を追加している。

パーフェクトRuby (PERFECT SERIES 6)Redmine超入門 (日経BPムック)入門Redmine 第3版たのしいRuby 第4版Re-Cool Reflections

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。


Atsushi Ezura について

ナチュラルな女性のしぐさや表情を撮りたいIT系エンジニア。女性モデル募集中プロフィール
カテゴリー: Hack, Redmine, ruby, コンピュータ, ソフトウェア タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。