2013-02-05 14:16:51 -05:00
require_dependency 'markdown_linker'
2013-06-10 16:46:08 -04:00
require_dependency 'email/message_builder'
2013-07-22 15:06:37 -04:00
require_dependency 'age_words'
2013-02-05 14:16:51 -05:00
class UserNotifications < ActionMailer :: Base
2015-01-28 14:56:18 -05:00
helper :application
2013-04-26 16:56:28 +10:00
default charset : 'UTF-8'
2013-06-10 16:46:08 -04:00
include Email :: BuildEmailHelper
2013-02-05 14:16:51 -05:00
def signup ( user , opts = { } )
2013-06-10 16:46:08 -04:00
build_email ( user . email ,
2013-06-12 16:35:46 -04:00
template : " user_notifications.signup " ,
email_token : opts [ :email_token ] )
2013-02-05 14:16:51 -05:00
end
2013-06-05 20:16:31 -07:00
def signup_after_approval ( user , opts = { } )
2013-06-10 16:46:08 -04:00
build_email ( user . email ,
2013-06-12 16:35:46 -04:00
template : 'user_notifications.signup_after_approval' ,
email_token : opts [ :email_token ] ,
2015-11-23 16:45:05 -05:00
new_user_tips : I18n . t ( 'system_messages.usage_tips.text_body_template' , base_url : Discourse . base_url ) )
2013-06-05 20:16:31 -07:00
end
2013-02-05 14:16:51 -05:00
def authorize_email ( user , opts = { } )
2013-06-10 16:46:08 -04:00
build_email ( user . email , template : " user_notifications.authorize_email " , email_token : opts [ :email_token ] )
2013-02-05 14:16:51 -05:00
end
def forgot_password ( user , opts = { } )
2014-01-21 12:42:20 -05:00
build_email ( user . email ,
template : user . has_password? ? " user_notifications.forgot_password " : " user_notifications.set_password " ,
email_token : opts [ :email_token ] )
2013-02-05 14:16:51 -05:00
end
2015-04-27 16:29:48 +05:30
def admin_login ( user , opts = { } )
build_email ( user . email ,
template : " user_notifications.admin_login " ,
email_token : opts [ :email_token ] )
end
2013-02-05 14:16:51 -05:00
2014-09-11 12:47:17 -04:00
def account_created ( user , opts = { } )
build_email ( user . email , template : " user_notifications.account_created " , email_token : opts [ :email_token ] )
end
2015-05-26 11:59:32 -04:00
def short_date ( dt )
2015-11-13 21:45:52 +01:00
if dt . year == Time . now . year
I18n . l ( dt , format : :short_no_year )
2015-10-28 22:15:07 +05:30
else
2015-11-13 21:45:52 +01:00
I18n . l ( dt , format : :short )
2015-10-28 22:15:07 +05:30
end
2015-05-26 11:59:32 -04:00
end
2014-04-17 16:42:40 -04:00
2013-02-05 14:16:51 -05:00
def digest ( user , opts = { } )
@user = user
@base_url = Discourse . base_url
2013-06-03 16:12:24 -04:00
min_date = opts [ :since ] || @user . last_emailed_at || @user . last_seen_at || 1 . month . ago
2013-02-05 14:16:51 -05:00
2015-06-03 22:19:51 +05:30
@site_name = SiteSetting . email_prefix . presence || SiteSetting . title
2013-02-05 14:16:51 -05:00
2014-07-17 12:31:37 -04:00
@header_color = ColorScheme . hex_for_name ( 'header_background' )
2015-05-26 11:59:32 -04:00
@last_seen_at = short_date ( @user . last_seen_at || @user . created_at )
2013-02-07 16:45:24 +01:00
2013-06-03 16:12:24 -04:00
# A list of topics to show the user
2014-04-21 14:44:00 -04:00
@featured_topics = Topic . for_digest ( user , min_date , limit : SiteSetting . digest_topics , top_order : true ) . to_a
2013-02-05 14:16:51 -05:00
# Don't send email unless there is content in it
2013-08-09 14:43:02 -04:00
if @featured_topics . present?
2014-04-17 16:42:40 -04:00
featured_topic_ids = @featured_topics . map ( & :id )
2014-04-17 16:04:26 -04:00
2014-04-17 16:42:40 -04:00
@new_topics_since_seen = Topic . new_since_last_seen ( user , min_date , featured_topic_ids ) . count
2014-11-07 17:16:52 -05:00
if @new_topics_since_seen > SiteSetting . digest_topics
2014-04-17 16:42:40 -04:00
category_counts = Topic . new_since_last_seen ( user , min_date , featured_topic_ids ) . group ( :category_id ) . count
2013-11-29 13:00:10 -05:00
2014-04-17 16:42:40 -04:00
@new_by_category = [ ]
if category_counts . present?
Category . where ( id : category_counts . keys ) . each do | c |
@new_by_category << [ c , category_counts [ c . id ] ]
end
@new_by_category . sort_by! { | c | - c [ 1 ] }
end
end
2014-04-17 16:04:26 -04:00
2014-04-17 16:42:40 -04:00
@featured_topics , @new_topics = @featured_topics [ 0 .. 4 ] , @featured_topics [ 5 .. - 1 ]
@markdown_linker = MarkdownLinker . new ( Discourse . base_url )
2015-02-13 14:15:49 -05:00
@unsubscribe_key = DigestUnsubscribeKey . create_key_for ( @user )
2014-04-17 16:04:26 -04:00
2013-06-10 16:46:08 -04:00
build_email user . email ,
2013-06-12 16:35:46 -04:00
from_alias : I18n . t ( 'user_notifications.digest.from' , site_name : SiteSetting . title ) ,
subject : I18n . t ( 'user_notifications.digest.subject_template' ,
2015-05-26 11:59:32 -04:00
site_name : @site_name ,
date : short_date ( Time . now ) )
2013-02-05 14:16:51 -05:00
end
end
2013-02-07 16:45:24 +01:00
2013-06-12 16:35:46 -04:00
def user_replied ( user , opts )
opts [ :allow_reply_by_email ] = true
2014-09-29 10:46:55 +05:30
opts [ :use_site_subject ] = true
2014-10-03 17:14:08 +05:30
opts [ :show_category_in_subject ] = true
2013-06-12 16:35:46 -04:00
notification_email ( user , opts )
end
def user_quoted ( user , opts )
opts [ :allow_reply_by_email ] = true
2014-09-29 10:46:55 +05:30
opts [ :use_site_subject ] = true
2014-10-03 17:14:08 +05:30
opts [ :show_category_in_subject ] = true
2013-06-12 16:35:46 -04:00
notification_email ( user , opts )
end
def user_mentioned ( user , opts )
opts [ :allow_reply_by_email ] = true
2014-09-29 10:46:55 +05:30
opts [ :use_site_subject ] = true
2014-10-03 17:14:08 +05:30
opts [ :show_category_in_subject ] = true
2013-06-12 16:35:46 -04:00
notification_email ( user , opts )
end
2015-12-01 12:12:55 +11:00
def group_mentioned ( user , opts )
opts [ :allow_reply_by_email ] = true
opts [ :use_site_subject ] = true
opts [ :show_category_in_subject ] = true
notification_email ( user , opts )
end
2013-06-12 16:35:46 -04:00
def user_posted ( user , opts )
opts [ :allow_reply_by_email ] = true
2014-09-29 10:46:55 +05:30
opts [ :use_site_subject ] = true
opts [ :add_re_to_subject ] = true
2014-10-03 17:14:08 +05:30
opts [ :show_category_in_subject ] = true
2013-06-12 16:35:46 -04:00
notification_email ( user , opts )
end
2013-08-07 13:02:49 -04:00
def user_private_message ( user , opts )
opts [ :allow_reply_by_email ] = true
2014-09-29 10:46:55 +05:30
opts [ :use_site_subject ] = true
opts [ :add_re_to_subject ] = true
2014-10-03 17:14:08 +05:30
opts [ :show_category_in_subject ] = false
2013-08-07 13:02:49 -04:00
# We use the 'user_posted' event when you are emailed a post in a PM.
2014-06-16 16:36:02 +10:00
opts [ :notification_type ] = 'posted'
2013-08-07 13:02:49 -04:00
notification_email ( user , opts )
end
2015-04-07 11:51:38 +05:30
def user_invited_to_private_message ( user , opts )
opts [ :use_template_html ] = true
notification_email ( user , opts )
end
2015-03-31 00:06:47 +05:30
def user_invited_to_topic ( user , opts )
2015-04-07 11:51:38 +05:30
opts [ :use_template_html ] = true
2015-03-31 00:06:47 +05:30
opts [ :show_category_in_subject ] = true
notification_email ( user , opts )
end
2014-02-07 11:06:35 +11:00
def mailing_list_notify ( user , post )
send_notification_email (
title : post . topic . title ,
post : post ,
2014-10-21 19:36:55 +05:30
username : post . user . username ,
2015-12-14 11:53:58 -08:00
from_alias : ( SiteSetting . enable_names &&
SiteSetting . display_name_on_email_from &&
post . user . name . present? ) ? post . user . name : post . user . username ,
2014-02-07 11:06:35 +11:00
allow_reply_by_email : true ,
2014-09-29 10:46:55 +05:30
use_site_subject : true ,
add_re_to_subject : true ,
2014-10-03 17:14:08 +05:30
show_category_in_subject : true ,
2014-02-07 11:06:35 +11:00
notification_type : " posted " ,
user : user
)
end
2013-06-12 16:35:46 -04:00
protected
2013-07-22 15:06:37 -04:00
def email_post_markdown ( post )
result = " [email-indent] \n "
result << " #{ post . raw } \n \n "
2013-07-24 17:13:15 +10:00
result << " #{ I18n . t ( 'user_notifications.posted_by' , username : post . username , post_date : post . created_at . strftime ( " %m/%d/%Y " ) ) } \n \n "
2013-07-22 15:06:37 -04:00
result << " [/email-indent] \n "
result
end
2013-07-24 17:13:15 +10:00
class UserNotificationRenderer < ActionView :: Base
include UserNotificationsHelper
end
2014-01-31 16:37:40 +11:00
def self . get_context_posts ( post , topic_user )
context_posts = Post . where ( topic_id : post . topic_id )
. where ( " post_number < ? " , post . post_number )
. where ( user_deleted : false )
. where ( hidden : false )
2015-09-30 12:39:56 -04:00
. where ( post_type : Topic . visible_post_types )
2014-01-31 16:37:40 +11:00
. order ( 'created_at desc' )
. limit ( SiteSetting . email_posts_context )
if topic_user && topic_user . last_emailed_post_number
context_posts = context_posts . where ( " post_number > ? " , topic_user . last_emailed_post_number )
end
context_posts
end
2013-06-12 16:35:46 -04:00
def notification_email ( user , opts )
2013-07-26 17:27:46 +10:00
return unless @notification = opts [ :notification ]
return unless @post = opts [ :post ]
2013-02-05 14:16:51 -05:00
2014-10-21 19:36:55 +05:30
user_name = @notification . data_hash [ :original_username ]
2015-12-14 11:53:58 -08:00
if @post && SiteSetting . enable_names && SiteSetting . display_name_on_email_from
2015-05-06 12:55:33 +10:00
name = User . where ( id : @post . user_id ) . pluck ( :name ) . first
user_name = name unless name . blank?
2014-10-21 19:36:55 +05:30
end
2013-08-07 13:02:49 -04:00
notification_type = opts [ :notification_type ] || Notification . types [ @notification . notification_type ] . to_s
2013-02-27 18:30:14 -05:00
2014-06-12 20:25:20 +08:00
return if user . mailing_list_mode && ! @post . topic . private_message? &&
2015-11-30 17:03:47 +11:00
[ " replied " , " mentioned " , " quoted " , " posted " , " group_mentioned " ] . include? ( notification_type )
2014-02-07 11:06:35 +11:00
title = @notification . data_hash [ :topic_title ]
2014-05-06 15:01:19 -04:00
allow_reply_by_email = opts [ :allow_reply_by_email ] unless user . suspended?
2014-09-29 10:46:55 +05:30
use_site_subject = opts [ :use_site_subject ]
add_re_to_subject = opts [ :add_re_to_subject ]
2014-10-03 17:14:08 +05:30
show_category_in_subject = opts [ :show_category_in_subject ]
2015-04-07 11:51:38 +05:30
use_template_html = opts [ :use_template_html ]
2015-03-31 00:06:47 +05:30
original_username = @notification . data_hash [ :original_username ] || @notification . data_hash [ :display_username ]
2014-02-07 11:06:35 +11:00
send_notification_email (
title : title ,
post : @post ,
2015-03-31 00:06:47 +05:30
username : original_username ,
2014-10-21 19:36:55 +05:30
from_alias : user_name ,
2014-02-07 11:06:35 +11:00
allow_reply_by_email : allow_reply_by_email ,
2014-09-29 10:46:55 +05:30
use_site_subject : use_site_subject ,
add_re_to_subject : add_re_to_subject ,
2014-10-03 17:14:08 +05:30
show_category_in_subject : show_category_in_subject ,
2014-02-07 11:06:35 +11:00
notification_type : notification_type ,
2015-04-07 11:51:38 +05:30
use_template_html : use_template_html ,
2014-02-07 11:06:35 +11:00
user : user
)
end
def send_notification_email ( opts )
post = opts [ :post ]
title = opts [ :title ]
allow_reply_by_email = opts [ :allow_reply_by_email ]
2014-09-29 10:46:55 +05:30
use_site_subject = opts [ :use_site_subject ]
add_re_to_subject = opts [ :add_re_to_subject ] && post . post_number > 1
2014-10-21 19:36:55 +05:30
username = opts [ :username ]
2014-02-07 11:06:35 +11:00
from_alias = opts [ :from_alias ]
notification_type = opts [ :notification_type ]
user = opts [ :user ]
2014-10-03 17:14:08 +05:30
# category name
category = Topic . find_by ( id : post . topic_id ) . category
2015-06-01 15:43:16 +10:00
if opts [ :show_category_in_subject ] && post . topic_id && category && ! category . uncategorized?
2014-10-03 17:14:08 +05:30
show_category_in_subject = category . name
# subcategory case
if ! category . parent_category_id . nil?
show_category_in_subject = " #{ Category . find_by ( id : category . parent_category_id ) . name } / #{ show_category_in_subject } "
end
else
show_category_in_subject = nil
end
2013-07-22 15:06:37 -04:00
context = " "
2014-02-07 11:06:35 +11:00
tu = TopicUser . get ( post . topic_id , user )
context_posts = self . class . get_context_posts ( post , tu )
2013-12-30 13:02:12 +11:00
# make .present? cheaper
context_posts = context_posts . to_a
2013-07-22 15:06:37 -04:00
if context_posts . present?
2013-07-24 17:13:15 +10:00
context << " --- \n * #{ I18n . t ( 'user_notifications.previous_discussion' ) } * \n "
2013-07-22 15:06:37 -04:00
context_posts . each do | cp |
context << email_post_markdown ( cp )
end
end
2015-04-07 11:51:38 +05:30
topic_excerpt = " "
if opts [ :use_template_html ]
topic_excerpt = post . excerpt . gsub ( " \n " , " " ) if post . is_first_post? && post . excerpt
else
html = UserNotificationRenderer . new ( Rails . configuration . paths [ " app/views " ] ) . render (
template : 'email/notification' ,
format : :html ,
locals : { context_posts : context_posts ,
post : post ,
classes : RTL . new ( user ) . css_class
}
)
end
2013-07-24 17:13:15 +10:00
2014-01-21 17:24:05 +11:00
template = " user_notifications.user_ #{ notification_type } "
2015-12-09 19:45:46 +01:00
if post . topic . private_message?
template << " _pm "
template << " _staged " if user . staged?
end
2013-07-24 17:13:15 +10:00
2013-02-27 18:30:14 -05:00
email_opts = {
2014-02-07 11:06:35 +11:00
topic_title : title ,
2015-04-07 11:51:38 +05:30
topic_excerpt : topic_excerpt ,
2014-02-07 11:06:35 +11:00
message : email_post_markdown ( post ) ,
url : post . url ,
post_id : post . id ,
topic_id : post . topic_id ,
2013-07-22 15:06:37 -04:00
context : context ,
2014-10-21 19:36:55 +05:30
username : username ,
2015-11-24 16:58:26 +01:00
add_unsubscribe_link : ! user . staged ,
2016-01-20 22:25:25 +13:00
add_unsubscribe_via_email_link : user . mailing_list_mode ,
2015-08-12 23:00:16 +02:00
unsubscribe_url : post . topic . unsubscribe_url ,
2014-02-07 11:06:35 +11:00
allow_reply_by_email : allow_reply_by_email ,
2014-09-29 10:46:55 +05:30
use_site_subject : use_site_subject ,
add_re_to_subject : add_re_to_subject ,
2014-10-03 17:14:08 +05:30
show_category_in_subject : show_category_in_subject ,
2014-06-06 21:09:00 +08:00
private_reply : post . topic . private_message? ,
2014-05-06 15:01:19 -04:00
include_respond_instructions : ! user . suspended? ,
2014-01-21 17:24:05 +11:00
template : template ,
2013-07-26 17:27:46 +10:00
html_override : html ,
2015-04-07 11:51:38 +05:30
site_description : SiteSetting . site_description ,
site_title : SiteSetting . title ,
2014-01-21 17:24:05 +11:00
style : :notification
2013-02-27 18:30:14 -05:00
}
# If we have a display name, change the from address
2015-08-12 23:00:16 +02:00
email_opts [ :from_alias ] = from_alias if from_alias . present?
2013-02-27 18:30:14 -05:00
2014-02-07 11:06:35 +11:00
TopicUser . change ( user . id , post . topic_id , last_emailed_post_number : post . post_number )
2013-12-30 13:02:12 +11:00
2013-06-10 16:46:08 -04:00
build_email ( user . email , email_opts )
2013-02-07 16:45:24 +01:00
end
2013-02-05 14:16:51 -05:00
end