git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11448 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/2.3.0
@@ -85,7 +85,7 @@ class IssuesController < ApplicationController | |||
Issue.load_visible_relations(@issues) if include_in_api_response?('relations') | |||
} | |||
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } | |||
format.csv { send_data(issues_to_csv(@issues, @project, @query, params), :type => 'text/csv; header=present', :filename => 'export.csv') } | |||
format.csv { send_data(query_to_csv(@issues, @query, params), :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 |
@@ -87,7 +87,7 @@ class TimelogController < ApplicationController | |||
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}], | |||
:order => sort_clause | |||
) | |||
send_data(entries_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv') | |||
send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv') | |||
} | |||
end | |||
end |
@@ -370,24 +370,4 @@ module IssuesHelper | |||
end | |||
end | |||
end | |||
def issues_to_csv(issues, project, query, options={}) | |||
encoding = l(:general_csv_encoding) | |||
columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns) | |||
if options[:description] | |||
if description = query.available_columns.detect {|q| q.name == :description} | |||
columns << description | |||
end | |||
end | |||
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| | |||
# csv header fields | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) } | |||
# csv lines | |||
issues.each do |issue| | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, issue), encoding) } | |||
end | |||
end | |||
export | |||
end | |||
end |
@@ -123,6 +123,26 @@ module QueriesHelper | |||
end | |||
end | |||
def query_to_csv(items, query, options={}) | |||
encoding = l(:general_csv_encoding) | |||
columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns) | |||
query.available_block_columns.each do |column| | |||
if options[column.name].present? | |||
columns << column | |||
end | |||
end | |||
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| | |||
# csv header fields | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) } | |||
# csv lines | |||
items.each do |item| | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, item), encoding) } | |||
end | |||
end | |||
export | |||
end | |||
# Retrieve query from session or build a new query | |||
def retrieve_query | |||
if !params[:query_id].blank? |
@@ -86,21 +86,6 @@ module TimelogHelper | |||
value) | |||
end | |||
def entries_to_csv(entries, query, options={}) | |||
encoding = l(:general_csv_encoding) | |||
columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns) | |||
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| | |||
# csv header fields | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) } | |||
# csv lines | |||
entries.each do |entry| | |||
csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, entry), encoding) } | |||
end | |||
end | |||
export | |||
end | |||
def format_criteria_value(criteria_options, value) | |||
if value.blank? | |||
"[#{l(:label_none)}]" |
@@ -391,13 +391,18 @@ class IssuesControllerTest < ActionController::TestCase | |||
end | |||
def test_index_csv_with_description | |||
get :index, :format => 'csv', :description => '1' | |||
assert_response :success | |||
assert_not_nil assigns(:issues) | |||
assert_equal 'text/csv; header=present', @response.content_type | |||
assert @response.body.starts_with?("#,") | |||
lines = @response.body.chomp.split("\n") | |||
assert_equal assigns(:query).columns.size + 1, lines[0].split(',').size | |||
Issue.generate!(:description => 'test_index_csv_with_description') | |||
with_settings :default_language => 'en' do | |||
get :index, :format => 'csv', :description => '1' | |||
assert_response :success | |||
assert_not_nil assigns(:issues) | |||
end | |||
assert_equal 'text/csv; header=present', response.content_type | |||
headers = response.body.chomp.split("\n").first.split(',') | |||
assert_include 'Description', headers | |||
assert_include 'test_index_csv_with_description', response.body | |||
end | |||
def test_index_csv_with_spent_time_column |