From 3e6640fe0855c21a4f28f3dada7eb34b7267d45a Mon Sep 17 00:00:00 2001 From: Irfan Adilovic Date: Tue, 17 May 2011 17:41:26 +0200 Subject: [PATCH] Make CSV export work like PDF. --- app/controllers/issues_controller.rb | 2 +- app/helpers/issues_helper.rb | 66 ++++++++++------------------------ 2 files changed, 20 insertions(+), 48 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 8750ca8..21fe4f4 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -91,7 +91,7 @@ class IssuesController < ApplicationController format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } format.api format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } - format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') } + format.csv { send_data(issues_to_csv(@issues, @project, @query), :type => 'text/csv; header=present', :filename => 'export.csv') } format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') } end else diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 35feb87..0dced9b 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -263,59 +263,31 @@ module IssuesHelper end end - def issues_to_csv(issues, project = nil) + def issues_to_csv(issues, project = nil, query = nil) ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') decimal_separator = l(:general_csv_decimal_separator) export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| # csv header fields - headers = [ "#", - l(:field_status), - l(:field_project), - l(:field_tracker), - l(:field_priority), - l(:field_subject), - l(:field_assigned_to), - l(:field_category), - l(:field_fixed_version), - l(:field_author), - l(:field_start_date), - l(:field_due_date), - l(:field_done_ratio), - l(:field_estimated_hours), - l(:field_parent_issue), - l(:field_created_on), - l(:field_updated_on) - ] - # Export project custom fields if project is given - # otherwise export custom fields marked as "For all projects" - custom_fields = project.nil? ? IssueCustomField.for_all : project.all_issue_custom_fields - custom_fields.each {|f| headers << f.name} - # Description in the last column - headers << l(:field_description) - csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } + csv << [ "#" ] + query.columns.collect {|c| begin; ic.iconv(c.caption.to_s); rescue; c.to_s; end } # csv lines issues.each do |issue| - fields = [issue.id, - issue.status.name, - issue.project.name, - issue.tracker.name, - issue.priority.name, - issue.subject, - issue.assigned_to, - issue.category, - issue.fixed_version, - issue.author.name, - format_date(issue.start_date), - format_date(issue.due_date), - issue.done_ratio, - issue.estimated_hours.to_s.gsub('.', decimal_separator), - issue.parent_id, - format_time(issue.created_on), - format_time(issue.updated_on) - ] - custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) } - fields << issue.description - csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } + col_values = query.columns.collect do |column| + s = if column.is_a?(QueryCustomFieldColumn) + cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} + show_value(cv) + else + value = issue.send(column.name) + if value.is_a?(Date) + format_date(value) + elsif value.is_a?(Time) + format_time(value) + else + value + end + end + s.to_s + end + csv << [ issue.id.to_s ] + col_values.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } end end export -- 1.7.1