ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

Redmineのガントチャート・pdf出力をカスタマイズ

Redmineガントチャートはデフォルトでは日付が表示されずモヤモヤしてたので表示できるようにしました。

また、ガントチャートで日付が表示されるようにしてもPDF出力には反映されないためそちらも色々と変更して自分なりに使い易いようにしてみました。

■参考URL
IT Room - Redmineのガントチャートに日付の表示を追加

変更点概要

ガントチャートに日付表示
・pdfに日付表示
・pdfの印刷サイズ変更
・pdfに担当者名表示
・pdfの土日に色付け
・pdfの印刷日の日付に◆マーク表示
・pdfの左側の項目欄サイズを若干変更

変更後イメージ

ガントチャート
f:id:dameninngenn_owata:20120814205434p:plain:w505

■PDF
f:id:dameninngenn_owata:20120814205457p:plain:w510

変更対象ファイル

Redmine 0.9.2
redmine/app/views/issues/gantt.rhtml
redmine/lib/redmine/export/pdf.rb
redmine/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb

ソース変更点

・「+」→追加
・「-」→削除
・「!」→変更

redmine/app/views/issues/gantt.rhtml


1 +-- 48 行:<h2><%= l(:label_gantt) </h2>
49 subject_width = 330
50 header_heigth = 18
51
52 headers_height = header_heigth
53 show_weeks = false
54 show_days = false
55 show_day_num = false
56
57 if @gantt.zoom >1
58 show_weeks = true
59 headers_height = 2*header_heigth
60 if @gantt.zoom > 2
61 show_days = true
62 headers_height = 3*header_heigth
63 if @gantt.zoom > 3
64 show_day_num = true
65 headers_height = 4*header_heigth
66 end
67 end
68 end
69
70 g_width = (@gantt.date_to - @gantt.date_from + 1)*zoom
71 g_height = [(20 * @gantt.events.length + 6)+150, 206].max
72 t_height = g_height + headers_height
73 +-- 78 行:
151 <%
152 left = left + width+1
153 week_f = week_f+7
154 end
155 end %>
156
157 <%
158 #
159 # Days headers Num
160 #
161 if show_day_num
162 left = 0
163 height = g_height + header_heigth*2 - 1
164 wday = @gantt.date_from.cwday
165 day_num = @gantt.date_from
166 (@gantt.date_to - @gantt.date_from + 1).to_i.times do
167 width = zoom - 1
168 %>
169 <div style="left:<%= left %>px;top:37px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %><%= "color:blue;" if wday == 6 %><%= "color:red;" if wday == 7 %>" class="gantt_hdr">
170 <%= day_num.day %>
171 </div>
172 <%
173 left = left + width+1
174 day_num = day_num + 1
175 wday = wday + 1
176 wday = 1 if wday > 7
177 end
178 end %>
179
180 <%
181 #
182 # Days headers
183 #
184 if show_days
185 left = 0
186 height = g_height + header_heigth - 1
187 top = (show_day_num ? 55 : 37)
188 wday = @gantt.date_from.cwday
189 (@gantt.date_to - @gantt.date_from + 1).to_i.times do
190 width = zoom - 1
191 %>
!192 <div style="left:<%= left %>px;top:<%= top %>px;width:<%= width %>px;height:<%= height %>px;font-size:0.7em;<%= "background:#f1f1f1;" if wday > 5 %><%= "color:blue;" if wday == 6 %><%= "color:red;" if wday == 7 %>" class="gantt_hdr">
193 <%= day_name(wday).first %>
194 </div>
195 <%
196 left = left + width+1
197 wday = wday + 1
198 wday = 1 if wday > 7
199 +-- 82 行:end

redmine/lib/redmine/export/pdf.rb


