Feature #32628 » 0004-Enable-users-to-receive-email-notifications-about-hi.patch
| app/models/issue.rb | ||
|---|---|---|
| 1042 | 1042 |
notified = notified.select {|u| u.active? && u.notify_about?(self)}
|
| 1043 | 1043 | |
| 1044 | 1044 |
notified += project.notified_users |
| 1045 |
notified += project.users.preload(:preference).select(&:notify_about_high_priority_issues?) if priority.high? |
|
| 1045 | 1046 |
notified.uniq! |
| 1046 | 1047 |
# Remove users that can not view the issue |
| 1047 | 1048 |
notified.reject! {|user| !visible?(user)}
|
| app/models/user.rb | ||
|---|---|---|
| 811 | 811 |
end |
| 812 | 812 |
end |
| 813 | 813 | |
| 814 |
def notify_about_high_priority_issues? |
|
| 815 |
self.pref.notify_about_high_priority_issues |
|
| 816 |
end |
|
| 817 | ||
| 814 | 818 |
def self.current=(user) |
| 815 | 819 |
RequestStore.store[:current_user] = user |
| 816 | 820 |
end |
| app/models/user_preference.rb | ||
|---|---|---|
| 33 | 33 |
'comments_sorting', |
| 34 | 34 |
'warn_on_leaving_unsaved', |
| 35 | 35 |
'no_self_notified', |
| 36 |
'notify_about_high_priority_issues', |
|
| 36 | 37 |
'textarea_font', |
| 37 | 38 |
'recently_used_projects', |
| 38 | 39 |
'history_default_tab') |
| ... | ... | |
| 51 | 52 |
unless attributes && attributes.key?(:no_self_notified) |
| 52 | 53 |
self.no_self_notified = true |
| 53 | 54 |
end |
| 55 |
unless attributes && attributes.key?(:notify_about_high_priority_issues) |
|
| 56 |
self.notify_about_high_priority_issues = true |
|
| 57 |
end |
|
| 54 | 58 |
end |
| 55 | 59 |
self.others ||= {}
|
| 56 | 60 |
end |
| ... | ... | |
| 87 | 91 |
def no_self_notified; (self[:no_self_notified] == true || self[:no_self_notified] == '1'); end |
| 88 | 92 |
def no_self_notified=(value); self[:no_self_notified]=value; end |
| 89 | 93 | |
| 94 |
def notify_about_high_priority_issues; (self[:notify_about_high_priority_issues] == true || self[:notify_about_high_priority_issues] == '1'); end |
|
| 95 |
def notify_about_high_priority_issues=(value); self[:notify_about_high_priority_issues]=value; end |
|
| 96 | ||
| 90 | 97 |
def activity_scope; Array(self[:activity_scope]) ; end |
| 91 | 98 |
def activity_scope=(value); self[:activity_scope]=value ; end |
| 92 | 99 | |
| app/views/users/_mail_notifications.html.erb | ||
|---|---|---|
| 10 | 10 |
<%= content_tag 'fieldset', :id => 'notified-projects', :style => (@user.mail_notification == 'selected' ? '' : 'display:none;') do %> |
| 11 | 11 |
<legend><%= toggle_checkboxes_link("#notified-projects input[type=checkbox]") %><%=l(:label_project_plural)%></legend>
|
| 12 | 12 |
<%= render_project_nested_lists(@user.projects) do |project| |
| 13 |
content_tag('label',
|
|
| 13 |
content_tag('label',
|
|
| 14 | 14 |
check_box_tag( |
| 15 | 15 |
'user[notified_project_ids][]', |
| 16 | 16 |
project.id, |
| ... | ... | |
| 24 | 24 |
<% end %> |
| 25 | 25 | |
| 26 | 26 |
<%= fields_for :pref, @user.pref do |pref_fields| %> |
| 27 | ||
| 28 |
<% if IssuePriority.default_or_middle and high_priority = IssuePriority.where(['position > ?', IssuePriority.default_or_middle.position]).first %> |
|
| 29 |
<p> |
|
| 30 |
<%= pref_fields.check_box :notify_about_high_priority_issues %> |
|
| 31 |
<label for="pref_notify_about_high_priority_issues"><%= t(:label_user_mail_notify_about_high_priority_issues_html, prio: high_priority.name.downcase) %></label> |
|
| 32 |
</p> |
|
| 33 |
<% end %> |
|
| 27 | 34 |
<p> |
| 28 | 35 |
<%= pref_fields.check_box :no_self_notified %> |
| 29 | 36 |
<label for="pref_no_self_notified"><%= l(:label_user_mail_no_self_notified) %></label> |
| config/locales/en.yml | ||
|---|---|---|
| 908 | 908 |
label_user_mail_option_only_assigned: "Only for things I watch or I am assigned to" |
| 909 | 909 |
label_user_mail_option_only_owner: "Only for things I watch or I am the owner of" |
| 910 | 910 |
label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself" |
| 911 |
label_user_mail_notify_about_high_priority_issues_html: "Also notify me about issues with a priority of <em>%{prio}</em> or higher"
|
|
| 911 | 912 |
label_registration_activation_by_email: account activation by email |
| 912 | 913 |
label_registration_manual_activation: manual account activation |
| 913 | 914 |
label_registration_automatic_activation: automatic account activation |
| test/functional/my_controller_test.rb | ||
|---|---|---|
| 428 | 428 |
assert [mail.bcc, mail.cc].flatten.include?('foobar@example.com')
|
| 429 | 429 |
end |
| 430 | 430 | |
| 431 |
def test_my_account_notify_about_high_priority_issues_preference |
|
| 432 | ||
| 433 |
# normally, preference should be shown |
|
| 434 |
get :account |
|
| 435 |
assert_select 'label[for="pref_notify_about_high_priority_issues"]' |
|
| 436 | ||
| 437 |
# preference should be persisted |
|
| 438 |
put :account, :params => {
|
|
| 439 |
:pref => {
|
|
| 440 |
notify_about_high_priority_issues: '1' |
|
| 441 |
} |
|
| 442 |
} |
|
| 443 |
assert User.find(2).notify_about_high_priority_issues? |
|
| 444 | ||
| 445 |
# preference should be hidden if there aren't any priorities |
|
| 446 |
Issue.destroy_all |
|
| 447 |
IssuePriority.destroy_all |
|
| 448 |
get :account |
|
| 449 |
assert_select 'label[for="pref_notify_about_high_priority_issues"]', false |
|
| 450 | ||
| 451 |
# preference should be hidden if there isn't a "high" priority |
|
| 452 |
a = IssuePriority.create! name: 'A' |
|
| 453 |
get :account |
|
| 454 |
assert_select 'label[for="pref_notify_about_high_priority_issues"]', false |
|
| 455 | ||
| 456 |
# preference should be shown if there are at least two priorities (one low, one high) |
|
| 457 |
b = IssuePriority.create! name: 'B' |
|
| 458 |
get :account |
|
| 459 |
assert_select 'label[for="pref_notify_about_high_priority_issues"]' |
|
| 460 | ||
| 461 |
# preference should be hidden if the highest priority is the default one, |
|
| 462 |
# because that means that there is no "high" priority |
|
| 463 |
b.update! is_default: true |
|
| 464 |
get :account |
|
| 465 |
assert_select 'label[for="pref_notify_about_high_priority_issues"]', false |
|
| 466 |
end |
|
| 467 | ||
| 431 | 468 |
def test_my_account_should_show_destroy_link |
| 432 | 469 |
get :account |
| 433 | 470 |
assert_select 'a[href="/my/account/destroy"]' |
| test/unit/issue_test.rb | ||
|---|---|---|
| 2928 | 2928 |
assert !issue.recipients.include?(issue.assigned_to.mail) |
| 2929 | 2929 |
end |
| 2930 | 2930 | |
| 2931 |
test "Issue#recipients should include users who want to be notified about high issues but only when issue has high priority" do |
|
| 2932 |
user = User.generate! |
|
| 2933 |
user.pref.update! notify_about_high_priority_issues: true |
|
| 2934 |
Member.create!(:project_id => 1, :principal => user, :role_ids => [1]) |
|
| 2935 | ||
| 2936 |
# creation with high prio |
|
| 2937 |
issue = Issue.generate!(priority: IssuePriority.find(6)) |
|
| 2938 |
assert issue.recipients.include?(user.mail) |
|
| 2939 | ||
| 2940 |
# creation with default prio |
|
| 2941 |
issue = Issue.generate! |
|
| 2942 |
assert !issue.recipients.include?(user.mail) |
|
| 2943 | ||
| 2944 |
# update prio to high |
|
| 2945 |
issue.update! priority: IssuePriority.find(6) |
|
| 2946 |
assert issue.recipients.include?(user.mail) |
|
| 2947 | ||
| 2948 |
# update prio to low |
|
| 2949 |
issue.update! priority: IssuePriority.find(4) |
|
| 2950 |
assert !issue.recipients.include?(user.mail) |
|
| 2951 |
end |
|
| 2952 | ||
| 2953 |
test "Authors who don't want to be self-notified should not receive emails even when issue has high priority" do |
|
| 2954 |
user = User.generate! |
|
| 2955 |
user.pref.update! notify_about_high_priority_issues: true |
|
| 2956 |
user.pref.update! no_self_notified: true |
|
| 2957 | ||
| 2958 |
project = Project.find(1) |
|
| 2959 |
project.memberships.destroy_all |
|
| 2960 |
Member.create!(:project_id => 1, :principal => user, :role_ids => [1]) |
|
| 2961 | ||
| 2962 |
ActionMailer::Base.deliveries.clear |
|
| 2963 |
Issue.create(author: user, |
|
| 2964 |
priority: IssuePriority.find(6), |
|
| 2965 |
subject: 'test create', |
|
| 2966 |
project: project, |
|
| 2967 |
tracker: Tracker.first, |
|
| 2968 |
status: IssueStatus.first) |
|
| 2969 |
assert ActionMailer::Base.deliveries.empty? |
|
| 2970 |
end |
|
| 2971 | ||
| 2931 | 2972 |
def test_last_journal_id_with_journals_should_return_the_journal_id |
| 2932 | 2973 |
assert_equal 2, Issue.find(1).last_journal_id |
| 2933 | 2974 |
end |