Skip to content

Commit

Permalink
Add export link to admin events index. Allow events_exporter to expor…
Browse files Browse the repository at this point in the history
…t private or only public fields
  • Loading branch information
Senen committed Jan 6, 2018
1 parent d789721 commit 737956e
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 41 deletions.
2 changes: 2 additions & 0 deletions app/views/events/_search_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
<h1><%= event_title(current_user) %></h1>
</div>
<div class="small-6 medium-4 column">
<%= link_to t('backend.export'), current_url(format: :csv),
class: "button tiny radius success left" %>
<%= link_to event_new(current_user),
new_event_path,
:class => "button radius warning right" if can? :create, Event %>
Expand Down
11 changes: 11 additions & 0 deletions app/views/events/index.csv.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<%=
exporter = EventsExporter.new true

CSV.generate(col_sep: ';', encoding: 'UTF-8') do |csv|
csv << exporter.windows_headers

@events.each do |event|
csv << exporter.windows_event_row(event)
end
end.html_safe
%>
16 changes: 14 additions & 2 deletions lib/events_exporter.rb
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
include ActionView::Helpers::SanitizeHelper

class EventsExporter
attr_accessor :fields

ENUMS = { status: "status" }.freeze

TO_STRIP = [:description, :general_remarks, :declined_reasons, :canceled_reasons, :manager_general_remarks].freeze

PRIVATE_FIELDS = ['status', 'notes', 'canceled_reasons', 'published_at', 'canceled_at', 'lobby_activity',
'lobby_scheduled', 'general_remarks', 'lobby_contact_firstname',
'accepted_at', 'declined_reasons', 'declined_at',
'lobby_contact_lastname', 'lobby_contact_email', 'lobby_contact_phone', 'manager_general_remarks'].freeze

FIELDS = ['title', 'description', 'scheduled', 'updated_at', 'user_name', 'holder_name', 'position_names', 'location', 'status',
'notes', 'canceled_reasons', 'published_at', 'canceled_at', 'lobby_activity',
'organization_name', 'lobby_scheduled', 'general_remarks', 'lobby_contact_firstname',
'accepted_at', 'declined_reasons', 'declined_at',
'lobby_contact_lastname', 'lobby_contact_email', 'lobby_contact_phone', 'manager_general_remarks'].freeze

def initialize(extended = false)
@fields = FIELDS
@fields = @fields - PRIVATE_FIELDS unless extended
end

def headers
FIELDS.map { |f| I18n.t("events_exporter.#{f}") }
@fields.map { |f| I18n.t("events_exporter.#{f}") }
end

def event_to_row(event)
FIELDS.map do |field|
@fields.map do |field|
process_field(event, field)
end
end
Expand Down
66 changes: 66 additions & 0 deletions spec/features/admin/events_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,40 @@
expect(page).not_to have_content('Event 2')

end

describe 'CSV export link' do

scenario 'Should download a CSV file UTF-8 encoded', :search do
Event.reindex
Sunspot.commit
visit admin_path

click_link "Exportar"

header = page.response_headers['Content-Type']
expect(header).to match 'text/csv; charset=utf-8'
end

scenario 'Should download CSV file containing own events', :search do
event = create(:event, title: "Event 1", position: @position)
event2 = create(:event, title: "Other position event")
event.status = 'requested'
event.save
Event.reindex
Sunspot.commit
visit admin_path

click_link "Exportar"

expect(page).to have_content event.title
expect(page).to have_content event.description
expect(page).to have_content event.location
expect(page).to have_content event.position.holder.full_name
expect(page).to have_content I18n.l(event.scheduled, format: :short)
expect(page).not_to have_content event2.title
end
end

end

describe "new" do
Expand Down Expand Up @@ -409,6 +443,38 @@
expect(page).to have_link "Other title"
end

describe 'CSV export link' do

scenario 'Should download a CSV file UTF-8 encoded', :search do
Event.reindex
Sunspot.commit
visit admin_path

click_link "Exportar"

header = page.response_headers['Content-Type']
expect(header).to match 'text/csv; charset=utf-8'
end

scenario 'Should download CSV file containing all events', :search do
event = create(:event)
event2 = create(:event, title: "Other position event")
event.status = 'requested'
event.save
Event.reindex
Sunspot.commit
visit admin_path

click_link "Exportar"

expect(page).to have_content event.title
expect(page).to have_content event.description
expect(page).to have_content event.location
expect(page).to have_content event.position.holder.full_name
expect(page).to have_content I18n.l(event.scheduled, format: :short)
expect(page).to have_content event2.title
end
end
end

describe "Create" do
Expand Down
118 changes: 79 additions & 39 deletions spec/lib/events_exporter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,93 @@
require 'events_exporter'

describe EventsExporter do
let(:exporter) { EventsExporter.new }

