]> source.dussan.org Git - redmine.git/commitdiff
Use query name as the file name when exporting queries (#16207).
authorGo MAEDA <maeda@farend.jp>
Wed, 24 Aug 2022 13:21:50 +0000 (13:21 +0000)
committerGo MAEDA <maeda@farend.jp>
Wed, 24 Aug 2022 13:21:50 +0000 (13:21 +0000)
Patch by Mizuki ISHIKAWA.

git-svn-id: https://svn.redmine.org/redmine/trunk@21773 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/issues_controller.rb
app/controllers/timelog_controller.rb
app/helpers/queries_helper.rb
app/views/issues/index.html.erb
app/views/timelog/index.html.erb
test/functional/issues_controller_test.rb
test/functional/timelog_controller_test.rb

index 5d67cd8ccb38a209f21d04be0a0f34807db31d68..683dbc1e8d70ccbf15e27447c2e069cf817450ad 100644 (file)
@@ -74,11 +74,11 @@ class IssuesController < ApplicationController
         format.csv do
           @issues = @query.issues(:limit => Setting.issues_export_limit.to_i)
           send_data(query_to_csv(@issues, @query, params[:csv]),
-                    :type => 'text/csv; header=present', :filename => 'issues.csv')
+                    :type => 'text/csv; header=present', :filename => "#{filename_for_export(@query, 'issues')}.csv")
         end
         format.pdf do
           @issues = @query.issues(:limit => Setting.issues_export_limit.to_i)
-          send_file_headers! :type => 'application/pdf', :filename => 'issues.pdf'
+          send_file_headers! :type => 'application/pdf', :filename => "#{filename_for_export(@query, 'issues')}.pdf"
         end
       end
     else
index c0570c3046a286ace5b2ef55922b9a485c12f102..d47687f1b8c6bfbf4c72e8dfce287cba880d37d4 100644 (file)
@@ -67,7 +67,7 @@ class TimelogController < ApplicationController
       format.csv do
         # Export all entries
         @entries = scope.to_a
-        send_data(query_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 => "#{filename_for_export(@query, 'timelog')}.csv")
       end
     end
   end
index ffd2912804702bf4d31b9fb3562e938f8359cd90..38d72bbc6df8edd108ef6f14b86dbbe28977279c 100644 (file)
@@ -329,6 +329,14 @@ module QueriesHelper
     end
   end
 
+  def filename_for_export(query, default_name)
+    query_name = params[:query_name].presence || query.name
+    query_name = default_name if query_name == '_' || query_name.blank?
+
+    # Convert file names using the same rules as Wiki titles
+    filename_for_content_disposition(Wiki.titleize(query_name).downcase)
+  end
+
   # Retrieve query from session or build a new query
   def retrieve_query(klass=IssueQuery, use_session=true, options={})
     session_key = klass.name.underscore.to_sym
index 5a4d6b2c46c77fc1cca65f7dec5e99639058739c..3e0d0cfe8a170dc395a0bc098c4316fb50590570 100644 (file)
@@ -43,6 +43,7 @@
   <h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3>
   <%= form_tag(_project_issues_path(@project, :format => 'csv'), :method => :get, :id => 'csv-export-form') do %>
   <%= query_as_hidden_field_tags(@query) %>
+  <%= hidden_field_tag('query_name', @query.name) %>
   <p>
     <label><%= radio_button_tag 'c[]', '', true %> <%= l(:description_selected_columns) %></label><br />
     <label><%= radio_button_tag 'c[]', 'all_inline' %> <%= l(:description_all_columns) %></label>
index f6751ebc8c18aa70dc3794eed23a1c50e4daee11..e957b41b3f41ff9c3b2c759fc72789f93ea010e1 100644 (file)
@@ -36,6 +36,7 @@
   <h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3>
   <%= form_tag(_time_entries_path(@project, nil, :format => 'csv'), :method => :get, :id => 'csv-export-form') do %>
   <%= query_as_hidden_field_tags @query %>
+  <%= hidden_field_tag('query_name', @query.name) %>
   <p>
     <label><%= radio_button_tag 'c[]', '', true %> <%= l(:description_selected_columns) %></label><br />
     <label><%= radio_button_tag 'c[]', 'all_inline' %> <%= l(:description_all_columns) %></label>
index 9028141f306e5040ac47dc85700aaea50ee4d751..859fb2ff7cb85c1d9f9b236a188dfb7f36d29e78 100644 (file)
@@ -850,6 +850,18 @@ class IssuesControllerTest < Redmine::ControllerTest
     assert_equal Setting.issue_list_default_columns.size + 2, lines[0].split(',').size
   end
 
+  def test_index_csv_filename_without_query_name_param
+    get :index, :params => {:format => 'csv'}
+    assert_response :success
+    assert_match /issues.csv/, @response.headers['Content-Disposition']
+  end
+
+  def test_index_csv_filename_with_query_name_param
+    get :index, :params => {:query_name => 'My Query Name', :format => 'csv'}
+    assert_response :success
+    assert_match /my_query_name\.csv/, @response.headers['Content-Disposition']
+  end
+
   def test_index_csv_with_project
     get(
       :index,
@@ -1182,6 +1194,20 @@ class IssuesControllerTest < Redmine::ControllerTest
     assert_equal 'application/pdf', @response.media_type
   end
 
+  def test_index_pdf_filename_without_query
+    get :index, :params => {:format => 'pdf'}
+    assert_response :success
+    assert_match /issues.pdf/, @response.headers['Content-Disposition']
+  end
+
+  def test_index_pdf_filename_with_query
+    query = IssueQuery.create!(:name => 'My Query Name', :visibility => IssueQuery::VISIBILITY_PUBLIC)
+    get :index, :params => {:query_id => query.id, :format => 'pdf'}
+
+    assert_response :success
+    assert_match /my_query_name\.pdf/, @response.headers['Content-Disposition']
+  end
+
   def test_index_atom
     get(
       :index,
index deb75a5bb1cc2ebd3f1b6eea1debcfb1b64ee70e..d36279d13830ad94154bc43af540711ef33a7db6 100644 (file)
@@ -1690,6 +1690,18 @@ class TimelogControllerTest < Redmine::ControllerTest
     end
   end
 
+  def test_index_csv_filename_query_name_param
+    get :index, :params => {:format => 'csv'}
+    assert_response :success
+    assert_match /timelog.csv/, @response.headers['Content-Disposition']
+  end
+
+  def test_index_csv_filename_with_query_name_param
+    get :index, :params => {:query_name => 'My Query Name', :format => 'csv'}
+    assert_response :success
+    assert_match /my_query_name\.csv/, @response.headers['Content-Disposition']
+  end
+
   def test_index_csv_should_fill_issue_column_with_tracker_id_and_subject
     issue = Issue.find(1)
     entry = TimeEntry.generate!(:issue => issue, :comments => "Issue column content test")