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:
1
Gemfile
1
Gemfile
@@ -64,6 +64,7 @@ gem 'tolk', '~> 2.0.0' # Web interface for translations
|
|||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'turnout', '~> 2.4.0'
|
gem 'turnout', '~> 2.4.0'
|
||||||
gem 'redcarpet', '~> 3.4.0'
|
gem 'redcarpet', '~> 3.4.0'
|
||||||
|
gem 'rubyzip', '~> 1.2.0'
|
||||||
|
|
||||||
gem 'paperclip'
|
gem 'paperclip'
|
||||||
|
|
||||||
|
|||||||
@@ -368,6 +368,7 @@ GEM
|
|||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (~> 1.0, >= 1.0.1)
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||||
ruby-progressbar (1.8.1)
|
ruby-progressbar (1.8.1)
|
||||||
|
rubyzip (1.2.1)
|
||||||
rvm1-capistrano3 (1.4.0)
|
rvm1-capistrano3 (1.4.0)
|
||||||
capistrano (~> 3.0)
|
capistrano (~> 3.0)
|
||||||
sshkit (>= 1.2)
|
sshkit (>= 1.2)
|
||||||
@@ -525,6 +526,7 @@ DEPENDENCIES
|
|||||||
rollbar (~> 2.14.1)
|
rollbar (~> 2.14.1)
|
||||||
rspec-rails (~> 3.6)
|
rspec-rails (~> 3.6)
|
||||||
rubocop (~> 0.48.1)
|
rubocop (~> 0.48.1)
|
||||||
|
rubyzip (~> 1.2.0)
|
||||||
rvm1-capistrano3
|
rvm1-capistrano3
|
||||||
sass-rails (~> 5.0, >= 5.0.4)
|
sass-rails (~> 5.0, >= 5.0.4)
|
||||||
savon
|
savon
|
||||||
@@ -542,4 +544,4 @@ DEPENDENCIES
|
|||||||
whenever
|
whenever
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.14.6
|
1.15.0
|
||||||
|
|||||||
12
app/controllers/admin/newsletters_controller.rb
Normal file
12
app/controllers/admin/newsletters_controller.rb
Normal 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
|
||||||
@@ -52,6 +52,7 @@ class User < ActiveRecord::Base
|
|||||||
scope :moderators, -> { joins(:moderator) }
|
scope :moderators, -> { joins(:moderator) }
|
||||||
scope :organizations, -> { joins(:organization) }
|
scope :organizations, -> { joins(:organization) }
|
||||||
scope :officials, -> { where("official_level > 0") }
|
scope :officials, -> { where("official_level > 0") }
|
||||||
|
scope :newsletter, -> { where(newsletter: true) }
|
||||||
scope :for_render, -> { includes(:organization) }
|
scope :for_render, -> { includes(:organization) }
|
||||||
scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) }
|
scope :by_document, -> (document_type, document_number) { where(document_type: document_type, document_number: document_number) }
|
||||||
scope :email_digest, -> { where(email_digest: true) }
|
scope :email_digest, -> { where(email_digest: true) }
|
||||||
|
|||||||
@@ -162,5 +162,12 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% 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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
3
app/views/admin/newsletters/index.html.erb
Normal file
3
app/views/admin/newsletters/index.html.erb
Normal 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" %>
|
||||||
@@ -205,6 +205,7 @@ en:
|
|||||||
hidden_users: Hidden users
|
hidden_users: Hidden users
|
||||||
managers: Managers
|
managers: Managers
|
||||||
moderators: Moderators
|
moderators: Moderators
|
||||||
|
newsletter: Newsletters
|
||||||
valuators: Valuators
|
valuators: Valuators
|
||||||
poll_officers: Poll officers
|
poll_officers: Poll officers
|
||||||
polls: Polls
|
polls: Polls
|
||||||
@@ -236,6 +237,10 @@ en:
|
|||||||
email_placeholder: Search user by email
|
email_placeholder: Search user by email
|
||||||
search: Search
|
search: Search
|
||||||
user_not_found: User not found
|
user_not_found: User not found
|
||||||
|
newsletters:
|
||||||
|
index:
|
||||||
|
title: Newsletters
|
||||||
|
button: Download zip with users list
|
||||||
valuators:
|
valuators:
|
||||||
index:
|
index:
|
||||||
title: Valuators
|
title: Valuators
|
||||||
|
|||||||
@@ -205,6 +205,7 @@ es:
|
|||||||
hidden_users: Usuarios bloqueados
|
hidden_users: Usuarios bloqueados
|
||||||
managers: Gestores
|
managers: Gestores
|
||||||
moderators: Moderadores
|
moderators: Moderadores
|
||||||
|
newsletter: Envío de Newsletters
|
||||||
valuators: Evaluadores
|
valuators: Evaluadores
|
||||||
poll_officers: Presidentes de mesa
|
poll_officers: Presidentes de mesa
|
||||||
polls: Votaciones
|
polls: Votaciones
|
||||||
@@ -236,6 +237,10 @@ es:
|
|||||||
email_placeholder: Buscar usuario por email
|
email_placeholder: Buscar usuario por email
|
||||||
search: Buscar
|
search: Buscar
|
||||||
user_not_found: Usuario no encontrado
|
user_not_found: Usuario no encontrado
|
||||||
|
newsletters:
|
||||||
|
index:
|
||||||
|
title: Envío de newsletters
|
||||||
|
button: Descargar zip con lista de usuarios
|
||||||
valuators:
|
valuators:
|
||||||
index:
|
index:
|
||||||
title: Evaluadores
|
title: Evaluadores
|
||||||
|
|||||||
@@ -239,6 +239,9 @@ Rails.application.routes.draw do
|
|||||||
end
|
end
|
||||||
|
|
||||||
resource :activity, controller: :activity, only: :show
|
resource :activity, controller: :activity, only: :show
|
||||||
|
resources :newsletters, only: :index do
|
||||||
|
get :users, on: :collection
|
||||||
|
end
|
||||||
resource :stats, only: :show do
|
resource :stats, only: :show do
|
||||||
get :proposal_notifications, on: :collection
|
get :proposal_notifications, on: :collection
|
||||||
get :direct_messages, on: :collection
|
get :direct_messages, on: :collection
|
||||||
|
|||||||
25
lib/newsletter_zip.rb
Normal file
25
lib/newsletter_zip.rb
Normal 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
|
||||||
26
spec/features/admin/newsletters_spec.rb
Normal file
26
spec/features/admin/newsletters_spec.rb
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user