##// END OF EJS Templates
code clean up lib/redmine/export/pdf.rb....
Toshi MARUYAMA -
r5188:3b20bd76a8e5
parent child
Show More
@@ -1,394 +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? && (group = query.group_by_column.value(issue)) != previous_group
223 if query.grouped? &&
224 (group = query.group_by_column.value(issue)) != previous_group
224 pdf.SetFontStyle('B',9)
225 pdf.SetFontStyle('B',9)
225 pdf.RDMCell(277, row_height,
226 pdf.RDMCell(277, row_height,
226 (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]})",
227 1, 1, 'L')
228 1, 1, 'L')
228 pdf.SetFontStyle('',8)
229 pdf.SetFontStyle('',8)
229 previous_group = group
230 previous_group = group
230 end
231 end
231 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)
232 query.columns.each_with_index do |column, i|
233 query.columns.each_with_index do |column, i|
233 s = if column.is_a?(QueryCustomFieldColumn)
234 s = if column.is_a?(QueryCustomFieldColumn)
234 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}
235 show_value(cv)
236 show_value(cv)
236 else
237 else
237 value = issue.send(column.name)
238 value = issue.send(column.name)
238 if value.is_a?(Date)
239 if value.is_a?(Date)
239 format_date(value)
240 format_date(value)
240 elsif value.is_a?(Time)
241 elsif value.is_a?(Time)
241 format_time(value)
242 format_time(value)
242 else
243 else
243 value
244 value
244 end
245 end
245 end
246 end
246 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)
247 end
248 end
248 pdf.Ln
249 pdf.Ln
249 end
250 end
250 if issues.size == Setting.issues_export_limit.to_i
251 if issues.size == Setting.issues_export_limit.to_i
251 pdf.SetFontStyle('B',10)
252 pdf.SetFontStyle('B',10)
252 pdf.RDMCell(0, row_height, '...')
253 pdf.RDMCell(0, row_height, '...')
253 end
254 end
254 pdf.Output
255 pdf.Output
255 end
256 end
256
257
257 # Returns a PDF string of a single issue
258 # Returns a PDF string of a single issue
258 def issue_to_pdf(issue)
259 def issue_to_pdf(issue)
259 if ( current_language.to_s.downcase == 'ko' ||
260 if ( current_language.to_s.downcase == 'ko' ||
260 current_language.to_s.downcase == 'ja' ||
261 current_language.to_s.downcase == 'ja' ||
261 current_language.to_s.downcase == 'zh' ||
262 current_language.to_s.downcase == 'zh' ||
262 current_language.to_s.downcase == 'zh-tw' ||
263 current_language.to_s.downcase == 'zh-tw' ||
263 current_language.to_s.downcase == 'th' )
264 current_language.to_s.downcase == 'th' )
264 pdf = IFPDF.new(current_language)
265 pdf = IFPDF.new(current_language)
265 else
266 else
266 pdf = ITCPDF.new(current_language)
267 pdf = ITCPDF.new(current_language)
267 end
268 end
268 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
269 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
269 pdf.alias_nb_pages
270 pdf.alias_nb_pages
270 pdf.footer_date = format_date(Date.today)
271 pdf.footer_date = format_date(Date.today)
271 pdf.AddPage
272 pdf.AddPage
272
273
273 pdf.SetFontStyle('B',11)
274 pdf.SetFontStyle('B',11)
274 pdf.RDMCell(190,10, "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
275 pdf.RDMCell(190,10,
276 "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
275 pdf.Ln
277 pdf.Ln
276
278
277 y0 = pdf.GetY
279 y0 = pdf.GetY
278
280
279 pdf.SetFontStyle('B',9)
281 pdf.SetFontStyle('B',9)
280 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
282 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
281 pdf.SetFontStyle('',9)
283 pdf.SetFontStyle('',9)
282 pdf.RDMCell(60,5, issue.status.to_s,"RT")
284 pdf.RDMCell(60,5, issue.status.to_s,"RT")
283 pdf.SetFontStyle('B',9)
285 pdf.SetFontStyle('B',9)
284 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
286 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
285 pdf.SetFontStyle('',9)
287 pdf.SetFontStyle('',9)
286 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
288 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
287 pdf.Ln
289 pdf.Ln
288
290
289 pdf.SetFontStyle('B',9)
291 pdf.SetFontStyle('B',9)
290 pdf.RDMCell(35,5, l(:field_author) + ":","L")
292 pdf.RDMCell(35,5, l(:field_author) + ":","L")
291 pdf.SetFontStyle('',9)
293 pdf.SetFontStyle('',9)
292 pdf.RDMCell(60,5, issue.author.to_s,"R")
294 pdf.RDMCell(60,5, issue.author.to_s,"R")
293 pdf.SetFontStyle('B',9)
295 pdf.SetFontStyle('B',9)
294 pdf.RDMCell(35,5, l(:field_category) + ":","L")
296 pdf.RDMCell(35,5, l(:field_category) + ":","L")
295 pdf.SetFontStyle('',9)
297 pdf.SetFontStyle('',9)
296 pdf.RDMCell(60,5, issue.category.to_s,"R")
298 pdf.RDMCell(60,5, issue.category.to_s,"R")
297 pdf.Ln
299 pdf.Ln
298
300
299 pdf.SetFontStyle('B',9)
301 pdf.SetFontStyle('B',9)
300 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
302 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
301 pdf.SetFontStyle('',9)
303 pdf.SetFontStyle('',9)
302 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
304 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
303 pdf.SetFontStyle('B',9)
305 pdf.SetFontStyle('B',9)
304 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
306 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
305 pdf.SetFontStyle('',9)
307 pdf.SetFontStyle('',9)
306 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
308 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
307 pdf.Ln
309 pdf.Ln
308
310
309 pdf.SetFontStyle('B',9)
311 pdf.SetFontStyle('B',9)
310 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
312 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
311 pdf.SetFontStyle('',9)
313 pdf.SetFontStyle('',9)
312 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
314 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
313 pdf.SetFontStyle('B',9)
315 pdf.SetFontStyle('B',9)
314 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
316 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
315 pdf.SetFontStyle('',9)
317 pdf.SetFontStyle('',9)
316 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
318 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
317 pdf.Ln
319 pdf.Ln
318
320
319 for custom_value in issue.custom_field_values
321 for custom_value in issue.custom_field_values
320 pdf.SetFontStyle('B',9)
322 pdf.SetFontStyle('B',9)
321 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
323 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
322 pdf.SetFontStyle('',9)
324 pdf.SetFontStyle('',9)
323 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
325 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
324 end
326 end
325
327
326 pdf.SetFontStyle('B',9)
328 pdf.SetFontStyle('B',9)
327 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
329 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
328 pdf.SetFontStyle('',9)
330 pdf.SetFontStyle('',9)
329 pdf.RDMCell(155,5, issue.subject,"RTB")
331 pdf.RDMCell(155,5, issue.subject,"RTB")
330 pdf.Ln
332 pdf.Ln
331
333
332 pdf.SetFontStyle('B',9)
334 pdf.SetFontStyle('B',9)
333 pdf.RDMCell(35,5, l(:field_description) + ":")
335 pdf.RDMCell(35,5, l(:field_description) + ":")
334 pdf.SetFontStyle('',9)
336 pdf.SetFontStyle('',9)
335 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
337 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
336
338
337 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
339 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
338 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
340 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
339 pdf.Ln
341 pdf.Ln
340
342
341 if issue.changesets.any? && User.current.allowed_to?(:view_changesets, issue.project)
343 if issue.changesets.any? &&
344 User.current.allowed_to?(:view_changesets, issue.project)
342 pdf.SetFontStyle('B',9)
345 pdf.SetFontStyle('B',9)
343 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
346 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
344 pdf.Ln
347 pdf.Ln
345 for changeset in issue.changesets
348 for changeset in issue.changesets
346 pdf.SetFontStyle('B',8)
349 pdf.SetFontStyle('B',8)
347 pdf.RDMCell(190,5, format_time(changeset.committed_on) + " - " + changeset.author.to_s)
350 pdf.RDMCell(190,5,
351 format_time(changeset.committed_on) + " - " + changeset.author.to_s)
348 pdf.Ln
352 pdf.Ln
349 unless changeset.comments.blank?
353 unless changeset.comments.blank?
350 pdf.SetFontStyle('',8)
354 pdf.SetFontStyle('',8)
351 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
355 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
352 end
356 end
353 pdf.Ln
357 pdf.Ln
354 end
358 end
355 end
359 end
356
360
357 pdf.SetFontStyle('B',9)
361 pdf.SetFontStyle('B',9)
358 pdf.RDMCell(190,5, l(:label_history), "B")
362 pdf.RDMCell(190,5, l(:label_history), "B")
359 pdf.Ln
363 pdf.Ln
360 for journal in issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
364 for journal in issue.journals.find(
365 :all, :include => [:user, :details],
366 :order => "#{Journal.table_name}.created_on ASC")
361 pdf.SetFontStyle('B',8)
367 pdf.SetFontStyle('B',8)
362 pdf.RDMCell(190,5, format_time(journal.created_on) + " - " + journal.user.name)
368 pdf.RDMCell(190,5,
369 format_time(journal.created_on) + " - " + journal.user.name)
363 pdf.Ln
370 pdf.Ln
364 pdf.SetFontStyle('I',8)
371 pdf.SetFontStyle('I',8)
365 for detail in journal.details
372 for detail in journal.details
366 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
373 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
367 pdf.Ln
374 pdf.Ln
368 end
375 end
369 if journal.notes?
376 if journal.notes?
370 pdf.SetFontStyle('',8)
377 pdf.SetFontStyle('',8)
371 pdf.RDMMultiCell(190,5, journal.notes.to_s)
378 pdf.RDMMultiCell(190,5, journal.notes.to_s)
372 end
379 end
373 pdf.Ln
380 pdf.Ln
374 end
381 end
375
382
376 if issue.attachments.any?
383 if issue.attachments.any?
377 pdf.SetFontStyle('B',9)
384 pdf.SetFontStyle('B',9)
378 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
385 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
379 pdf.Ln
386 pdf.Ln
380 for attachment in issue.attachments
387 for attachment in issue.attachments
381 pdf.SetFontStyle('',8)
388 pdf.SetFontStyle('',8)
382 pdf.RDMCell(80,5, attachment.filename)
389 pdf.RDMCell(80,5, attachment.filename)
383 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")
384 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")
385 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
392 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
386 pdf.Ln
393 pdf.Ln
387 end
394 end
388 end
395 end
389 pdf.Output
396 pdf.Output
390 end
397 end
391
392 end
398 end
393 end
399 end
394 end
400 end
General Comments 0
You need to be logged in to leave comments. Login now