diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index da09146b643..627918c619d 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -150,6 +150,7 @@ Discourse.User = Discourse.Model.extend({ 'name', 'email_digests', 'email_direct', + 'email_always', 'email_private_messages', 'dynamic_favicon', 'digest_after_days', diff --git a/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars b/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars index 0cf94630bb4..e08e0aee515 100644 --- a/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars +++ b/app/assets/javascripts/discourse/templates/user/preferences.js.handlebars @@ -80,6 +80,8 @@ {{i18n user.email_private_messages}} +
{{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