mirror of
https://github.com/discourse/discourse.git
synced 2025-09-12 21:10:47 +08:00
Support for sending PMs to email addresses (#4988)
* Added support for sending PMs to email addresses. * Made changes after review. * Added settings validator. * Fixed tests.
This commit is contained in:
parent
4623b46b0b
commit
bb3a5910d7
11 changed files with 134 additions and 3 deletions
|
@ -299,6 +299,17 @@ class Guardian
|
|||
(!is_blocked? || target.staff?)
|
||||
end
|
||||
|
||||
def cand_send_private_messages_to_email?
|
||||
# Staged users must be enabled to create a temporary user.
|
||||
SiteSetting.enable_staged_users &&
|
||||
# User is authenticated
|
||||
authenticated? &&
|
||||
# User is trusted enough
|
||||
@user.has_trust_level?(SiteSetting.min_trust_to_send_email_messages) &&
|
||||
# PMs to email addresses are enabled
|
||||
(is_staff? || SiteSetting.enable_private_email_messages)
|
||||
end
|
||||
|
||||
def can_see_emails?
|
||||
@can_see_emails
|
||||
end
|
||||
|
|
|
@ -162,11 +162,16 @@ class TopicCreator
|
|||
return unless @opts[:archetype] == Archetype.private_message
|
||||
topic.subtype = TopicSubtype.user_to_user unless topic.subtype
|
||||
|
||||
unless @opts[:target_usernames].present? || @opts[:target_group_names].present?
|
||||
unless @opts[:target_usernames].present? || @opts[:target_emails].present? || @opts[:target_group_names].present?
|
||||
rollback_with!(topic, :no_user_selected)
|
||||
end
|
||||
|
||||
if @opts[:target_emails].present? && !@guardian.cand_send_private_messages_to_email? then
|
||||
rollback_with!(topic, :reply_by_email_disabled)
|
||||
end
|
||||
|
||||
add_users(topic, @opts[:target_usernames])
|
||||
add_emails(topic, @opts[:target_emails])
|
||||
add_groups(topic, @opts[:target_group_names])
|
||||
topic.topic_allowed_users.build(user_id: @user.id)
|
||||
end
|
||||
|
@ -195,6 +200,23 @@ class TopicCreator
|
|||
rollback_with!(topic, :target_user_not_found) unless len == names.length
|
||||
end
|
||||
|
||||
def add_emails(topic, emails)
|
||||
return unless emails
|
||||
|
||||
emails = emails.split(',').flatten
|
||||
len = 0
|
||||
|
||||
emails.each do |email|
|
||||
display_name = email.split("@").first
|
||||
user = find_or_create_user(email, display_name)
|
||||
@added_users << user
|
||||
topic.topic_allowed_users.build(user_id: user.id)
|
||||
len += 1
|
||||
end
|
||||
|
||||
rollback_with!(topic, :target_user_not_found) unless len == emails.length
|
||||
end
|
||||
|
||||
def add_groups(topic, groups)
|
||||
return unless groups
|
||||
names = groups.split(',').flatten
|
||||
|
@ -213,4 +235,23 @@ class TopicCreator
|
|||
def check_can_send_permission!(topic, obj)
|
||||
rollback_with!(topic, :cant_send_pm) unless @opts[:skip_validations] || @guardian.can_send_private_message?(obj)
|
||||
end
|
||||
|
||||
def find_or_create_user(email, display_name)
|
||||
user = User.find_by_email(email)
|
||||
|
||||
if user.nil? && SiteSetting.enable_staged_users
|
||||
username = UserNameSuggester.sanitize_username(display_name) if display_name.present?
|
||||
user = User.create!(
|
||||
email: email,
|
||||
username: UserNameSuggester.suggest(username.presence || email),
|
||||
name: display_name.presence || User.suggest_name(email),
|
||||
staged: true
|
||||
)
|
||||
end
|
||||
|
||||
user
|
||||
rescue
|
||||
rollback_with!(topic, :target_user_not_found)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
20
lib/validators/enable_private_email_messages_validator.rb
Normal file
20
lib/validators/enable_private_email_messages_validator.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
class EnablePrivateEmailMessagesValidator
|
||||
|
||||
def initialize(opts = {})
|
||||
@opts = opts
|
||||
end
|
||||
|
||||
def valid_value?(val)
|
||||
return true if val == "f"
|
||||
SiteSetting.enable_staged_users &&
|
||||
SiteSetting.reply_by_email_enabled
|
||||
end
|
||||
|
||||
def error_message
|
||||
if !SiteSetting.enable_staged_users
|
||||
I18n.t("site_settings.errors.staged_users_disabled")
|
||||
elsif !SiteSetting.reply_by_email_enabled
|
||||
I18n.t("site_settings.errors.reply_by_email_disabled")
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue