Merge pull request #1557 from bertocq/feature/newsletter_users_emails_zip

Allow admins to download Newsletter's users emails list in zip
This commit is contained in:
Juanjo Bazán
2017-05-24 13:13:34 +02:00
committed by GitHub
11 changed files with 91 additions and 1 deletions

View File

@@ -64,6 +64,7 @@ gem 'tolk', '~> 2.0.0' # Web interface for translations
gem 'browser'
gem 'turnout', '~> 2.4.0'
gem 'redcarpet', '~> 3.4.0'
gem 'rubyzip', '~> 1.2.0'
gem 'paperclip'

View File

@@ -368,6 +368,7 @@ GEM
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
rubyzip (1.2.1)
rvm1-capistrano3 (1.4.0)
capistrano (~> 3.0)
sshkit (>= 1.2)
@@ -525,6 +526,7 @@ DEPENDENCIES
rollbar (~> 2.14.1)
rspec-rails (~> 3.6)
rubocop (~> 0.48.1)
rubyzip (~> 1.2.0)
rvm1-capistrano3
sass-rails (~> 5.0, >= 5.0.4)
savon
@@ -542,4 +544,4 @@ DEPENDENCIES
whenever
BUNDLED WITH
1.14.6
1.15.0

View File

@@ -0,0 +1,12 @@
class Admin::NewslettersController < Admin::BaseController
def index
end
def users
zip = NewsletterZip.new('emails')
zip.create
send_file(File.join(zip.path), type: 'application/zip')
end
end

View File

@@ -52,6 +52,7 @@ class User < ActiveRecord::Base
scope :moderators, -> { joins(:moderator) }
scope :organizations, -> { joins(:organization) }
scope :officials, -> { where("official_level > 0") }
scope :newsletter, -> { where(newsletter: true) }
scope :for_render, -> { includes(:organization) }
scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) }
scope :email_digest, -> { where(email_digest: true) }

View File

@@ -162,5 +162,12 @@
<% end %>
</li>
<% end %>
<li <%= "class=active" if controller_name == "newsletter" %>>
<%= link_to admin_newsletters_path do %>
<span class="icon-zip"></span>
<%= t("admin.menu.newsletter") %>
<% end %>
</li>
</ul>
</div>

View File

@@ -0,0 +1,3 @@
<h2><%= t("admin.newsletters.index.title") %></h2>
<%= link_to t("admin.newsletters.index.button"), users_admin_newsletters_path, class: "button" %>

View File

@@ -205,6 +205,7 @@ en:
hidden_users: Hidden users
managers: Managers
moderators: Moderators
newsletter: Newsletters
valuators: Valuators
poll_officers: Poll officers
polls: Polls
@@ -236,6 +237,10 @@ en:
email_placeholder: Search user by email
search: Search
user_not_found: User not found
newsletters:
index:
title: Newsletters
button: Download zip with users list
valuators:
index:
title: Valuators

View File

@@ -205,6 +205,7 @@ es:
hidden_users: Usuarios bloqueados
managers: Gestores
moderators: Moderadores
newsletter: Envío de Newsletters
valuators: Evaluadores
poll_officers: Presidentes de mesa
polls: Votaciones
@@ -236,6 +237,10 @@ es:
email_placeholder: Buscar usuario por email
search: Buscar
user_not_found: Usuario no encontrado
newsletters:
index:
title: Envío de newsletters
button: Descargar zip con lista de usuarios
valuators:
index:
title: Evaluadores

View File

@@ -239,6 +239,9 @@ Rails.application.routes.draw do
end
resource :activity, controller: :activity, only: :show
resources :newsletters, only: :index do
get :users, on: :collection
end
resource :stats, only: :show do
get :proposal_notifications, on: :collection
get :direct_messages, on: :collection

25
lib/newsletter_zip.rb Normal file
View File

@@ -0,0 +1,25 @@
require 'zip'
class NewsletterZip
attr_accessor :filename
def initialize(filename)
@filename = filename
end
def emails
User.newsletter.pluck(:email).join("\n")
end
def path
Rails.root + "/tmp/#{filename}.zip"
end
def create
Zip::File.open(path, Zip::File::CREATE) do |zipfile|
zipfile.get_output_stream("#{filename}.txt") do |file|
file.write emails
end
end
end
end

View File

@@ -0,0 +1,26 @@
require 'rails_helper'
feature 'Admin newsletters emails' do
let(:download_button_text) { 'Download zip with users list' }
background do
@admin = create(:administrator)
@newsletter_user = create(:user, newsletter: true)
@non_newsletter_user = create(:user, newsletter: false)
login_as(@admin.user)
visit admin_newsletters_path
end
scenario 'Index' do
expect(page).to have_content download_button_text
end
scenario 'Download newsletter email zip' do
click_link download_button_text
downloaded_file_content = Zip::InputStream.open(StringIO.new(page.body)).get_next_entry.get_input_stream {|is| is.read }
expect(downloaded_file_content).to include(@admin.user.email, @newsletter_user.email)
expect(downloaded_file_content).not_to include(@non_newsletter_user.email)
end
end