{{i18n user.email.frequency}}
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 6b839dd4de3..a9befdbad5e 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -57,7 +57,7 @@ class UsersController < ApplicationController
u.new_topic_duration_minutes = params[:new_topic_duration_minutes].to_i if params[:new_topic_duration_minutes]
u.title = params[:title] || u.title if guardian.can_grant_title?(u)
- [:email_digests, :email_direct, :email_private_messages,
+ [:email_digests, :email_always, :email_direct, :email_private_messages,
:external_links_in_new_tab, :enable_quoting, :dynamic_favicon].each do |i|
if params[i].present?
u.send("#{i.to_s}=", params[i] == 'true')
diff --git a/lib/jobs.rb b/app/jobs/base.rb
similarity index 97%
rename from lib/jobs.rb
rename to app/jobs/base.rb
index bbf5b98e1ae..a4a24f31ea7 100644
--- a/lib/jobs.rb
+++ b/app/jobs/base.rb
@@ -215,4 +215,5 @@ module Jobs
end
# Require all jobs
-Dir["#{Rails.root}/lib/jobs/*"].each {|file| require_dependency file }
+Dir["#{Rails.root}/app/jobs/regular/*.rb"].each {|file| require_dependency file }
+Dir["#{Rails.root}/app/jobs/scheduled/*.rb"].each {|file| require_dependency file }
diff --git a/lib/jobs/close_topic.rb b/app/jobs/regular/close_topic.rb
similarity index 100%
rename from lib/jobs/close_topic.rb
rename to app/jobs/regular/close_topic.rb
diff --git a/lib/jobs/exporter.rb b/app/jobs/regular/exporter.rb
similarity index 100%
rename from lib/jobs/exporter.rb
rename to app/jobs/regular/exporter.rb
diff --git a/lib/jobs/feature_topic_users.rb b/app/jobs/regular/feature_topic_users.rb
similarity index 100%
rename from lib/jobs/feature_topic_users.rb
rename to app/jobs/regular/feature_topic_users.rb
diff --git a/lib/jobs/generate_avatars.rb b/app/jobs/regular/generate_avatars.rb
similarity index 100%
rename from lib/jobs/generate_avatars.rb
rename to app/jobs/regular/generate_avatars.rb
diff --git a/lib/jobs/importer.rb b/app/jobs/regular/importer.rb
similarity index 100%
rename from lib/jobs/importer.rb
rename to app/jobs/regular/importer.rb
diff --git a/lib/jobs/invite_email.rb b/app/jobs/regular/invite_email.rb
similarity index 100%
rename from lib/jobs/invite_email.rb
rename to app/jobs/regular/invite_email.rb
diff --git a/lib/jobs/notify_moved_posts.rb b/app/jobs/regular/notify_moved_posts.rb
similarity index 100%
rename from lib/jobs/notify_moved_posts.rb
rename to app/jobs/regular/notify_moved_posts.rb
diff --git a/lib/jobs/process_post.rb b/app/jobs/regular/process_post.rb
similarity index 100%
rename from lib/jobs/process_post.rb
rename to app/jobs/regular/process_post.rb
diff --git a/lib/jobs/send_system_message.rb b/app/jobs/regular/send_system_message.rb
similarity index 100%
rename from lib/jobs/send_system_message.rb
rename to app/jobs/regular/send_system_message.rb
diff --git a/lib/jobs/test_email.rb b/app/jobs/regular/test_email.rb
similarity index 100%
rename from lib/jobs/test_email.rb
rename to app/jobs/regular/test_email.rb
diff --git a/lib/jobs/user_email.rb b/app/jobs/regular/user_email.rb
similarity index 97%
rename from lib/jobs/user_email.rb
rename to app/jobs/regular/user_email.rb
index 40f7a0010fc..a1e235b0644 100644
--- a/lib/jobs/user_email.rb
+++ b/app/jobs/regular/user_email.rb
@@ -16,6 +16,7 @@ module Jobs
return if !user || user.is_banned?
seen_recently = (user.last_seen_at.present? && user.last_seen_at > SiteSetting.email_time_window_mins.minutes.ago)
+ seen_recently = false if user.email_always
email_args = {}
diff --git a/lib/jobs/category_stats.rb b/app/jobs/scheduled/category_stats.rb
similarity index 100%
rename from lib/jobs/category_stats.rb
rename to app/jobs/scheduled/category_stats.rb
diff --git a/lib/jobs/dashboard_stats.rb b/app/jobs/scheduled/dashboard_stats.rb
similarity index 100%
rename from lib/jobs/dashboard_stats.rb
rename to app/jobs/scheduled/dashboard_stats.rb
diff --git a/lib/jobs/destroy_old_deletion_stubs.rb b/app/jobs/scheduled/destroy_old_deletion_stubs.rb
similarity index 100%
rename from lib/jobs/destroy_old_deletion_stubs.rb
rename to app/jobs/scheduled/destroy_old_deletion_stubs.rb
diff --git a/lib/jobs/detect_avatars.rb b/app/jobs/scheduled/detect_avatars.rb
similarity index 100%
rename from lib/jobs/detect_avatars.rb
rename to app/jobs/scheduled/detect_avatars.rb
diff --git a/lib/jobs/enqueue_digest_emails.rb b/app/jobs/scheduled/enqueue_digest_emails.rb
similarity index 83%
rename from lib/jobs/enqueue_digest_emails.rb
rename to app/jobs/scheduled/enqueue_digest_emails.rb
index 40fc30bf0fe..b21136ce149 100644
--- a/lib/jobs/enqueue_digest_emails.rb
+++ b/app/jobs/scheduled/enqueue_digest_emails.rb
@@ -15,7 +15,8 @@ module Jobs
query = User.real
.where(email_digests: true, active: true)
.where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)")
- .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)")
+ .where("(COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * digest_after_days)) OR
+ email_always")
# If the site requires approval, make sure the user is approved
if SiteSetting.must_approve_users?
diff --git a/lib/jobs/ensure_db_consistency.rb b/app/jobs/scheduled/ensure_db_consistency.rb
similarity index 100%
rename from lib/jobs/ensure_db_consistency.rb
rename to app/jobs/scheduled/ensure_db_consistency.rb
diff --git a/lib/jobs/pending_users_reminder.rb b/app/jobs/scheduled/pending_users_reminder.rb
similarity index 100%
rename from lib/jobs/pending_users_reminder.rb
rename to app/jobs/scheduled/pending_users_reminder.rb
diff --git a/lib/jobs/periodical_updates.rb b/app/jobs/scheduled/periodical_updates.rb
similarity index 100%
rename from lib/jobs/periodical_updates.rb
rename to app/jobs/scheduled/periodical_updates.rb
diff --git a/lib/jobs/poll_mailbox.rb b/app/jobs/scheduled/poll_mailbox.rb
similarity index 100%
rename from lib/jobs/poll_mailbox.rb
rename to app/jobs/scheduled/poll_mailbox.rb
diff --git a/lib/jobs/version_check.rb b/app/jobs/scheduled/version_check.rb
similarity index 100%
rename from lib/jobs/version_check.rb
rename to app/jobs/scheduled/version_check.rb
diff --git a/app/models/post.rb b/app/models/post.rb
index fd892902f98..8e837c94dc7 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -1,4 +1,4 @@
-require_dependency 'jobs'
+require_dependency 'jobs/base'
require_dependency 'pretty_text'
require_dependency 'rate_limiter'
require_dependency 'post_revisor'
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 3f9f8518271..54fcf4ca20d 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -47,6 +47,7 @@ class UserSerializer < BasicUserSerializer
:email_digests,
:email_private_messages,
:email_direct,
+ :email_always,
:digest_after_days,
:auto_track_topics_after_msecs,
:new_topic_duration_minutes,
diff --git a/config/application.rb b/config/application.rb
index 65a9b89a855..1a936197e12 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -34,6 +34,7 @@ module Discourse
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += Dir["#{config.root}/app/serializers"]
config.autoload_paths += Dir["#{config.root}/lib/validators/"]
+ config.autoload_paths += Dir["#{config.root}/app"]
# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named.
diff --git a/config/initializers/07-backtrace_silencers.rb b/config/initializers/07-backtrace_silencers.rb
deleted file mode 100644
index 59385cdf379..00000000000
--- a/config/initializers/07-backtrace_silencers.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# Be sure to restart your server when you modify this file.
-
-# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
-# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
-
-# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
-# Rails.backtrace_cleaner.remove_silencers!
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 47a5ac557ff..d1c22dec2c9 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -284,6 +284,7 @@ en:
email_direct: "Receive an email when someone quotes you, replies to your post, or mentions your @username"
email_private_messages: "Receive an email when someone sends you a private message"
+ email_always: "Receive email notifications and email digests even if I am active on the forum"
other_settings: "Other"
diff --git a/db/migrate/20131001060630_add_email_always_to_users.rb b/db/migrate/20131001060630_add_email_always_to_users.rb
new file mode 100644
index 00000000000..c5773574ed2
--- /dev/null
+++ b/db/migrate/20131001060630_add_email_always_to_users.rb
@@ -0,0 +1,5 @@
+class AddEmailAlwaysToUsers < ActiveRecord::Migration
+ def change
+ add_column :users, :email_always, :bool, default: false, null: false
+ end
+end
diff --git a/spec/components/jobs/close_topic_spec.rb b/spec/jobs/close_topic_spec.rb
similarity index 98%
rename from spec/components/jobs/close_topic_spec.rb
rename to spec/jobs/close_topic_spec.rb
index 9b7be667abc..8fa249d1dce 100644
--- a/spec/components/jobs/close_topic_spec.rb
+++ b/spec/jobs/close_topic_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::CloseTopic do
diff --git a/spec/components/jobs/enqueue_digest_emails_spec.rb b/spec/jobs/enqueue_digest_emails_spec.rb
similarity index 82%
rename from spec/components/jobs/enqueue_digest_emails_spec.rb
rename to spec/jobs/enqueue_digest_emails_spec.rb
index 4825ad1acf6..6ead98900f1 100644
--- a/spec/components/jobs/enqueue_digest_emails_spec.rb
+++ b/spec/jobs/enqueue_digest_emails_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::EnqueueDigestEmails do
@@ -38,6 +38,7 @@ describe Jobs::EnqueueDigestEmails do
it "doesn't return users who have been emailed recently" do
Jobs::EnqueueDigestEmails.new.target_user_ids.include?(user_emailed_recently.id).should be_false
end
+
end
context "inactive user" do
@@ -48,16 +49,21 @@ describe Jobs::EnqueueDigestEmails do
end
end
-
- context 'visited the site today' do
- let!(:user_visited_today) { Fabricate(:active_user, last_seen_at: 6.days.ago) }
+ context 'visited the site this week' do
+ let(:user_visited_this_week) { Fabricate(:active_user, last_seen_at: 6.days.ago) }
+ let(:user_visited_this_week_email_always) { Fabricate(:active_user, last_seen_at: 6.days.ago, email_always: true) }
it "doesn't return users who have been emailed recently" do
- Jobs::EnqueueDigestEmails.new.target_user_ids.include?(user_visited_today.id).should be_false
+ user = user_visited_this_week
+ Jobs::EnqueueDigestEmails.new.target_user_ids.include?(user.id).should be_false
+ end
+
+ it "does return users who have been emailed recently but have email_always set" do
+ user = user_visited_this_week_email_always
+ Jobs::EnqueueDigestEmails.new.target_user_ids.include?(user.id).should be_true
end
end
-
context 'regular users' do
let!(:user) { Fabricate(:active_user) }
diff --git a/spec/components/jobs/exporter_spec.rb b/spec/jobs/exporter_spec.rb
similarity index 99%
rename from spec/components/jobs/exporter_spec.rb
rename to spec/jobs/exporter_spec.rb
index 789fe6d8772..2bc5affb56f 100644
--- a/spec/components/jobs/exporter_spec.rb
+++ b/spec/jobs/exporter_spec.rb
@@ -1,4 +1,5 @@
require 'spec_helper'
+require_dependency 'jobs/base'
describe Jobs::Exporter do
before do
diff --git a/spec/components/jobs/feature_topic_users_spec.rb b/spec/jobs/feature_topic_users_spec.rb
similarity index 95%
rename from spec/components/jobs/feature_topic_users_spec.rb
rename to spec/jobs/feature_topic_users_spec.rb
index 5473ad1a3bf..cea64c128f6 100644
--- a/spec/components/jobs/feature_topic_users_spec.rb
+++ b/spec/jobs/feature_topic_users_spec.rb
@@ -1,5 +1,6 @@
require 'spec_helper'
-require 'jobs/process_post'
+require_dependency 'jobs/base'
+require 'jobs/regular/process_post'
describe Jobs::FeatureTopicUsers do
diff --git a/spec/components/jobs/importer_spec.rb b/spec/jobs/importer_spec.rb
similarity index 99%
rename from spec/components/jobs/importer_spec.rb
rename to spec/jobs/importer_spec.rb
index 842ef44e070..51761e6ace6 100644
--- a/spec/components/jobs/importer_spec.rb
+++ b/spec/jobs/importer_spec.rb
@@ -1,4 +1,5 @@
require 'spec_helper'
+require_dependency 'jobs/base'
describe Jobs::Importer do
def stub_schema_changes
diff --git a/spec/components/jobs/invite_email_spec.rb b/spec/jobs/invite_email_spec.rb
similarity index 95%
rename from spec/components/jobs/invite_email_spec.rb
rename to spec/jobs/invite_email_spec.rb
index b7186cd35ac..75611626e52 100644
--- a/spec/components/jobs/invite_email_spec.rb
+++ b/spec/jobs/invite_email_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::InviteEmail do
diff --git a/spec/components/jobs/jobs_base_spec.rb b/spec/jobs/jobs_base_spec.rb
similarity index 93%
rename from spec/components/jobs/jobs_base_spec.rb
rename to spec/jobs/jobs_base_spec.rb
index 29c6bc3ab6c..f112dc935cc 100644
--- a/spec/components/jobs/jobs_base_spec.rb
+++ b/spec/jobs/jobs_base_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::Base do
diff --git a/spec/components/jobs_spec.rb b/spec/jobs/jobs_spec.rb
similarity index 99%
rename from spec/components/jobs_spec.rb
rename to spec/jobs/jobs_spec.rb
index cfde2214841..579bd507a58 100644
--- a/spec/components/jobs_spec.rb
+++ b/spec/jobs/jobs_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs do
diff --git a/spec/components/jobs/notify_moved_posts_spec.rb b/spec/jobs/notify_moved_posts_spec.rb
similarity index 94%
rename from spec/components/jobs/notify_moved_posts_spec.rb
rename to spec/jobs/notify_moved_posts_spec.rb
index 0f00d0a9334..24d85076963 100644
--- a/spec/components/jobs/notify_moved_posts_spec.rb
+++ b/spec/jobs/notify_moved_posts_spec.rb
@@ -1,5 +1,6 @@
require 'spec_helper'
-require 'jobs/process_post'
+require_dependency 'jobs/base'
+require_dependency 'jobs/regular/process_post'
describe Jobs::NotifyMovedPosts do
diff --git a/spec/components/jobs/pending_users_reminder_spec.rb b/spec/jobs/pending_users_reminder_spec.rb
similarity index 100%
rename from spec/components/jobs/pending_users_reminder_spec.rb
rename to spec/jobs/pending_users_reminder_spec.rb
diff --git a/spec/components/jobs/periodical_updates_spec.rb b/spec/jobs/periodical_updates_spec.rb
similarity index 92%
rename from spec/components/jobs/periodical_updates_spec.rb
rename to spec/jobs/periodical_updates_spec.rb
index 6798ee941d1..93485a408b1 100644
--- a/spec/components/jobs/periodical_updates_spec.rb
+++ b/spec/jobs/periodical_updates_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs/periodical_updates'
+require_dependency 'jobs/scheduled/periodical_updates'
describe Jobs::PeriodicalUpdates do
diff --git a/spec/components/jobs/poll_mailbox_spec.rb b/spec/jobs/poll_mailbox_spec.rb
similarity index 91%
rename from spec/components/jobs/poll_mailbox_spec.rb
rename to spec/jobs/poll_mailbox_spec.rb
index 79c5499c8cc..cedd4f7b8f3 100644
--- a/spec/components/jobs/poll_mailbox_spec.rb
+++ b/spec/jobs/poll_mailbox_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs/process_post'
+require_dependency 'jobs/regular/process_post'
describe Jobs::PollMailbox do
diff --git a/spec/components/jobs/process_post_spec.rb b/spec/jobs/process_post_spec.rb
similarity index 96%
rename from spec/components/jobs/process_post_spec.rb
rename to spec/jobs/process_post_spec.rb
index 622a94ceb7f..9d0223be832 100644
--- a/spec/components/jobs/process_post_spec.rb
+++ b/spec/jobs/process_post_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs/process_post'
+require 'jobs/regular/process_post'
describe Jobs::ProcessPost do
diff --git a/spec/components/jobs/send_system_message_spec.rb b/spec/jobs/send_system_message_spec.rb
similarity index 94%
rename from spec/components/jobs/send_system_message_spec.rb
rename to spec/jobs/send_system_message_spec.rb
index ce1ee1c4a43..7ba2ac0f0f3 100644
--- a/spec/components/jobs/send_system_message_spec.rb
+++ b/spec/jobs/send_system_message_spec.rb
@@ -1,6 +1,5 @@
require 'spec_helper'
-
-require 'jobs/send_system_message'
+require 'jobs/regular/send_system_message'
describe Jobs::SendSystemMessage do
diff --git a/spec/components/jobs/test_email_spec.rb b/spec/jobs/test_email_spec.rb
similarity index 95%
rename from spec/components/jobs/test_email_spec.rb
rename to spec/jobs/test_email_spec.rb
index a8881fe0a85..69daebf7e51 100644
--- a/spec/components/jobs/test_email_spec.rb
+++ b/spec/jobs/test_email_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::TestEmail do
diff --git a/spec/components/jobs/user_email_spec.rb b/spec/jobs/user_email_spec.rb
similarity index 90%
rename from spec/components/jobs/user_email_spec.rb
rename to spec/jobs/user_email_spec.rb
index ae43956b55e..2b4d166f082 100644
--- a/spec/components/jobs/user_email_spec.rb
+++ b/spec/jobs/user_email_spec.rb
@@ -1,5 +1,5 @@
require 'spec_helper'
-require 'jobs'
+require_dependency 'jobs/base'
describe Jobs::UserEmail do
@@ -43,7 +43,13 @@ describe Jobs::UserEmail do
it "doesn't send an email to a user that's been recently seen" do
user.update_column(:last_seen_at, 9.minutes.ago)
Email::Sender.any_instance.expects(:send).never
- Jobs::UserEmail.new.execute(type: :private_message, user_id: user.id, post_id: post.id)
+ Jobs::UserEmail.new.execute(type: :user_replied, user_id: user.id, post_id: post.id)
+ end
+
+ it "does send an email to a user that's been recently seen but has email_always set" do
+ user.update_attributes(last_seen_at: 9.minutes.ago, email_always: true)
+ Email::Sender.any_instance.expects(:send)
+ Jobs::UserEmail.new.execute(type: :user_replied, user_id: user.id, post_id: post.id)
end
end