Skip to content
This repository was archived by the owner on Jul 14, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/mailers/assign_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
class AssignMailer < ActionMailer::Base
include Email::BuildEmailHelper

def self.levels
@levels ||= Enum.new(never: 'never',
different_users: 'different_users',
always: 'always')
end

def send_assignment(to_address, topic, assigned_by)
opts = {
template: 'assign_mailer',
Expand Down
22 changes: 22 additions & 0 deletions app/models/assign_mailer_site_settings.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true

require_dependency 'enum_site_setting'

class AssignMailerSiteSettings < EnumSiteSetting

def self.valid_value?(val)
values.any? { |v| v[:value].to_s == val.to_s }
end

def self.values
@values ||= [
{ name: 'discourse_assign.assign_mailer.never', value: AssignMailer.levels[:never] },
{ name: 'discourse_assign.assign_mailer.different_users', value: AssignMailer.levels[:different_users] },
{ name: 'discourse_assign.assign_mailer.always', value: AssignMailer.levels[:always] }
]
end

def self.translate_names?
true
end
end
4 changes: 4 additions & 0 deletions config/locales/client.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ en:
claim:
title: "claim"
help: "Assign topic to yourself"
assign_mailer:
never: 'Never'
different_users: 'Only if assigner and assignee are different users'
always: 'Always'
reminders_frequency:
description: "Frequency for receiving assigned topics reminders"
never: "Never"
Expand Down
2 changes: 1 addition & 1 deletion config/locales/server.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ en:
assign_other_regex: "Regex that needs to pass for assigning topics to others via mention. Example 'your list'."
unassign_on_group_archive: "When a message is archived by a group, unassign message (reassign if moved back to inbox)"
unassign_on_close: "When a topic is closed unassign topic"
assign_mailer_enabled: "When enabled, the assigned user will receive a notification email on each assignment"
assign_mailer: "When to send notification email for assignments"
remind_assigns: "Remind users about pending assigns."
remind_assigns_frequency: "Frequency for reminding users about assigned topics."
max_assigned_topics: "Maximum number of topics that can be assigned to a user."
Expand Down
4 changes: 3 additions & 1 deletion config/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ plugins:
assigns_user_url_path:
client: true
default: "/u/{username}/activity/assigned"
assign_mailer_enabled: false
assign_mailer:
default: "never"
enum: "AssignMailerSiteSettings"
remind_assigns_frequency:
client: true
enum: "RemindAssignsFrequencySiteSettings"
Expand Down
17 changes: 17 additions & 0 deletions db/migrate/20191119174425_rename_site_setting_assign_emailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class RenameSiteSettingAssignEmailer < ActiveRecord::Migration[6.0]
def up
execute "UPDATE site_settings
SET name = 'assign_mailer', value = '#{AssignMailer.levels[:always]}', data_type = #{SiteSettings::TypeSupervisor.types[:enum]}
WHERE name = 'assign_mailer_enabled' AND value = 't' AND data_type = #{SiteSettings::TypeSupervisor.types[:enum]}"

execute "UPDATE site_settings
SET name = 'assign_mailer', value = '#{AssignMailer.levels[:never]}', data_type = #{SiteSettings::TypeSupervisor.types[:enum]}
WHERE name = 'assign_mailer_enabled' AND value = 'f' AND data_type = #{SiteSettings::TypeSupervisor.types[:enum]}"
end

def down
raise ActiveRecord::IrreversibleMigration
end
end
2 changes: 1 addition & 1 deletion lib/topic_assigner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ def assign(assign_to, silent: false)
)
end

if SiteSetting.assign_mailer_enabled
if SiteSetting.assign_mailer == AssignMailer.levels[:always] || (SiteSetting.assign_mailer == AssignMailer.levels[:different_users] && @assigned_by.id != assign_to.id)
if !@topic.muted?(assign_to)
message = AssignMailer.send_assignment(assign_to.email, @topic, @assigned_by)
Email::Sender.new(message, :assign_message).send
Expand Down
37 changes: 36 additions & 1 deletion spec/lib/topic_assigner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ def assert_publish_topic_state(topic, user)
end

it "doesn't assign the same user more than once" do
SiteSetting.assign_mailer_enabled = true
SiteSetting.assign_mailer = AssignMailer.levels[:always]
another_mod = Fabricate(:moderator, groups: [assign_allowed_group])

Email::Sender.any_instance.expects(:send).once
Expand Down Expand Up @@ -284,4 +284,39 @@ def assigned_to?(asignee)
expect(TopicQuery.new(moderator, assigned: moderator.username).list_latest.topics).to eq([topic])
end
end

context "assign_emailer" do
let(:post) { Fabricate(:post) }
let(:topic) { post.topic }
let(:moderator) { Fabricate(:moderator, groups: [assign_allowed_group]) }
let(:moderator2) { Fabricate(:moderator, groups: [assign_allowed_group]) }

it "send an email if set to 'always'" do
SiteSetting.assign_mailer = AssignMailer.levels[:always]

expect { TopicAssigner.new(topic, moderator).assign(moderator) }
.to change { ActionMailer::Base.deliveries.size }.by(1)
end

it "doesn't send an email if the assigner and assignee are not different" do
SiteSetting.assign_mailer = AssignMailer.levels[:different_users]

expect { TopicAssigner.new(topic, moderator).assign(moderator2) }
.to change { ActionMailer::Base.deliveries.size }.by(1)
end

it "doesn't send an email if the assigner and assignee are not different" do
SiteSetting.assign_mailer = AssignMailer.levels[:different_users]

expect { TopicAssigner.new(topic, moderator).assign(moderator) }
.to change { ActionMailer::Base.deliveries.size }.by(0)
end

it "doesn't send an email" do
SiteSetting.assign_mailer = AssignMailer.levels[:never]

expect { TopicAssigner.new(topic, moderator).assign(moderator2) }
.to change { ActionMailer::Base.deliveries.size }.by(0)
end
end
end