mirror of
https://github.com/discourse/discourse.git
synced 2025-02-17 12:32:50 +08:00
FEATURE: More digest email frequency options. Digests can be sent as often as every 30 minutes.
This commit is contained in:
parent
be257225b6
commit
c1aea91d63
|
@ -68,10 +68,12 @@ export default Ember.Controller.extend(CanCheckEmails, {
|
||||||
{name: I18n.t('user.email_previous_replies.never'), value: 2}
|
{name: I18n.t('user.email_previous_replies.never'), value: 2}
|
||||||
],
|
],
|
||||||
|
|
||||||
digestFrequencies: [{ name: I18n.t('user.email_digests.daily'), value: 1 },
|
digestFrequencies: [{ name: I18n.t('user.email_digests.every_30_minutes'), value: 30 },
|
||||||
{ name: I18n.t('user.email_digests.every_three_days'), value: 3 },
|
{ name: I18n.t('user.email_digests.every_hour'), value: 60 },
|
||||||
{ name: I18n.t('user.email_digests.weekly'), value: 7 },
|
{ name: I18n.t('user.email_digests.daily'), value: 1440 },
|
||||||
{ name: I18n.t('user.email_digests.every_two_weeks'), value: 14 }],
|
{ name: I18n.t('user.email_digests.every_three_days'), value: 4320 },
|
||||||
|
{ name: I18n.t('user.email_digests.weekly'), value: 10080 },
|
||||||
|
{ name: I18n.t('user.email_digests.every_two_weeks'), value: 20160 }],
|
||||||
|
|
||||||
likeNotificationFrequencies: [{ name: I18n.t('user.like_notification_frequency.always'), value: 0 },
|
likeNotificationFrequencies: [{ name: I18n.t('user.like_notification_frequency.always'), value: 0 },
|
||||||
{ name: I18n.t('user.like_notification_frequency.first_time_and_daily'), value: 1 },
|
{ name: I18n.t('user.like_notification_frequency.first_time_and_daily'), value: 1 },
|
||||||
|
|
|
@ -165,7 +165,7 @@ const User = RestModel.extend({
|
||||||
'enable_quoting',
|
'enable_quoting',
|
||||||
'disable_jump_reply',
|
'disable_jump_reply',
|
||||||
'automatically_unpin_topics',
|
'automatically_unpin_topics',
|
||||||
'digest_after_days',
|
'digest_after_minutes',
|
||||||
'new_topic_duration_minutes',
|
'new_topic_duration_minutes',
|
||||||
'auto_track_topics_after_msecs',
|
'auto_track_topics_after_msecs',
|
||||||
'like_notification_frequency'
|
'like_notification_frequency'
|
||||||
|
|
|
@ -172,7 +172,7 @@
|
||||||
{{preference-checkbox labelKey="user.email_digests.title" checked=model.user_option.email_digests}}
|
{{preference-checkbox labelKey="user.email_digests.title" checked=model.user_option.email_digests}}
|
||||||
{{#if model.user_option.email_digests}}
|
{{#if model.user_option.email_digests}}
|
||||||
<div class='controls controls-dropdown'>
|
<div class='controls controls-dropdown'>
|
||||||
{{combo-box valueAttribute="value" content=digestFrequencies value=model.user_option.digest_after_days}}
|
{{combo-box valueAttribute="value" content=digestFrequencies value=model.user_option.digest_after_minutes}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -2,7 +2,7 @@ module Jobs
|
||||||
|
|
||||||
# A daily job that will enqueue digest emails to be sent to users
|
# A daily job that will enqueue digest emails to be sent to users
|
||||||
class EnqueueDigestEmails < Jobs::Scheduled
|
class EnqueueDigestEmails < Jobs::Scheduled
|
||||||
every 6.hours
|
every 30.minutes
|
||||||
|
|
||||||
def execute(args)
|
def execute(args)
|
||||||
unless SiteSetting.disable_digest_emails?
|
unless SiteSetting.disable_digest_emails?
|
||||||
|
@ -13,14 +13,14 @@ module Jobs
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_user_ids
|
def target_user_ids
|
||||||
# Users who want to receive emails and haven't been emailed in the last day
|
# Users who want to receive digest email within their chosen digest email frequency
|
||||||
query = User.real
|
query = User.real
|
||||||
.where(active: true, staged: false)
|
.where(active: true, staged: false)
|
||||||
.joins(:user_option)
|
.joins(:user_option)
|
||||||
.not_suspended
|
.not_suspended
|
||||||
.where(user_options: {email_digests: true})
|
.where(user_options: {email_digests: true})
|
||||||
.where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * user_options.digest_after_days)")
|
.where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
|
||||||
.where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * user_options.digest_after_days)")
|
.where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)")
|
||||||
.where("COALESCE(last_seen_at, '2010-01-01') >= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * #{SiteSetting.delete_digest_email_after_days})")
|
.where("COALESCE(last_seen_at, '2010-01-01') >= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * #{SiteSetting.delete_digest_email_after_days})")
|
||||||
|
|
||||||
# If the site requires approval, make sure the user is approved
|
# If the site requires approval, make sure the user is approved
|
||||||
|
|
|
@ -10,10 +10,12 @@ class DigestEmailSiteSetting < EnumSiteSetting
|
||||||
def self.values
|
def self.values
|
||||||
@values ||= [
|
@values ||= [
|
||||||
{ name: 'never', value: 0 },
|
{ name: 'never', value: 0 },
|
||||||
{ name: 'daily', value: 1 },
|
{ name: 'every_30_minutes', value: 30 },
|
||||||
{ name: 'every_three_days', value: 3 },
|
{ name: 'every_hour', value: 60 },
|
||||||
{ name: 'weekly', value: 7 },
|
{ name: 'daily', value: 1440 },
|
||||||
{ name: 'every_two_weeks', value: 14 }
|
{ name: 'every_three_days', value: 4320 },
|
||||||
|
{ name: 'weekly', value: 10080 },
|
||||||
|
{ name: 'every_two_weeks', value: 20160 }
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ class UserOption < ActiveRecord::Base
|
||||||
self.email_digests = false
|
self.email_digests = false
|
||||||
else
|
else
|
||||||
self.email_digests = true
|
self.email_digests = true
|
||||||
self.digest_after_days ||= SiteSetting.default_email_digest_frequency.to_i
|
self.digest_after_minutes ||= SiteSetting.default_email_digest_frequency.to_i
|
||||||
end
|
end
|
||||||
|
|
||||||
true
|
true
|
||||||
|
@ -127,7 +127,7 @@ end
|
||||||
# disable_jump_reply :boolean default(FALSE), not null
|
# disable_jump_reply :boolean default(FALSE), not null
|
||||||
# edit_history_public :boolean default(FALSE), not null
|
# edit_history_public :boolean default(FALSE), not null
|
||||||
# automatically_unpin_topics :boolean default(TRUE), not null
|
# automatically_unpin_topics :boolean default(TRUE), not null
|
||||||
# digest_after_days :integer
|
# digest_after_minutes :integer
|
||||||
# auto_track_topics_after_msecs :integer
|
# auto_track_topics_after_msecs :integer
|
||||||
# new_topic_duration_minutes :integer
|
# new_topic_duration_minutes :integer
|
||||||
# last_redirected_to_top_at :datetime
|
# last_redirected_to_top_at :datetime
|
||||||
|
|
|
@ -9,7 +9,7 @@ class UserOptionSerializer < ApplicationSerializer
|
||||||
:dynamic_favicon,
|
:dynamic_favicon,
|
||||||
:enable_quoting,
|
:enable_quoting,
|
||||||
:disable_jump_reply,
|
:disable_jump_reply,
|
||||||
:digest_after_days,
|
:digest_after_minutes,
|
||||||
:automatically_unpin_topics,
|
:automatically_unpin_topics,
|
||||||
:edit_history_public,
|
:edit_history_public,
|
||||||
:auto_track_topics_after_msecs,
|
:auto_track_topics_after_msecs,
|
||||||
|
|
|
@ -18,7 +18,7 @@ class UserUpdater
|
||||||
:disable_jump_reply,
|
:disable_jump_reply,
|
||||||
:edit_history_public,
|
:edit_history_public,
|
||||||
:automatically_unpin_topics,
|
:automatically_unpin_topics,
|
||||||
:digest_after_days,
|
:digest_after_minutes,
|
||||||
:new_topic_duration_minutes,
|
:new_topic_duration_minutes,
|
||||||
:auto_track_topics_after_msecs,
|
:auto_track_topics_after_msecs,
|
||||||
:email_previous_replies,
|
:email_previous_replies,
|
||||||
|
|
|
@ -193,6 +193,8 @@ en:
|
||||||
more: "More"
|
more: "More"
|
||||||
less: "Less"
|
less: "Less"
|
||||||
never: "never"
|
never: "never"
|
||||||
|
every_30_minutes: "every 30 minutes"
|
||||||
|
every_hour: "every hour"
|
||||||
daily: "daily"
|
daily: "daily"
|
||||||
weekly: "weekly"
|
weekly: "weekly"
|
||||||
every_two_weeks: "every two weeks"
|
every_two_weeks: "every two weeks"
|
||||||
|
@ -639,6 +641,8 @@ en:
|
||||||
never: "never"
|
never: "never"
|
||||||
email_digests:
|
email_digests:
|
||||||
title: "When I don't visit here, send an email digest of what's new:"
|
title: "When I don't visit here, send an email digest of what's new:"
|
||||||
|
every_30_minutes: "every 30 minutes"
|
||||||
|
every_hour: "hourly"
|
||||||
daily: "daily"
|
daily: "daily"
|
||||||
every_three_days: "every three days"
|
every_three_days: "every three days"
|
||||||
weekly: "weekly"
|
weekly: "weekly"
|
||||||
|
|
|
@ -1070,7 +1070,7 @@ uncategorized:
|
||||||
user_preferences:
|
user_preferences:
|
||||||
default_email_digest_frequency:
|
default_email_digest_frequency:
|
||||||
enum: 'DigestEmailSiteSetting'
|
enum: 'DigestEmailSiteSetting'
|
||||||
default: 7
|
default: 10080
|
||||||
default_email_private_messages: true
|
default_email_private_messages: true
|
||||||
default_email_direct: true
|
default_email_direct: true
|
||||||
default_email_mailing_list_mode: false
|
default_email_mailing_list_mode: false
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
class RenameDigestAfterDaysToDigestAfterMinutes < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
rename_column :user_options, :digest_after_days, :digest_after_minutes
|
||||||
|
execute "UPDATE user_options SET digest_after_minutes = digest_after_minutes * 1440 WHERE digest_after_minutes IS NOT NULL"
|
||||||
|
execute "UPDATE site_settings SET value = value::integer * 1440 WHERE name = 'default_email_digest_frequency' AND value IS NOT NULL"
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
rename_column :user_options, :digest_after_minutes, :digest_after_days
|
||||||
|
execute "UPDATE user_options SET digest_after_days = digest_after_days / 1440 WHERE digest_after_days IS NOT NULL"
|
||||||
|
execute "UPDATE site_settings SET value = value::integer / 1440 WHERE name = 'default_email_digest_frequency' AND value IS NOT NULL"
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,11 +3,11 @@ require 'rails_helper'
|
||||||
describe DigestEmailSiteSetting do
|
describe DigestEmailSiteSetting do
|
||||||
describe 'valid_value?' do
|
describe 'valid_value?' do
|
||||||
it 'returns true for a valid value as an int' do
|
it 'returns true for a valid value as an int' do
|
||||||
expect(DigestEmailSiteSetting.valid_value?(1)).to eq true
|
expect(DigestEmailSiteSetting.valid_value?(1440)).to eq true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns true for a valid value as a string' do
|
it 'returns true for a valid value as a string' do
|
||||||
expect(DigestEmailSiteSetting.valid_value?('1')).to eq true
|
expect(DigestEmailSiteSetting.valid_value?('1440')).to eq true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns false for an invalid value' do
|
it 'returns false for an invalid value' do
|
||||||
|
|
|
@ -1157,7 +1157,7 @@ describe User do
|
||||||
context "when user preferences are overriden" do
|
context "when user preferences are overriden" do
|
||||||
|
|
||||||
before do
|
before do
|
||||||
SiteSetting.default_email_digest_frequency = 1 # daily
|
SiteSetting.default_email_digest_frequency = 1440 # daily
|
||||||
SiteSetting.default_email_private_messages = false
|
SiteSetting.default_email_private_messages = false
|
||||||
SiteSetting.default_email_direct = false
|
SiteSetting.default_email_direct = false
|
||||||
SiteSetting.default_email_mailing_list_mode = true
|
SiteSetting.default_email_mailing_list_mode = true
|
||||||
|
@ -1183,7 +1183,7 @@ describe User do
|
||||||
options = user.user_option
|
options = user.user_option
|
||||||
expect(options.email_always).to eq(true)
|
expect(options.email_always).to eq(true)
|
||||||
expect(options.mailing_list_mode).to eq(true)
|
expect(options.mailing_list_mode).to eq(true)
|
||||||
expect(options.digest_after_days).to eq(1)
|
expect(options.digest_after_minutes).to eq(1440)
|
||||||
expect(options.email_private_messages).to eq(false)
|
expect(options.email_private_messages).to eq(false)
|
||||||
expect(options.external_links_in_new_tab).to eq(true)
|
expect(options.external_links_in_new_tab).to eq(true)
|
||||||
expect(options.enable_quoting).to eq(false)
|
expect(options.enable_quoting).to eq(false)
|
||||||
|
|
|
@ -46,7 +46,7 @@ describe UserUpdater do
|
||||||
updater.update(bio_raw: 'my new bio',
|
updater.update(bio_raw: 'my new bio',
|
||||||
email_always: 'true',
|
email_always: 'true',
|
||||||
mailing_list_mode: true,
|
mailing_list_mode: true,
|
||||||
digest_after_days: "8",
|
digest_after_minutes: "45",
|
||||||
new_topic_duration_minutes: 100,
|
new_topic_duration_minutes: 100,
|
||||||
auto_track_topics_after_msecs: 101,
|
auto_track_topics_after_msecs: 101,
|
||||||
email_in_reply_to: false
|
email_in_reply_to: false
|
||||||
|
@ -56,7 +56,7 @@ describe UserUpdater do
|
||||||
expect(user.user_profile.bio_raw).to eq 'my new bio'
|
expect(user.user_profile.bio_raw).to eq 'my new bio'
|
||||||
expect(user.user_option.email_always).to eq true
|
expect(user.user_option.email_always).to eq true
|
||||||
expect(user.user_option.mailing_list_mode).to eq true
|
expect(user.user_option.mailing_list_mode).to eq true
|
||||||
expect(user.user_option.digest_after_days).to eq 8
|
expect(user.user_option.digest_after_minutes).to eq 45
|
||||||
expect(user.user_option.new_topic_duration_minutes).to eq 100
|
expect(user.user_option.new_topic_duration_minutes).to eq 100
|
||||||
expect(user.user_option.auto_track_topics_after_msecs).to eq 101
|
expect(user.user_option.auto_track_topics_after_msecs).to eq 101
|
||||||
expect(user.user_option.email_in_reply_to).to eq false
|
expect(user.user_option.email_in_reply_to).to eq false
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user