Redmineのカレンダーの休日に色を付ける

 ふと思い立って、会社のプロジェクトでRedmineを導入してみた(テスト導入的な)。目的はタスク管理+カレンダーによる可視化、プラスアルファで各メンバが持っている作業をもっとアピールして欲しい、です。目的のカレンダー機能ですが、休日に色がつかない模様です。ちょっぴり改造してカレンダーの休日に色を付けてみましたのでメモとして残しておこうと思います。本当は洒落たプラグインを入れたりするのが楽なんでしょうが、会社の環境では外部のネットワークに繋がらないので、ハックしたほうが楽だったりするわけです。

 ちなみにデフォルト画面はこんな感じ。当日の黄色とカレンダー表示月以外の灰色はCSSをいじくって若干濃くしています(後述)。

f:id:suwork:20130904003445p:plain

Redmineについて(あまり関係ないので読み飛ばしても)

 会社ではかなりクローズドな環境なので外部のネットワークに繋がりません。ので、BitNamiのInstallerを使ってさくっとインストール。

BitNami Redminehttp://bitnami.com/stack/redmine

 この記事を執筆するのにあたって、Windows7 64bit+Ruby2↑+sqlite3(のちにMysql)で環境構築しようとしましたが、sqlite3もMysqlRubyのドライバーがインストール出来ない不具合*1が発生。結局、vmwareにCentOS6.4をインストールして環境構築をしました。

Redmine.JP Blog:http://blog.redmine.jp/articles/2_3/installation_centos/

 

カレンダーに色を付ける

 以下のページを参考にさせて頂いております。

Redmine hack! -カレンダーに休日色を-:http://fmkt.blog65.fc2.com/blog-entry-37.html

 まずは祝日を取得できるようにするため、Rubyのdate2ライブラリをインストールします。所定のページからtar.gzをダウンロード、解凍、インストールをするだけです。wgetするファイルはリンク先のページを確認して、最新版になるようにして下さい。BitNami版では、tar.gzを解凍して、Rubyのlibディレクトリあたりに手で配置しました。

date2:http://www.funaba.org/ruby.html#date2

# wget http://www.funaba.org/archive/date2-4.0.19.tar.gz
# gunzip date2-4.0.19.tar.gz
# tar -xvf date2-4.0.19.tar
# cd date2-4.0.19
# ruby install.rb
/redmine-2.3.2/public/stylesheets/application.css

 環境構築したマシンによってファイルのパスが若干異なるかもしれませんので、適宜読み替えて下さい。一応、BitNami版(Windows)と通常パッケージ版(Linux)では同じでした。休日の色(.holiday)と、休日+カレンダーの表示月以外となった場合の色(.odd.holiday)を指定します。追加で.odd(表示月以外)と.today(当日)の色を若干濃くしています。行数は参考程度で。

234 .odd {background-color: #e3e4e5;}
235 .even {background-color: #fff;}
236 .holiday {background-color: #ff9999;}
237 .odd.holiday {background-color: #e3e4e5;}
...
665 table.cal td.today {background:#ffff99;}
/redmine-2.3.2/app/views/common/_calendar.html.erb

 休日の色を表示するクラスを出力するようにします。10行目でcalendar.holiday?メソッドを呼び出すようにし、休日であれば、「holiday」クラスを出力するようにします。

010 <td class="<%= day.month==calendar.month ? 'even' : 'odd' %><%= ' today' if Date.today == day %><%= ' holiday' if calendar.holiday?(day) %>">
/redmine-2.3.2/lib/redmine/helpers/calendar.rb

 最後に、erbから呼び出したメソッド「.holiday?」をCalendarクラスに実装します。dateとdate/holidayのrequireを忘れずに。日本語コメントを入れる場合は、UTF8で保存しましょう。

018 require 'date'
019 require 'date/holiday'
...
068 # 休日(祝日含む)であれば、trueを返却
069 def holiday?(day)
070 
071   # 土日であれば、trueを返却
072   # それ以外であれば、処理を続行
073   # 0 = 日曜 ... 6 = 土曜
074   case day.wday
075   when 0
076     return true
077   when 6
078     return true
079   end
080 
081   # 祝日であれば、trueを返却
082   # それ以外であれば、falseを返却
083   if day.national_holiday?
084       return true
085   else
086       return false
087   end
088 end

 

 あとはサービスを起動しなおせば、休日が休日色になっているはずです。なお、色の強さは、

当日(黄色)>表示月以外(グレー)>休日(ピンク色)>平日(白)

となっています。その辺はCSSの設定をいじくれば変更できるはずです。お好みでどうぞ。

f:id:suwork:20130904012701p:plain

 

 今回、初めてRubyを触ったのですが、大変軽快でよろしいなと思いましたね。セミコロンを書かないだけでこんなに気楽になるものかと。初めてのRubyなので、Ruby的でない書き方だったらゴメンナサイ。それでは。

*1:自分的不具合だと思ってますが、あんなにボンボン落ちられても困る!