describe "#headers" do
describe "when is in default mode" do

it "Should contain twenty-five colums headers" do
expect(exporter.headers.size).to eq(25)
let(:exporter) { EventsExporter.new }

describe "#headers" do

it "Should contain twenty-five colums headers" do
expect(exporter.headers.size).to eq(9)
end

it "Should return correct headers translations" do
exporter.fields.each_with_index do |field, index|
expect(exporter.headers[index]).to eq(I18n.t("events_exporter.#{field}"))
end
end
end

it "Should return correct headers translations" do
EventsExporter::FIELDS.each_with_index do |field, index|
expect(exporter.headers[index]).to eq(I18n.t("events_exporter.#{field}"))
describe '#events_to_row' do
it "Should return array of public events" do
position = create(:position)
event = create(:event, organization_name: "Organization name", position: position,
accepted_at: Time.zone.now - 1.hour, published_at: Time.zone.now - 1.hour)

row = exporter.event_to_row(event)

expect(row).to include(event.title)
expect(row).to include(event.description)
expect(row).to include(I18n.l(event.scheduled, format: :short))
expect(row).to include(I18n.l(event.updated_at, format: :short))
expect(row).to include(event.user_name)
expect(row).to include(event.position_names)
expect(row).to include(event.location)
expect(row).to include(event.organization_name)
end
end
end

describe '#events_to_row' do
it "Should return array of public events" do
position = create(:position)
event = create(:event, organization_name: "Organization name", position: position,
accepted_at: Time.zone.now - 1.hour, published_at: Time.zone.now - 1.hour)

row = exporter.event_to_row(event)

expect(row).to include(event.title)
expect(row).to include(event.description)
expect(row).to include(I18n.l(event.scheduled, format: :short))
expect(row).to include(I18n.l(event.updated_at, format: :short))
expect(row).to include(event.user_name)
expect(row).to include(event.position_names)
expect(row).to include(event.location)
expect(row).to include("Aceptado")
expect(row).to include(event.notes)
expect(row).to include(event.canceled_reasons)
expect(row).to include(I18n.l(event.published_at, format: :short))
expect(row).to include(I18n.l(event.canceled_at, format: :short)) if event.canceled_at.present?
expect(row).to include(I18n.l(event.accepted_at, format: :short))
expect(row).to include(I18n.l(event.declined_at, format: :short)) if event.declined_at.present?
expect(row).to include(event.organization_name)
expect(row).to include(event.lobby_scheduled)
expect(row).to include(event.general_remarks)
expect(row).to include(event.lobby_contact_firstname)
expect(row).to include(event.lobby_contact_lastname)
expect(row).to include(event.lobby_scheduled)
expect(row).to include(event.general_remarks)
expect(row).to include(event.lobby_contact_phone)
expect(row).to include(event.manager_general_remarks)
describe "when is in extended mode" do

let(:exporter) { EventsExporter.new true }

describe "#headers" do

it "Should contain twenty-five colums headers" do
expect(exporter.headers.size).to eq(25)
end

it "Should return correct headers translations" do
exporter.fields.each_with_index do |field, index|
expect(exporter.headers[index]).to eq(I18n.t("events_exporter.#{field}"))
end
end
end
end

describe '#events_to_row' do
it "Should return array of public events" do
position = create(:position)
event = create(:event, organization_name: "Organization name", position: position,
accepted_at: Time.zone.now - 1.hour, published_at: Time.zone.now - 1.hour)

row = exporter.event_to_row(event)

expect(row).to include(event.title)
expect(row).to include(event.description)
expect(row).to include(I18n.l(event.scheduled, format: :short))
expect(row).to include(I18n.l(event.updated_at, format: :short))
expect(row).to include(event.user_name)
expect(row).to include(event.position_names)
expect(row).to include(event.location)
expect(row).to include("Aceptado")
expect(row).to include(event.notes)
expect(row).to include(event.canceled_reasons)
expect(row).to include(I18n.l(event.published_at, format: :short))
expect(row).to include(I18n.l(event.canceled_at, format: :short)) if event.canceled_at.present?
expect(row).to include(I18n.l(event.accepted_at, format: :short))
expect(row).to include(I18n.l(event.declined_at, format: :short)) if event.declined_at.present?
expect(row).to include(event.organization_name)
expect(row).to include(event.lobby_scheduled)
expect(row).to include(event.general_remarks)
expect(row).to include(event.lobby_contact_firstname)
expect(row).to include(event.lobby_contact_lastname)
expect(row).to include(event.lobby_scheduled)
expect(row).to include(event.general_remarks)
expect(row).to include(event.lobby_contact_phone)
expect(row).to include(event.manager_general_remarks)
end
end
end
end

0 comments on commit 737956e

Please sign in to comment.