diff --git a/app/controllers/stories_controller.rb b/app/controllers/stories_controller.rb index 768aa26d..a7fcbb18 100644 --- a/app/controllers/stories_controller.rb +++ b/app/controllers/stories_controller.rb @@ -87,29 +87,40 @@ def import end def export - csv = if params[:export_with_comments] == "1" - CSV.generate(headers: true) do |csv| - csv << CSV_HEADERS + ["comment"] - @project.stories.includes(:comments).approved.by_position.each do |story| - comments = [] - story.comments.each do |comment| - comments << "#{display_name(comment.user)}: #{comment.body}" - end - csv << [story.id, story.title, story.description, story.position] + comments - end - end + csv = if params[:export_with_comments] == "1" && params[:export_all] == "1" + generate_csv(@project.stories.includes(:comments), with_comments: true, export_all: true) + elsif params[:export_with_comments] == "1" + generate_csv(@project.stories.includes(:comments).approved, with_comments: true, export_all: false) + elsif params[:export_all] == "1" + generate_csv(@project.stories, with_comments: false, export_all: true) else - CSV.generate(headers: true) do |csv| - csv << CSV_HEADERS - @project.stories.approved.by_position.each do |story| - csv << story.attributes.slice(*CSV_HEADERS) - end - end + generate_csv(@project.stories.approved, with_comments: false, export_all: false) end + filename = "#{@project.title.gsub(/[^\w]/, "_")}-#{Time.now.to_formatted_s(:short).tr(" ", "_")}.csv" send_data csv, filename: filename end + def generate_csv(stories, with_comments: false, export_all: false) + CSV.generate(headers: true) do |csv| + headers = CSV_HEADERS.dup + headers << "comment" if with_comments + csv << headers + + stories.by_position.each do |story| + comments = [] + + if with_comments + comments = story.comments.map do |comment| + "#{display_name(comment.user)}: #{comment.body}" + end + end + + csv << [story.id, story.title, story.description, story.position] + comments + end + end + end + def render_markdown render plain: markdown(params[:markdown]) end diff --git a/app/views/projects/_import_export.html.erb b/app/views/projects/_import_export.html.erb index d3549268..dac9bcb4 100644 --- a/app/views/projects/_import_export.html.erb +++ b/app/views/projects/_import_export.html.erb @@ -33,7 +33,13 @@
<%= form_with url: export_project_stories_path(@project), method: :get do |f| %> <%= f.submit "Export", class: "button green", data: { disable_with: false } %> -
+ <% if current_user.admin? %> +
+ <%= f.label :export_all do %> + <%= f.check_box :export_all %> + Export all stories + <% end %> + <% end %> <%= f.label :export_with_comments do %> <%= f.check_box :export_with_comments %> Export with comments diff --git a/spec/controllers/stories_controller_spec.rb b/spec/controllers/stories_controller_spec.rb index c9e677dc..0d72e0d4 100644 --- a/spec/controllers/stories_controller_spec.rb +++ b/spec/controllers/stories_controller_spec.rb @@ -187,6 +187,27 @@ expect(csv_data).to eq(expected_csv_content) end + context "when an admin" do + it "exports a CSV file with all stories" do + user = FactoryBot.create(:user) + user.admin = true + + story2 = FactoryBot.create(:story, project: project, status: :rejected) + story3 = FactoryBot.create(:story, project: project, status: :pending) + get :export, params: {project_id: project.id, export_all: "1"} + expect(response).to have_http_status(:ok) + + csv_data = CSV.parse(response.body) + expected_csv_content = [ + ["id", "title", "description", "position"], + [story.id.to_s, story.title, story.description, story.position.to_s], + [story2.id.to_s, story2.title, story2.description, story2.position.to_s], + [story3.id.to_s, story3.title, story3.description, story3.position.to_s] + ] + expect(csv_data).to eq(expected_csv_content) + end + end + context "with comments" do it "exports a CSV file with only approved stories" do user = FactoryBot.create(:user)