##// END OF EJS Templates
code clean up lib/redmine/export/pdf.rb....
Toshi MARUYAMA -
r5215:91e4d7d29878
parent child
Show More
@@ -1,400 +1,400
1 # encoding: utf-8
1 # encoding: utf-8
2 #
2 #
3 # Redmine - project management software
3 # Redmine - project management software
4 # Copyright (C) 2006-2009 Jean-Philippe Lang
4 # Copyright (C) 2006-2009 Jean-Philippe Lang
5 #
5 #
6 # This program is free software; you can redistribute it and/or
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
9 # of the License, or (at your option) any later version.
10 #
10 #
11 # This program is distributed in the hope that it will be useful,
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
14 # GNU General Public License for more details.
15 #
15 #
16 # You should have received a copy of the GNU General Public License
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
19
20 require 'iconv'
20 require 'iconv'
21 require 'rfpdf/fpdf'
21 require 'rfpdf/fpdf'
22 require 'fpdf/chinese'
22 require 'fpdf/chinese'
23 require 'fpdf/japanese'
23 require 'fpdf/japanese'
24 require 'fpdf/korean'
24 require 'fpdf/korean'
25
25
26 module Redmine
26 module Redmine
27 module Export
27 module Export
28 module PDF
28 module PDF
29 include ActionView::Helpers::TextHelper
29 include ActionView::Helpers::TextHelper
30 include ActionView::Helpers::NumberHelper
30 include ActionView::Helpers::NumberHelper
31
31
32 class ITCPDF < TCPDF
32 class ITCPDF < TCPDF
33 include Redmine::I18n
33 include Redmine::I18n
34 attr_accessor :footer_date
34 attr_accessor :footer_date
35
35
36 def initialize(lang)
36 def initialize(lang)
37 super()
37 super()
38 set_language_if_valid lang
38 set_language_if_valid lang
39 @font_for_content = 'FreeSans'
39 @font_for_content = 'FreeSans'
40 @font_for_footer = 'FreeSans'
40 @font_for_footer = 'FreeSans'
41 SetCreator(Redmine::Info.app_name)
41 SetCreator(Redmine::Info.app_name)
42 SetFont(@font_for_content)
42 SetFont(@font_for_content)
43 end
43 end
44
44
45 def SetFontStyle(style, size)
45 def SetFontStyle(style, size)
46 SetFont(@font_for_content, style, size)
46 SetFont(@font_for_content, style, size)
47 end
47 end
48
48
49 def SetTitle(txt)
49 def SetTitle(txt)
50 txt = begin
50 txt = begin
51 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
51 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
52 hextxt = "<FEFF" # FEFF is BOM
52 hextxt = "<FEFF" # FEFF is BOM
53 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
53 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
54 hextxt << ">"
54 hextxt << ">"
55 rescue
55 rescue
56 txt
56 txt
57 end || ''
57 end || ''
58 super(txt)
58 super(txt)
59 end
59 end
60
60
61 def textstring(s)
61 def textstring(s)
62 # Format a text string
62 # Format a text string
63 if s =~ /^</ # This means the string is hex-dumped.
63 if s =~ /^</ # This means the string is hex-dumped.
64 return s
64 return s
65 else
65 else
66 return '('+escape(s)+')'
66 return '('+escape(s)+')'
67 end
67 end
68 end
68 end
69
69
70 alias RDMCell Cell
70 alias RDMCell Cell
71 alias RDMMultiCell MultiCell
71 alias RDMMultiCell MultiCell
72
72
73 def Footer
73 def Footer
74 SetFont(@font_for_footer, 'I', 8)
74 SetFont(@font_for_footer, 'I', 8)
75 SetY(-15)
75 SetY(-15)
76 SetX(15)
76 SetX(15)
77 RDMCell(0, 5, @footer_date, 0, 0, 'L')
77 RDMCell(0, 5, @footer_date, 0, 0, 'L')
78 SetY(-15)
78 SetY(-15)
79 SetX(-30)
79 SetX(-30)
80 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
80 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
81 end
81 end
82 end
82 end
83
83
84 class IFPDF < FPDF
84 class IFPDF < FPDF
85 include Redmine::I18n
85 include Redmine::I18n
86 attr_accessor :footer_date
86 attr_accessor :footer_date
87
87
88 def initialize(lang)
88 def initialize(lang)
89 super()
89 super()
90 set_language_if_valid lang
90 set_language_if_valid lang
91 case current_language.to_s.downcase
91 case current_language.to_s.downcase
92 when 'ko'
92 when 'ko'
93 extend(PDF_Korean)
93 extend(PDF_Korean)
94 AddUHCFont()
94 AddUHCFont()
95 @font_for_content = 'UHC'
95 @font_for_content = 'UHC'
96 @font_for_footer = 'UHC'
96 @font_for_footer = 'UHC'
97 when 'ja'
97 when 'ja'
98 extend(PDF_Japanese)
98 extend(PDF_Japanese)
99 AddSJISFont()
99 AddSJISFont()
100 @font_for_content = 'SJIS'
100 @font_for_content = 'SJIS'
101 @font_for_footer = 'SJIS'
101 @font_for_footer = 'SJIS'
102 when 'zh'
102 when 'zh'
103 extend(PDF_Chinese)
103 extend(PDF_Chinese)
104 AddGBFont()
104 AddGBFont()
105 @font_for_content = 'GB'
105 @font_for_content = 'GB'
106 @font_for_footer = 'GB'
106 @font_for_footer = 'GB'
107 when 'zh-tw'
107 when 'zh-tw'
108 extend(PDF_Chinese)
108 extend(PDF_Chinese)
109 AddBig5Font()
109 AddBig5Font()
110 @font_for_content = 'Big5'
110 @font_for_content = 'Big5'
111 @font_for_footer = 'Big5'
111 @font_for_footer = 'Big5'
112 else
112 else
113 @font_for_content = 'Arial'
113 @font_for_content = 'Arial'
114 @font_for_footer = 'Helvetica'
114 @font_for_footer = 'Helvetica'
115 end
115 end
116 SetCreator(Redmine::Info.app_name)
116 SetCreator(Redmine::Info.app_name)
117 SetFont(@font_for_content)
117 SetFont(@font_for_content)
118 end
118 end
119
119
120 def SetFontStyle(style, size)
120 def SetFontStyle(style, size)
121 SetFont(@font_for_content, style, size)
121 SetFont(@font_for_content, style, size)
122 end
122 end
123
123
124 def SetTitle(txt)
124 def SetTitle(txt)
125 txt = begin
125 txt = begin
126 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
126 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
127 hextxt = "<FEFF" # FEFF is BOM
127 hextxt = "<FEFF" # FEFF is BOM
128 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
128 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
129 hextxt << ">"
129 hextxt << ">"
130 rescue
130 rescue
131 txt
131 txt
132 end || ''
132 end || ''
133 super(txt)
133 super(txt)
134 end
134 end
135
135
136 def textstring(s)
136 def textstring(s)
137 # Format a text string
137 # Format a text string
138 if s =~ /^</ # This means the string is hex-dumped.
138 if s =~ /^</ # This means the string is hex-dumped.
139 return s
139 return s
140 else
140 else
141 return '('+escape(s)+')'
141 return '('+escape(s)+')'
142 end
142 end
143 end
143 end
144
144
145 def fix_text_encoding(txt)
145 def fix_text_encoding(txt)
146 @ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
146 @ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
147 txt = begin
147 txt = begin
148 # 0x5c char handling
148 # 0x5c char handling
149 txtar = txt.split('\\')
149 txtar = txt.split('\\')
150 txtar << '' if txt[-1] == ?\\
150 txtar << '' if txt[-1] == ?\\
151 txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
151 txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
152 rescue
152 rescue
153 txt
153 txt
154 end || ''
154 end || ''
155 return txt
155 return txt
156 end
156 end
157
157
158 def RDMCell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
158 def RDMCell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
159 Cell(w,h,fix_text_encoding(txt),border,ln,align,fill,link)
159 Cell(w,h,fix_text_encoding(txt),border,ln,align,fill,link)
160 end
160 end
161
161
162 def RDMMultiCell(w,h=0,txt='',border=0,align='',fill=0)
162 def RDMMultiCell(w,h=0,txt='',border=0,align='',fill=0)
163 MultiCell(w,h,fix_text_encoding(txt),border,align,fill)
163 MultiCell(w,h,fix_text_encoding(txt),border,align,fill)
164 end
164 end
165
165
166 def Footer
166 def Footer
167 SetFont(@font_for_footer, 'I', 8)
167 SetFont(@font_for_footer, 'I', 8)
168 SetY(-15)
168 SetY(-15)
169 SetX(15)
169 SetX(15)
170 RDMCell(0, 5, @footer_date, 0, 0, 'L')
170 RDMCell(0, 5, @footer_date, 0, 0, 'L')
171 SetY(-15)
171 SetY(-15)
172 SetX(-30)
172 SetX(-30)
173 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
173 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
174 end
174 end
175 alias alias_nb_pages AliasNbPages
175 alias alias_nb_pages AliasNbPages
176 end
176 end
177
177
178 # Returns a PDF string of a list of issues
178 # Returns a PDF string of a list of issues
179 def issues_to_pdf(issues, project, query)
179 def issues_to_pdf(issues, project, query)
180 if ( current_language.to_s.downcase == 'ko' ||
180 if ( current_language.to_s.downcase == 'ko' ||
181 current_language.to_s.downcase == 'ja' ||
181 current_language.to_s.downcase == 'ja' ||
182 current_language.to_s.downcase == 'zh' ||
182 current_language.to_s.downcase == 'zh' ||
183 current_language.to_s.downcase == 'zh-tw' ||
183 current_language.to_s.downcase == 'zh-tw' ||
184 current_language.to_s.downcase == 'th' )
184 current_language.to_s.downcase == 'th' )
185 pdf = IFPDF.new(current_language)
185 pdf = IFPDF.new(current_language)
186 else
186 else
187 pdf = ITCPDF.new(current_language)
187 pdf = ITCPDF.new(current_language)
188 end
188 end
189 title = query.new_record? ? l(:label_issue_plural) : query.name
189 title = query.new_record? ? l(:label_issue_plural) : query.name
190 title = "#{project} - #{title}" if project
190 title = "#{project} - #{title}" if project
191 pdf.SetTitle(title)
191 pdf.SetTitle(title)
192 pdf.alias_nb_pages
192 pdf.alias_nb_pages
193 pdf.footer_date = format_date(Date.today)
193 pdf.footer_date = format_date(Date.today)
194 pdf.AddPage("L")
194 pdf.AddPage("L")
195
195
196 row_height = 6
196 row_height = 6
197 col_width = []
197 col_width = []
198 unless query.columns.empty?
198 unless query.columns.empty?
199 col_width = query.columns.collect {|column| column.name == :subject ? 4.0 : 1.0 }
199 col_width = query.columns.collect {|column| column.name == :subject ? 4.0 : 1.0 }
200 ratio = 262.0 / col_width.inject(0) {|s,w| s += w}
200 ratio = 262.0 / col_width.inject(0) {|s,w| s += w}
201 col_width = col_width.collect {|w| w * ratio}
201 col_width = col_width.collect {|w| w * ratio}
202 end
202 end
203
203
204 # title
204 # title
205 pdf.SetFontStyle('B',11)
205 pdf.SetFontStyle('B',11)
206 pdf.RDMCell(190,10, title)
206 pdf.RDMCell(190,10, title)
207 pdf.Ln
207 pdf.Ln
208
208
209 # headers
209 # headers
210 pdf.SetFontStyle('B',8)
210 pdf.SetFontStyle('B',8)
211 pdf.SetFillColor(230, 230, 230)
211 pdf.SetFillColor(230, 230, 230)
212 pdf.RDMCell(15, row_height, "#", 1, 0, 'L', 1)
212 pdf.RDMCell(15, row_height, "#", 1, 0, 'L', 1)
213 query.columns.each_with_index do |column, i|
213 query.columns.each_with_index do |column, i|
214 pdf.RDMCell(col_width[i], row_height, column.caption, 1, 0, 'L', 1)
214 pdf.RDMCell(col_width[i], row_height, column.caption, 1, 0, 'L', 1)
215 end
215 end
216 pdf.Ln
216 pdf.Ln
217
217
218 # rows
218 # rows
219 pdf.SetFontStyle('',8)
219 pdf.SetFontStyle('',8)
220 pdf.SetFillColor(255, 255, 255)
220 pdf.SetFillColor(255, 255, 255)
221 previous_group = false
221 previous_group = false
222 issues.each do |issue|
222 issues.each do |issue|
223 if query.grouped? &&
223 if query.grouped? &&
224 (group = query.group_by_column.value(issue)) != previous_group
224 (group = query.group_by_column.value(issue)) != previous_group
225 pdf.SetFontStyle('B',9)
225 pdf.SetFontStyle('B',9)
226 pdf.RDMCell(277, row_height,
226 pdf.RDMCell(277, row_height,
227 (group.blank? ? 'None' : group.to_s) + " (#{query.issue_count_by_group[group]})",
227 (group.blank? ? 'None' : group.to_s) + " (#{query.issue_count_by_group[group]})",
228 1, 1, 'L')
228 1, 1, 'L')
229 pdf.SetFontStyle('',8)
229 pdf.SetFontStyle('',8)
230 previous_group = group
230 previous_group = group
231 end
231 end
232 pdf.RDMCell(15, row_height, issue.id.to_s, 1, 0, 'L', 1)
232 pdf.RDMCell(15, row_height, issue.id.to_s, 1, 0, 'L', 1)
233 query.columns.each_with_index do |column, i|
233 query.columns.each_with_index do |column, i|
234 s = if column.is_a?(QueryCustomFieldColumn)
234 s = if column.is_a?(QueryCustomFieldColumn)
235 cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
235 cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
236 show_value(cv)
236 show_value(cv)
237 else
237 else
238 value = issue.send(column.name)
238 value = issue.send(column.name)
239 if value.is_a?(Date)
239 if value.is_a?(Date)
240 format_date(value)
240 format_date(value)
241 elsif value.is_a?(Time)
241 elsif value.is_a?(Time)
242 format_time(value)
242 format_time(value)
243 else
243 else
244 value
244 value
245 end
245 end
246 end
246 end
247 pdf.RDMCell(col_width[i], row_height, s.to_s, 1, 0, 'L', 1)
247 pdf.RDMCell(col_width[i], row_height, s.to_s, 1, 0, 'L', 1)
248 end
248 end
249 pdf.Ln
249 pdf.Ln
250 end
250 end
251 if issues.size == Setting.issues_export_limit.to_i
251 if issues.size == Setting.issues_export_limit.to_i
252 pdf.SetFontStyle('B',10)
252 pdf.SetFontStyle('B',10)
253 pdf.RDMCell(0, row_height, '...')
253 pdf.RDMCell(0, row_height, '...')
254 end
254 end
255 pdf.Output
255 pdf.Output
256 end
256 end
257
257
258 # Returns a PDF string of a single issue
258 # Returns a PDF string of a single issue
259 def issue_to_pdf(issue)
259 def issue_to_pdf(issue)
260 if ( current_language.to_s.downcase == 'ko' ||
260 if ( current_language.to_s.downcase == 'ko' ||
261 current_language.to_s.downcase == 'ja' ||
261 current_language.to_s.downcase == 'ja' ||
262 current_language.to_s.downcase == 'zh' ||
262 current_language.to_s.downcase == 'zh' ||
263 current_language.to_s.downcase == 'zh-tw' ||
263 current_language.to_s.downcase == 'zh-tw' ||
264 current_language.to_s.downcase == 'th' )
264 current_language.to_s.downcase == 'th' )
265 pdf = IFPDF.new(current_language)
265 pdf = IFPDF.new(current_language)
266 else
266 else
267 pdf = ITCPDF.new(current_language)
267 pdf = ITCPDF.new(current_language)
268 end
268 end
269 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
269 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
270 pdf.alias_nb_pages
270 pdf.alias_nb_pages
271 pdf.footer_date = format_date(Date.today)
271 pdf.footer_date = format_date(Date.today)
272 pdf.AddPage
272 pdf.AddPage
273
273
274 pdf.SetFontStyle('B',11)
274 pdf.SetFontStyle('B',11)
275 pdf.RDMCell(190,10,
275 pdf.RDMCell(190,10,
276 "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
276 "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
277 pdf.Ln
277 pdf.Ln
278
278
279 y0 = pdf.GetY
279 y0 = pdf.GetY
280
280
281 pdf.SetFontStyle('B',9)
281 pdf.SetFontStyle('B',9)
282 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
282 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
283 pdf.SetFontStyle('',9)
283 pdf.SetFontStyle('',9)
284 pdf.RDMCell(60,5, issue.status.to_s,"RT")
284 pdf.RDMCell(60,5, issue.status.to_s,"RT")
285 pdf.SetFontStyle('B',9)
285 pdf.SetFontStyle('B',9)
286 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
286 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
287 pdf.SetFontStyle('',9)
287 pdf.SetFontStyle('',9)
288 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
288 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
289 pdf.Ln
289 pdf.Ln
290
290
291 pdf.SetFontStyle('B',9)
291 pdf.SetFontStyle('B',9)
292 pdf.RDMCell(35,5, l(:field_author) + ":","L")
292 pdf.RDMCell(35,5, l(:field_author) + ":","L")
293 pdf.SetFontStyle('',9)
293 pdf.SetFontStyle('',9)
294 pdf.RDMCell(60,5, issue.author.to_s,"R")
294 pdf.RDMCell(60,5, issue.author.to_s,"R")
295 pdf.SetFontStyle('B',9)
295 pdf.SetFontStyle('B',9)
296 pdf.RDMCell(35,5, l(:field_category) + ":","L")
296 pdf.RDMCell(35,5, l(:field_category) + ":","L")
297 pdf.SetFontStyle('',9)
297 pdf.SetFontStyle('',9)
298 pdf.RDMCell(60,5, issue.category.to_s,"R")
298 pdf.RDMCell(60,5, issue.category.to_s,"R")
299 pdf.Ln
299 pdf.Ln
300
300
301 pdf.SetFontStyle('B',9)
301 pdf.SetFontStyle('B',9)
302 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
302 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
303 pdf.SetFontStyle('',9)
303 pdf.SetFontStyle('',9)
304 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
304 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
305 pdf.SetFontStyle('B',9)
305 pdf.SetFontStyle('B',9)
306 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
306 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
307 pdf.SetFontStyle('',9)
307 pdf.SetFontStyle('',9)
308 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
308 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
309 pdf.Ln
309 pdf.Ln
310
310
311 pdf.SetFontStyle('B',9)
311 pdf.SetFontStyle('B',9)
312 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
312 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
313 pdf.SetFontStyle('',9)
313 pdf.SetFontStyle('',9)
314 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
314 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
315 pdf.SetFontStyle('B',9)
315 pdf.SetFontStyle('B',9)
316 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
316 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
317 pdf.SetFontStyle('',9)
317 pdf.SetFontStyle('',9)
318 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
318 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
319 pdf.Ln
319 pdf.Ln
320
320
321 for custom_value in issue.custom_field_values
321 for custom_value in issue.custom_field_values
322 pdf.SetFontStyle('B',9)
322 pdf.SetFontStyle('B',9)
323 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
323 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
324 pdf.SetFontStyle('',9)
324 pdf.SetFontStyle('',9)
325 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
325 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
326 end
326 end
327
327
328 pdf.SetFontStyle('B',9)
328 pdf.SetFontStyle('B',9)
329 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
329 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
330 pdf.SetFontStyle('',9)
330 pdf.SetFontStyle('',9)
331 pdf.RDMCell(155,5, issue.subject,"RTB")
331 pdf.RDMCell(155,5, issue.subject,"RTB")
332 pdf.Ln
332 pdf.Ln
333
333
334 pdf.SetFontStyle('B',9)
334 pdf.SetFontStyle('B',9)
335 pdf.RDMCell(35,5, l(:field_description) + ":")
335 pdf.RDMCell(35,5, l(:field_description) + ":")
336 pdf.SetFontStyle('',9)
336 pdf.SetFontStyle('',9)
337 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
337 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
338
338
339 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
339 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
340 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
340 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
341 pdf.Ln
341 pdf.Ln
342
342
343 if issue.changesets.any? &&
343 if issue.changesets.any? &&
344 User.current.allowed_to?(:view_changesets, issue.project)
344 User.current.allowed_to?(:view_changesets, issue.project)
345 pdf.SetFontStyle('B',9)
345 pdf.SetFontStyle('B',9)
346 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
346 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
347 pdf.Ln
347 pdf.Ln
348 for changeset in issue.changesets
348 for changeset in issue.changesets
349 pdf.SetFontStyle('B',8)
349 pdf.SetFontStyle('B',8)
350 pdf.RDMCell(190,5,
350 pdf.RDMCell(190,5,
351 format_time(changeset.committed_on) + " - " + changeset.author.to_s)
351 format_time(changeset.committed_on) + " - " + changeset.author.to_s)
352 pdf.Ln
352 pdf.Ln
353 unless changeset.comments.blank?
353 unless changeset.comments.blank?
354 pdf.SetFontStyle('',8)
354 pdf.SetFontStyle('',8)
355 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
355 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
356 end
356 end
357 pdf.Ln
357 pdf.Ln
358 end
358 end
359 end
359 end
360
360
361 pdf.SetFontStyle('B',9)
361 pdf.SetFontStyle('B',9)
362 pdf.RDMCell(190,5, l(:label_history), "B")
362 pdf.RDMCell(190,5, l(:label_history), "B")
363 pdf.Ln
363 pdf.Ln
364 for journal in issue.journals.find(
364 for journal in issue.journals.find(
365 :all, :include => [:user, :details],
365 :all, :include => [:user, :details],
366 :order => "#{Journal.table_name}.created_on ASC")
366 :order => "#{Journal.table_name}.created_on ASC")
367 pdf.SetFontStyle('B',8)
367 pdf.SetFontStyle('B',8)
368 pdf.RDMCell(190,5,
368 pdf.RDMCell(190,5,
369 format_time(journal.created_on) + " - " + journal.user.name)
369 format_time(journal.created_on) + " - " + journal.user.name)
370 pdf.Ln
370 pdf.Ln
371 pdf.SetFontStyle('I',8)
371 pdf.SetFontStyle('I',8)
372 for detail in journal.details
372 for detail in journal.details
373 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
373 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
374 pdf.Ln
374 pdf.Ln
375 end
375 end
376 if journal.notes?
376 if journal.notes?
377 pdf.SetFontStyle('',8)
377 pdf.SetFontStyle('',8)
378 pdf.RDMMultiCell(190,5, journal.notes.to_s)
378 pdf.RDMMultiCell(190,5, journal.notes.to_s)
379 end
379 end
380 pdf.Ln
380 pdf.Ln
381 end
381 end
382
382
383 if issue.attachments.any?
383 if issue.attachments.any?
384 pdf.SetFontStyle('B',9)
384 pdf.SetFontStyle('B',9)
385 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
385 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
386 pdf.Ln
386 pdf.Ln
387 for attachment in issue.attachments
387 for attachment in issue.attachments
388 pdf.SetFontStyle('',8)
388 pdf.SetFontStyle('',8)
389 pdf.RDMCell(80,5, attachment.filename)
389 pdf.RDMCell(80,5, attachment.filename)
390 pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
390 pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
391 pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
391 pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
392 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
392 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
393 pdf.Ln
393 pdf.Ln
394 end
394 end
395 end
395 end
396 pdf.Output
396 pdf.Output
397 end
397 end
398 end
398 end
399 end
399 end
400 end
400 end
General Comments 0
You need to be logged in to leave comments. Login now