diff --git a/Gemfile b/Gemfile
index 05d1379c5..52c854618 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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'
diff --git a/Gemfile.lock b/Gemfile.lock
index 0989276ef..3590726c6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -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
diff --git a/app/controllers/admin/newsletters_controller.rb b/app/controllers/admin/newsletters_controller.rb
new file mode 100644
index 000000000..60895dc0c
--- /dev/null
+++ b/app/controllers/admin/newsletters_controller.rb
@@ -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
\ No newline at end of file
diff --git a/app/models/user.rb b/app/models/user.rb
index c3038c88a..88651630f 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -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) }
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index 0b9929f46..43c53df36 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -162,5 +162,12 @@
<% end %>
<% end %>
+
+
>
+ <%= link_to admin_newsletters_path do %>
+
+ <%= t("admin.menu.newsletter") %>
+ <% end %>
+
diff --git a/app/views/admin/newsletters/index.html.erb b/app/views/admin/newsletters/index.html.erb
new file mode 100644
index 000000000..b7b43c6fc
--- /dev/null
+++ b/app/views/admin/newsletters/index.html.erb
@@ -0,0 +1,3 @@
+<%= t("admin.newsletters.index.title") %>
+
+<%= link_to t("admin.newsletters.index.button"), users_admin_newsletters_path, class: "button" %>
\ No newline at end of file
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml
index a4bae05f4..914ce0ed2 100755
--- a/config/locales/admin.en.yml
+++ b/config/locales/admin.en.yml
@@ -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
diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml
index b42843d70..5b18eb445 100644
--- a/config/locales/admin.es.yml
+++ b/config/locales/admin.es.yml
@@ -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
diff --git a/config/routes.rb b/config/routes.rb
index 4007595db..c016cce56 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -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
diff --git a/lib/newsletter_zip.rb b/lib/newsletter_zip.rb
new file mode 100644
index 000000000..dead7cf82
--- /dev/null
+++ b/lib/newsletter_zip.rb
@@ -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
\ No newline at end of file
diff --git a/spec/features/admin/newsletters_spec.rb b/spec/features/admin/newsletters_spec.rb
new file mode 100644
index 000000000..fccb63dc8
--- /dev/null
+++ b/spec/features/admin/newsletters_spec.rb
@@ -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
+