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 +