Commit d90847dbf38af098a528e725028356f7a6687fbf
1 parent
5a45530a
Exists in
send_email_to_admins
Send email to environment and profile admins
- Environment admins can now choose the recipients that will recieve an email sent throw the admin panel. There are now 3 options: All users(exclusive with other options) Environment Admins(inclusive with opt below) Profile Admins(inclusive with opt above) Signed-off-by: Artur Bersan de Faria <arturbersan@gmail.com> Signed-off-by: Brenddon Gontijo <brenddongontijo@msn.com> Signed-off-by: Matheus Miranda <matheusmirandalacerda@gmail.com> Signed-off-by: Omar Junior <omarroinuj@gmail.com> Signed-off-by: Tallys Martins <tallysmartins@gmail.com>
Showing
8 changed files
with
154 additions
and
6 deletions
Show diff stats
app/controllers/admin/users_controller.rb
| @@ -45,7 +45,6 @@ class UsersController < AdminController | @@ -45,7 +45,6 @@ class UsersController < AdminController | ||
| 45 | redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | 45 | redirect_to :action => :index, :q => params[:q], :filter => params[:filter] |
| 46 | end | 46 | end |
| 47 | 47 | ||
| 48 | - | ||
| 49 | def destroy_user | 48 | def destroy_user |
| 50 | if request.post? | 49 | if request.post? |
| 51 | person = environment.people.find_by id: params[:id] | 50 | person = environment.people.find_by id: params[:id] |
| @@ -58,7 +57,6 @@ class UsersController < AdminController | @@ -58,7 +57,6 @@ class UsersController < AdminController | ||
| 58 | redirect_to :action => :index, :q => params[:q], :filter => params[:filter] | 57 | redirect_to :action => :index, :q => params[:q], :filter => params[:filter] |
| 59 | end | 58 | end |
| 60 | 59 | ||
| 61 | - | ||
| 62 | def download | 60 | def download |
| 63 | respond_to do |format| | 61 | respond_to do |format| |
| 64 | format.html | 62 | format.html |
| @@ -87,8 +85,11 @@ class UsersController < AdminController | @@ -87,8 +85,11 @@ class UsersController < AdminController | ||
| 87 | end | 85 | end |
| 88 | 86 | ||
| 89 | def send_mail | 87 | def send_mail |
| 90 | - @mailing = environment.mailings.build(params[:mailing]) | ||
| 91 | if request.post? | 88 | if request.post? |
| 89 | + @mailing = environment.mailings.build(params[:mailing]) | ||
| 90 | + @mailing.recipients_roles = [] | ||
| 91 | + @mailing.recipients_roles << "profile_admin" if params[:recipients][:profile_admins].include?("true") | ||
| 92 | + @mailing.recipients_roles << "environment_administrator" if params[:recipients][:env_admins].include?("true") | ||
| 92 | @mailing.locale = locale | 93 | @mailing.locale = locale |
| 93 | @mailing.person = user | 94 | @mailing.person = user |
| 94 | if @mailing.save | 95 | if @mailing.save |
app/mailers/environment_mailing.rb
| 1 | class EnvironmentMailing < Mailing | 1 | class EnvironmentMailing < Mailing |
| 2 | 2 | ||
| 3 | + settings_items :recipients_roles, :type => :array | ||
| 4 | + attr_accessible :recipients_roles | ||
| 5 | + | ||
| 3 | def recipients(offset=0, limit=100) | 6 | def recipients(offset=0, limit=100) |
| 4 | - source.people.order(:id).offset(offset).limit(limit) | 7 | + recipients_by_role.order(:id).offset(offset).limit(limit) |
| 5 | .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)") | 8 | .joins("LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)") |
| 6 | .where("m.person_id" => nil) | 9 | .where("m.person_id" => nil) |
| 7 | end | 10 | end |
| 8 | 11 | ||
| 12 | + def recipients_by_role | ||
| 13 | + if recipients_roles.nil? | ||
| 14 | + source.people | ||
| 15 | + else | ||
| 16 | + roles = Environment::Role.where("key in (?)", self.recipients_roles) | ||
| 17 | + Person.by_role(roles).where(environment_id: self.source_id) | ||
| 18 | + end | ||
| 19 | + end | ||
| 20 | + | ||
| 9 | def each_recipient | 21 | def each_recipient |
| 10 | offset = 0 | 22 | offset = 0 |
| 11 | limit = 100 | 23 | limit = 100 |
app/views/users/_index_buttons.html.erb
| 1 | <% button_bar do %> | 1 | <% button_bar do %> |
| 2 | <%= button :'text-plain', _('User list as [CSV]'), :action => 'download.csv' %> | 2 | <%= button :'text-plain', _('User list as [CSV]'), :action => 'download.csv' %> |
| 3 | <%= button :'text-html', _('User list as [XML]'), :action => 'download.xml' %> | 3 | <%= button :'text-html', _('User list as [XML]'), :action => 'download.xml' %> |
| 4 | - <%= button :send, _('Send e-mail to all users'), :action => 'send_mail' %> | 4 | + <%= button :send, _('Send e-mail to users'), :action => 'send_mail' %> |
| 5 | <%= button :back, _('Back'), :controller => 'admin_panel' %> | 5 | <%= button :back, _('Back'), :controller => 'admin_panel' %> |
| 6 | <% end %> | 6 | <% end %> |
app/views/users/send_mail.html.erb
| @@ -3,10 +3,19 @@ | @@ -3,10 +3,19 @@ | ||
| 3 | <%= error_messages_for :mailing %> | 3 | <%= error_messages_for :mailing %> |
| 4 | 4 | ||
| 5 | <%= render :file => 'shared/tiny_mce' %> | 5 | <%= render :file => 'shared/tiny_mce' %> |
| 6 | - | ||
| 7 | <%= form_for :mailing do |f| %> | 6 | <%= form_for :mailing do |f| %> |
| 7 | + <div class="recipients"> | ||
| 8 | + <%= label_tag(_("Recipients: "), nil, { class: "formlabel" }) %> | ||
| 9 | + <%= labelled_radio_button(_('All Users'), :send_to, "all", true, { id: "send_to_all" }) %></br> | ||
| 10 | + <%= labelled_radio_button(_('Only Admins'), :send_to, "admins" , false, { id: "send_to_admins" }) %><br> | ||
| 11 | + <div class="recipients-checkboxes"> | ||
| 12 | + <%= labelled_check_box(_('Environment Admins'), 'recipients[env_admins]', true, false, { disabled: true, id: "env_admins" }) %> | ||
| 13 | + <%= labelled_check_box(_('Profile Admins'), 'recipients[profile_admins]', true, false, { disabled: true, id: "profile_admins" }) %> | ||
| 14 | + </div> | ||
| 15 | + </div> | ||
| 8 | <%= labelled_form_field(_('Subject:'), f.text_field(:subject)) %> | 16 | <%= labelled_form_field(_('Subject:'), f.text_field(:subject)) %> |
| 9 | <%= labelled_form_field(_('Body:'), f.text_area(:body, :class => 'mceEditor')) %> | 17 | <%= labelled_form_field(_('Body:'), f.text_area(:body, :class => 'mceEditor')) %> |
| 10 | <%= submit_button(:send, _('Send')) %> | 18 | <%= submit_button(:send, _('Send')) %> |
| 11 | <%= button :cancel, _('Cancel e-mail'), :controller => 'users' %> | 19 | <%= button :cancel, _('Cancel e-mail'), :controller => 'users' %> |
| 12 | <% end %> | 20 | <% end %> |
| 21 | +<%= javascript_include_tag "send_email.js" %> |
features/send_email_to_environment_members.feature
| @@ -43,3 +43,29 @@ Feature: send emails to environment members users | @@ -43,3 +43,29 @@ Feature: send emails to environment members users | ||
| 43 | Then I should be on /admin/users/send_mail | 43 | Then I should be on /admin/users/send_mail |
| 44 | When I follow "Cancel e-mail" | 44 | When I follow "Cancel e-mail" |
| 45 | Then I should be on /admin/users | 45 | Then I should be on /admin/users |
| 46 | + | ||
| 47 | + Scenario: Should display recipients options | ||
| 48 | + Given I am logged in as admin | ||
| 49 | + And I go to /admin/users/send_mail | ||
| 50 | + Then I should see "Recipients" | ||
| 51 | + Then I should see "All Users" | ||
| 52 | + Then I should see "Only Admins" | ||
| 53 | + Then I should see "Environment Admins" | ||
| 54 | + Then I should see "Profile Admins" | ||
| 55 | + | ||
| 56 | + Scenario: All users should be marked as default recipients | ||
| 57 | + Given I am logged in as admin | ||
| 58 | + And I go to /admin/users/send_mail | ||
| 59 | + Then the "send_to_all" radio button should be checked | ||
| 60 | + Then the "send_to_admins" radio button should not be checked | ||
| 61 | + | ||
| 62 | + @selenium | ||
| 63 | + Scenario: Should disable checkboxes when recipients is set to All users | ||
| 64 | + Given I am logged in as admin | ||
| 65 | + And I go to /admin/users/send_mail | ||
| 66 | + Then the field "#profile_admins" should be disabled | ||
| 67 | + Then the field "#env_admins" should be disabled | ||
| 68 | + When I choose "Only Admins" | ||
| 69 | + Then the field "#profile_admins" should be enabled | ||
| 70 | + Then the field "#env_admins" should be enabled | ||
| 71 | + |
| @@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
| 1 | +var all_users_radio_btn = document.getElementById("send_to_all"); | ||
| 2 | +var admins_radio_btn = document.getElementById("send_to_admins"); | ||
| 3 | +var env_admins_checkbox = document.getElementById("env_admins"); | ||
| 4 | +var profile_admins_checkbox = document.getElementById("profile_admins"); | ||
| 5 | + | ||
| 6 | +admins_radio_btn.onchange = function() { | ||
| 7 | + change_checkbox_state("admins"); | ||
| 8 | +}; | ||
| 9 | + | ||
| 10 | +all_users_radio_btn.onchange = function() { | ||
| 11 | + change_checkbox_state("all_users"); | ||
| 12 | + | ||
| 13 | +}; | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +function change_checkbox_state (recipients) { | ||
| 17 | + if(recipients == "all_users"){ | ||
| 18 | + env_admins_checkbox.disabled = true; | ||
| 19 | + profile_admins_checkbox.disabled = true; | ||
| 20 | + }else { | ||
| 21 | + env_admins_checkbox.disabled = false; | ||
| 22 | + profile_admins_checkbox.disabled = false; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | +}; |
test/functional/users_controller_test.rb
| @@ -141,4 +141,36 @@ class UsersControllerTest < ActionController::TestCase | @@ -141,4 +141,36 @@ class UsersControllerTest < ActionController::TestCase | ||
| 141 | assert_redirected_to :action => 'index' | 141 | assert_redirected_to :action => 'index' |
| 142 | end | 142 | end |
| 143 | 143 | ||
| 144 | + should 'redirect to index after send email with success' do | ||
| 145 | + post :send_mail, mailing: { subject: "Subject", body: "Body" }, recipients: { profile_admins: "false", env_admins: "false" } | ||
| 146 | + assert_redirected_to :action => 'index' | ||
| 147 | + assert_match /The e-mails are being sent/, session[:notice] | ||
| 148 | + end | ||
| 149 | + | ||
| 150 | + should 'mailing recipients_roles should be empty when none is set' do | ||
| 151 | + post :send_mail, mailing: { subject: "Subject", body: "Body" }, recipients: { profile_admins: "false", env_admins: "false" } | ||
| 152 | + mailing = EnvironmentMailing.last | ||
| 153 | + assert_equal mailing.recipients_roles, [] | ||
| 154 | + end | ||
| 155 | + | ||
| 156 | + should 'mailing recipients_roles should be set correctly' do | ||
| 157 | + post :send_mail, mailing: { subject: "Subject", body: "Body" }, recipients: { profile_admins: "true", env_admins: "true" } | ||
| 158 | + mailing = EnvironmentMailing.last | ||
| 159 | + assert_equal mailing.recipients_roles, ["profile_admin", "environment_administrator"] | ||
| 160 | + end | ||
| 161 | + | ||
| 162 | + should 'send mail to admins recipients' do | ||
| 163 | + admin_user = create_user('new_admin').person | ||
| 164 | + admin_user_2 = create_user('new_admin_2').person | ||
| 165 | + | ||
| 166 | + environment.add_admin admin_user | ||
| 167 | + environment.add_admin admin_user_2 | ||
| 168 | + | ||
| 169 | + assert_equal 2, environment.admins.count | ||
| 170 | + assert_difference "MailingSent.count", 2 do | ||
| 171 | + post :send_mail, mailing: { subject: "UnB", body: "Hail UnB" }, recipients: { profile_admins: "false", env_admins: "true" } | ||
| 172 | + process_delayed_job_queue | ||
| 173 | + end | ||
| 174 | + end | ||
| 175 | + | ||
| 144 | end | 176 | end |
test/unit/environment_mailing_test.rb
| @@ -82,6 +82,49 @@ class EnvironmentMailingTest < ActiveSupport::TestCase | @@ -82,6 +82,49 @@ class EnvironmentMailingTest < ActiveSupport::TestCase | ||
| 82 | assert_equal [person_1], mailing.recipients(0, 1) | 82 | assert_equal [person_1], mailing.recipients(0, 1) |
| 83 | end | 83 | end |
| 84 | 84 | ||
| 85 | + should 'return all environment admins when recipients_roles is set to environment_administrator' do | ||
| 86 | + environment.add_admin person_1 | ||
| 87 | + | ||
| 88 | + mailing = create_mailing(environment, :locale => 'pt', :person => person_1) | ||
| 89 | + mailing.recipients_roles = ["environment_administrator"] | ||
| 90 | + mailing.save | ||
| 91 | + | ||
| 92 | + assert_equivalent(environment.admins, mailing.recipients) | ||
| 93 | + end | ||
| 94 | + | ||
| 95 | + should 'return all people with role profile_admin when recipients_roles is set to profile_admin' do | ||
| 96 | + environment.add_admin person_1 | ||
| 97 | + | ||
| 98 | + mailing = create_mailing(environment, :locale => 'pt', :person => person_1) | ||
| 99 | + mailing.recipients_roles = ["profile_admin"] | ||
| 100 | + mailing.save | ||
| 101 | + role = Role.find_by(key: 'profile_admin', environment_id: environment) | ||
| 102 | + profile_admins = Person.by_role(role).where(environment_id: environment) | ||
| 103 | + | ||
| 104 | + assert_equivalent(profile_admins, mailing.recipients) | ||
| 105 | + end | ||
| 106 | + | ||
| 107 | + should 'return all people when recipients_roles is not set' do | ||
| 108 | + environment.add_admin person_1 | ||
| 109 | + | ||
| 110 | + mailing = create_mailing(environment, :locale => 'pt', :person => person_1) | ||
| 111 | + mailing.save | ||
| 112 | + | ||
| 113 | + assert_equivalent(environment.people, mailing.recipients) | ||
| 114 | + end | ||
| 115 | + | ||
| 116 | + should 'return profile_admins and environment admins when both roles are set as recipients' do | ||
| 117 | + environment.add_admin person_1 | ||
| 118 | + | ||
| 119 | + mailing = create_mailing(environment, :locale => 'pt', :person => person_1) | ||
| 120 | + mailing.recipients_roles = ["profile_admin", "environment_administrator"] | ||
| 121 | + mailing.save | ||
| 122 | + role = Role.find_by(key: 'profile_admin', environment_id: environment) | ||
| 123 | + profile_admins = Person.by_role(role).where(environment_id: environment) | ||
| 124 | + | ||
| 125 | + assert_equivalent(profile_admins+environment.admins, mailing.recipients) | ||
| 126 | + end | ||
| 127 | + | ||
| 85 | should 'return true if already sent mailing to a recipient' do | 128 | should 'return true if already sent mailing to a recipient' do |
| 86 | mailing = create_mailing(environment, :person => person_1) | 129 | mailing = create_mailing(environment, :person => person_1) |
| 87 | process_delayed_job_queue | 130 | process_delayed_job_queue |