##// END OF EJS Templates
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
Eric Davis -
r3439:43e3c43cbdcf
parent child
Show More
@@ -1,199 +1,209
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 module IssuesHelper
18 module IssuesHelper
19 include ApplicationHelper
19 include ApplicationHelper
20
20
21 def render_issue_tooltip(issue)
21 def render_issue_tooltip(issue)
22 @cached_label_start_date ||= l(:field_start_date)
22 @cached_label_start_date ||= l(:field_start_date)
23 @cached_label_due_date ||= l(:field_due_date)
23 @cached_label_due_date ||= l(:field_due_date)
24 @cached_label_assigned_to ||= l(:field_assigned_to)
24 @cached_label_assigned_to ||= l(:field_assigned_to)
25 @cached_label_priority ||= l(:field_priority)
25 @cached_label_priority ||= l(:field_priority)
26
26
27 link_to_issue(issue) + "<br /><br />" +
27 link_to_issue(issue) + "<br /><br />" +
28 "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
28 "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
29 "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
29 "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
30 "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
30 "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
31 "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
31 "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
32 end
32 end
33
33
34 def render_custom_fields_rows(issue)
34 def render_custom_fields_rows(issue)
35 return if issue.custom_field_values.empty?
35 return if issue.custom_field_values.empty?
36 ordered_values = []
36 ordered_values = []
37 half = (issue.custom_field_values.size / 2.0).ceil
37 half = (issue.custom_field_values.size / 2.0).ceil
38 half.times do |i|
38 half.times do |i|
39 ordered_values << issue.custom_field_values[i]
39 ordered_values << issue.custom_field_values[i]
40 ordered_values << issue.custom_field_values[i + half]
40 ordered_values << issue.custom_field_values[i + half]
41 end
41 end
42 s = "<tr>\n"
42 s = "<tr>\n"
43 n = 0
43 n = 0
44 ordered_values.compact.each do |value|
44 ordered_values.compact.each do |value|
45 s << "</tr>\n<tr>\n" if n > 0 && (n % 2) == 0
45 s << "</tr>\n<tr>\n" if n > 0 && (n % 2) == 0
46 s << "\t<th>#{ h(value.custom_field.name) }:</th><td>#{ simple_format_without_paragraph(h(show_value(value))) }</td>\n"
46 s << "\t<th>#{ h(value.custom_field.name) }:</th><td>#{ simple_format_without_paragraph(h(show_value(value))) }</td>\n"
47 n += 1
47 n += 1
48 end
48 end
49 s << "</tr>\n"
49 s << "</tr>\n"
50 s
50 s
51 end
51 end
52
52
53 def sidebar_queries
53 def sidebar_queries
54 unless @sidebar_queries
54 unless @sidebar_queries
55 # User can see public queries and his own queries
55 # User can see public queries and his own queries
56 visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
56 visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
57 # Project specific queries and global queries
57 # Project specific queries and global queries
58 visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
58 visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
59 @sidebar_queries = Query.find(:all,
59 @sidebar_queries = Query.find(:all,
60 :select => 'id, name',
60 :select => 'id, name',
61 :order => "name ASC",
61 :order => "name ASC",
62 :conditions => visible.conditions)
62 :conditions => visible.conditions)
63 end
63 end
64 @sidebar_queries
64 @sidebar_queries
65 end
65 end
66
66
67 def show_detail(detail, no_html=false)
67 def show_detail(detail, no_html=false)
68 case detail.property
68 case detail.property
69 when 'attr'
69 when 'attr'
70 label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym)
70 field = detail.prop_key.to_s.gsub(/\_id$/, "")
71 label = l(("field_" + field).to_sym)
71 case detail.prop_key
72 case detail.prop_key
72 when 'due_date', 'start_date'
73 when 'due_date', 'start_date'
73 value = format_date(detail.value.to_date) if detail.value
74 value = format_date(detail.value.to_date) if detail.value
74 old_value = format_date(detail.old_value.to_date) if detail.old_value
75 old_value = format_date(detail.old_value.to_date) if detail.old_value
75 when 'project_id'
76 when 'project_id'
76 p = Project.find_by_id(detail.value) and value = p.name if detail.value
77 value = find_name_by_reflection(field, detail.value)
77 p = Project.find_by_id(detail.old_value) and old_value = p.name if detail.old_value
78 old_value = find_name_by_reflection(field, detail.old_value)
78 when 'status_id'
79 when 'status_id'
79 s = IssueStatus.find_by_id(detail.value) and value = s.name if detail.value
80 value = find_name_by_reflection(field, detail.value)
80 s = IssueStatus.find_by_id(detail.old_value) and old_value = s.name if detail.old_value
81 old_value = find_name_by_reflection(field, detail.old_value)
81 when 'tracker_id'
82 when 'tracker_id'
82 t = Tracker.find_by_id(detail.value) and value = t.name if detail.value
83 value = find_name_by_reflection(field, detail.value)
83 t = Tracker.find_by_id(detail.old_value) and old_value = t.name if detail.old_value
84 old_value = find_name_by_reflection(field, detail.old_value)
84 when 'assigned_to_id'
85 when 'assigned_to_id'
85 u = User.find_by_id(detail.value) and value = u.name if detail.value
86 value = find_name_by_reflection(field, detail.value)
86 u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
87 old_value = find_name_by_reflection(field, detail.old_value)
87 when 'priority_id'
88 when 'priority_id'
88 e = IssuePriority.find_by_id(detail.value) and value = e.name if detail.value
89 value = find_name_by_reflection(field, detail.value)
89 e = IssuePriority.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
90 old_value = find_name_by_reflection(field, detail.old_value)
90 when 'category_id'
91 when 'category_id'
91 c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value
92 value = find_name_by_reflection(field, detail.value)
92 c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value
93 old_value = find_name_by_reflection(field, detail.old_value)
93 when 'fixed_version_id'
94 when 'fixed_version_id'
94 v = Version.find_by_id(detail.value) and value = v.name if detail.value
95 value = find_name_by_reflection(field, detail.value)
95 v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
96 old_value = find_name_by_reflection(field, detail.old_value)
96 when 'estimated_hours'
97 when 'estimated_hours'
97 value = "%0.02f" % detail.value.to_f unless detail.value.blank?
98 value = "%0.02f" % detail.value.to_f unless detail.value.blank?
98 old_value = "%0.02f" % detail.old_value.to_f unless detail.old_value.blank?
99 old_value = "%0.02f" % detail.old_value.to_f unless detail.old_value.blank?
99 end
100 end
100 when 'cf'
101 when 'cf'
101 custom_field = CustomField.find_by_id(detail.prop_key)
102 custom_field = CustomField.find_by_id(detail.prop_key)
102 if custom_field
103 if custom_field
103 label = custom_field.name
104 label = custom_field.name
104 value = format_value(detail.value, custom_field.field_format) if detail.value
105 value = format_value(detail.value, custom_field.field_format) if detail.value
105 old_value = format_value(detail.old_value, custom_field.field_format) if detail.old_value
106 old_value = format_value(detail.old_value, custom_field.field_format) if detail.old_value
106 end
107 end
107 when 'attachment'
108 when 'attachment'
108 label = l(:label_attachment)
109 label = l(:label_attachment)
109 end
110 end
110 call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value })
111 call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value })
111
112
112 label ||= detail.prop_key
113 label ||= detail.prop_key
113 value ||= detail.value
114 value ||= detail.value
114 old_value ||= detail.old_value
115 old_value ||= detail.old_value
115
116
116 unless no_html
117 unless no_html
117 label = content_tag('strong', label)
118 label = content_tag('strong', label)
118 old_value = content_tag("i", h(old_value)) if detail.old_value
119 old_value = content_tag("i", h(old_value)) if detail.old_value
119 old_value = content_tag("strike", old_value) if detail.old_value and (!detail.value or detail.value.empty?)
120 old_value = content_tag("strike", old_value) if detail.old_value and (!detail.value or detail.value.empty?)
120 if detail.property == 'attachment' && !value.blank? && a = Attachment.find_by_id(detail.prop_key)
121 if detail.property == 'attachment' && !value.blank? && a = Attachment.find_by_id(detail.prop_key)
121 # Link to the attachment if it has not been removed
122 # Link to the attachment if it has not been removed
122 value = link_to_attachment(a)
123 value = link_to_attachment(a)
123 else
124 else
124 value = content_tag("i", h(value)) if value
125 value = content_tag("i", h(value)) if value
125 end
126 end
126 end
127 end
127
128
128 if !detail.value.blank?
129 if !detail.value.blank?
129 case detail.property
130 case detail.property
130 when 'attr', 'cf'
131 when 'attr', 'cf'
131 if !detail.old_value.blank?
132 if !detail.old_value.blank?
132 l(:text_journal_changed, :label => label, :old => old_value, :new => value)
133 l(:text_journal_changed, :label => label, :old => old_value, :new => value)
133 else
134 else
134 l(:text_journal_set_to, :label => label, :value => value)
135 l(:text_journal_set_to, :label => label, :value => value)
135 end
136 end
136 when 'attachment'
137 when 'attachment'
137 l(:text_journal_added, :label => label, :value => value)
138 l(:text_journal_added, :label => label, :value => value)
138 end
139 end
139 else
140 else
140 l(:text_journal_deleted, :label => label, :old => old_value)
141 l(:text_journal_deleted, :label => label, :old => old_value)
141 end
142 end
142 end
143 end
144
145 # Find the name of an associated record stored in the field attribute
146 def find_name_by_reflection(field, id)
147 association = Issue.reflect_on_association(field.to_sym)
148 if association
149 record = association.class_name.constantize.find_by_id(id)
150 return record.name if record
151 end
152 end
143
153
144 def issues_to_csv(issues, project = nil)
154 def issues_to_csv(issues, project = nil)
145 ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
155 ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
146 decimal_separator = l(:general_csv_decimal_separator)
156 decimal_separator = l(:general_csv_decimal_separator)
147 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
157 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
148 # csv header fields
158 # csv header fields
149 headers = [ "#",
159 headers = [ "#",
150 l(:field_status),
160 l(:field_status),
151 l(:field_project),
161 l(:field_project),
152 l(:field_tracker),
162 l(:field_tracker),
153 l(:field_priority),
163 l(:field_priority),
154 l(:field_subject),
164 l(:field_subject),
155 l(:field_assigned_to),
165 l(:field_assigned_to),
156 l(:field_category),
166 l(:field_category),
157 l(:field_fixed_version),
167 l(:field_fixed_version),
158 l(:field_author),
168 l(:field_author),
159 l(:field_start_date),
169 l(:field_start_date),
160 l(:field_due_date),
170 l(:field_due_date),
161 l(:field_done_ratio),
171 l(:field_done_ratio),
162 l(:field_estimated_hours),
172 l(:field_estimated_hours),
163 l(:field_created_on),
173 l(:field_created_on),
164 l(:field_updated_on)
174 l(:field_updated_on)
165 ]
175 ]
166 # Export project custom fields if project is given
176 # Export project custom fields if project is given
167 # otherwise export custom fields marked as "For all projects"
177 # otherwise export custom fields marked as "For all projects"
168 custom_fields = project.nil? ? IssueCustomField.for_all : project.all_issue_custom_fields
178 custom_fields = project.nil? ? IssueCustomField.for_all : project.all_issue_custom_fields
169 custom_fields.each {|f| headers << f.name}
179 custom_fields.each {|f| headers << f.name}
170 # Description in the last column
180 # Description in the last column
171 headers << l(:field_description)
181 headers << l(:field_description)
172 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
182 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
173 # csv lines
183 # csv lines
174 issues.each do |issue|
184 issues.each do |issue|
175 fields = [issue.id,
185 fields = [issue.id,
176 issue.status.name,
186 issue.status.name,
177 issue.project.name,
187 issue.project.name,
178 issue.tracker.name,
188 issue.tracker.name,
179 issue.priority.name,
189 issue.priority.name,
180 issue.subject,
190 issue.subject,
181 issue.assigned_to,
191 issue.assigned_to,
182 issue.category,
192 issue.category,
183 issue.fixed_version,
193 issue.fixed_version,
184 issue.author.name,
194 issue.author.name,
185 format_date(issue.start_date),
195 format_date(issue.start_date),
186 format_date(issue.due_date),
196 format_date(issue.due_date),
187 issue.done_ratio,
197 issue.done_ratio,
188 issue.estimated_hours.to_s.gsub('.', decimal_separator),
198 issue.estimated_hours.to_s.gsub('.', decimal_separator),
189 format_time(issue.created_on),
199 format_time(issue.created_on),
190 format_time(issue.updated_on)
200 format_time(issue.updated_on)
191 ]
201 ]
192 custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) }
202 custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) }
193 fields << issue.description
203 fields << issue.description
194 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
204 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
195 end
205 end
196 end
206 end
197 export
207 export
198 end
208 end
199 end
209 end
General Comments 0
You need to be logged in to leave comments. Login now