1 +--319 行:encoding: utf-8
320 pdf.footer_date = format_date( Date.today)
321 pdf.AddPage("L")
322 pdf.SetFontStyle('B',12)
323 pdf.SetX(15)
324 pdf.Cell(70, 20, project.to_s)
325 pdf.Ln
!326 pdf.SetFontStyle('B',8)
327
!328 subject_width = 85 #dame
329 header_heigth = 5
330
331 headers_heigth = header_heigth
332 show_weeks = false
333 show_days = false
334
335 if gantt.months < 7
336 show_weeks = true
337 headers_heigth = 2*header_heigth
!338 #if gantt.months < 3
339 show_days = true
!340 # headers_heigth = 3*header_heigth
341 headers_heigth = 4*header_heigth
!342 #end
343 end
344
!345 #g_width = 210
346 g_width = 310
347 zoom = (g_width) / (gantt.date_to - gantt.date_from + 1)
348 g_height = 120
349 t_height = g_height + headers_heigth
350
351 y_start = pdf.GetY
352
353 +-- 38 行:Months headers
391
392 # Days headers
393 if show_days
394 left = subject_width
395 height = header_heigth
396 wday = gantt.date_from.cwday
397 day_num = gantt.date_from
!398 pdf.SetFontStyle('B',6)
399 (gantt.date_to - gantt.date_from + 1).to_i.times do
400 width = zoom
401 if wday == 6
402 pdf.SetTextColor(0,0,255)
403 elsif wday == 7
404 pdf.SetTextColor(255,0,0)
405 end
406 pdf.SetY(y_start + 2 * header_heigth)
407 pdf.SetX(left)
408 pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
409 pdf.SetY(y_start + 3 * header_heigth)
410 pdf.SetX(left)
411 pdf.Cell(width, height, day_num.day.to_s, "LTR", 0, "C")
412 day_num = day_num + 1
413 left = left + width
414 wday = wday + 1
415 wday = 1 if wday > 7
416 pdf.SetTextColor(0,0,0)
417 end
418 end
419
420 pdf.SetY(y_start)
421 pdf.SetX(15)
422 pdf.Cell(subject_width+g_width-15, headers_heigth, "", 1)
423
424 # Tasks
425 top = headers_heigth + y_start
!426 pdf.SetFontStyle('B',5)
427 gantt.events.each do |i|
428 pdf.SetY(top)
429 pdf.SetX(15)
430
431 if i.is_a? Issue
432 pdf.Cell(subject_width-15, 5, "#{i.tracker} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), "LR")
433 +-- 19 行:else
452
453 i_left = ((i_start_date - gantt.date_from)*zoom)
454 i_width = ((i_end_date - i_start_date + 1)*zoom)
455 d_width = ((i_done_date - i_start_date)*zoom)
456 l_width = ((i_late_date - i_start_date+1)*zoom) if i_late_date
457 l_width ||= 0
458 today_position = ((Date.today - gantt.date_from)*zoom)
459
460 pdf.SetX(subject_width + i_left)
461 pdf.SetFillColor(200,200,200)
462 pdf.Cell(i_width, 2, "", 0, 0, "", 1)
463
464 if l_width > 0
465 +-- 8 行:pdf.SetY(top+1.5)
473 pdf.SetFillColor(100,100,255)
474 pdf.Cell(d_width, 2, "", 0, 0, "", 1)
475 end
476
477 pdf.SetY(top+1.5)
478 pdf.SetX(subject_width + i_left + i_width)
!479 pdf.Cell(30, 2, "#{i.status} #{i.done_ratio}% (#{i.assigned_to})")
480 else
481 i_left = ((i.start_date - gantt.date_from)*zoom)
482
483 pdf.SetX(subject_width + i_left)
484 pdf.SetFillColor(50,200,50)
485 pdf.Cell(2, 2, "", 0, 0, "", 1)
486
487 pdf.SetY(top+1.5)
488 pdf.SetX(subject_width + i_left + 3)
489 pdf.Cell(30, 2, "#{i.name}")
490 end
491
492 pdf.SetY(top+1.5)
493 pdf.SetX(subject_width + today_position)
494 pdf.SetTextColor(100,100,100)
495 pdf.Cell(30, 2, "")
496 pdf.SetTextColor(0,0,0)
497
498 top = top + 5
499 pdf.SetDrawColor(200, 200, 200)
500 pdf.Line(15, top, subject_width+g_width, top)
!501 if pdf.GetY() > 270
502 pdf.AddPage("L")
503 top = 20
504 pdf.Line(15, top, subject_width+g_width, top)
505 end
506 pdf.SetDrawColor(0, 0, 0)
507 end
508 +-- 7 行:pdf.Line(15, top, subject_width+g_width, top)

redmine/vendor/plugins/rfpdf/lib/rfpdf/fpdf.rb


1 +-- 56 行:Ruby FPDF 1.53d
57
! 58 #def initialize(orientation='P', unit='mm', format='A4')
59 def initialize(orientation='P', unit='mm', format='A3')
60 # Initialization of properties
61 @page=0
62 @n=2
63 @buffer=''
64 @pages=
65 @OrientationChanges=

66 +--1486 行:@state=0