mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
PERF: move 3 more option columns out of the user table
This commit is contained in:
@@ -3,6 +3,8 @@ class UserOption < ActiveRecord::Base
|
||||
belongs_to :user
|
||||
before_create :set_defaults
|
||||
|
||||
after_save :update_tracked_topics
|
||||
|
||||
def set_defaults
|
||||
self.email_always = SiteSetting.default_email_always
|
||||
self.mailing_list_mode = SiteSetting.default_email_mailing_list_mode
|
||||
@@ -16,6 +18,9 @@ class UserOption < ActiveRecord::Base
|
||||
self.disable_jump_reply = SiteSetting.default_other_disable_jump_reply
|
||||
self.edit_history_public = SiteSetting.default_other_edit_history_public
|
||||
|
||||
self.new_topic_duration_minutes = SiteSetting.default_other_new_topic_duration_minutes
|
||||
self.auto_track_topics_after_msecs = SiteSetting.default_other_auto_track_topics_after_msecs
|
||||
|
||||
|
||||
if SiteSetting.default_email_digest_frequency.to_i <= 0
|
||||
self.email_digests = false
|
||||
@@ -26,4 +31,70 @@ class UserOption < ActiveRecord::Base
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def update_tracked_topics
|
||||
return unless auto_track_topics_after_msecs_changed?
|
||||
TrackedTopicsUpdater.new(id, auto_track_topics_after_msecs).call
|
||||
end
|
||||
|
||||
def redirected_to_top_yet?
|
||||
last_redirected_to_top_at.present?
|
||||
end
|
||||
|
||||
def update_last_redirected_to_top!
|
||||
key = "user:#{id}:update_last_redirected_to_top"
|
||||
delay = SiteSetting.active_user_rate_limit_secs
|
||||
|
||||
# only update last_redirected_to_top_at once every minute
|
||||
return unless $redis.setnx(key, "1")
|
||||
$redis.expire(key, delay)
|
||||
|
||||
# delay the update
|
||||
Jobs.enqueue_in(delay / 2, :update_top_redirection, user_id: self.id, redirected_at: Time.zone.now)
|
||||
end
|
||||
|
||||
def should_be_redirected_to_top
|
||||
redirected_to_top.present?
|
||||
end
|
||||
|
||||
def redirected_to_top
|
||||
# redirect is enabled
|
||||
return unless SiteSetting.redirect_users_to_top_page
|
||||
# top must be in the top_menu
|
||||
return unless SiteSetting.top_menu =~ /(^|\|)top(\||$)/i
|
||||
# not enough topics
|
||||
return unless period = SiteSetting.min_redirected_to_top_period
|
||||
|
||||
if !user.seen_before? || (user.trust_level == 0 && !redirected_to_top_yet?)
|
||||
update_last_redirected_to_top!
|
||||
return {
|
||||
reason: I18n.t('redirected_to_top_reasons.new_user'),
|
||||
period: period
|
||||
}
|
||||
elsif user.last_seen_at < 1.month.ago
|
||||
update_last_redirected_to_top!
|
||||
return {
|
||||
reason: I18n.t('redirected_to_top_reasons.not_seen_in_a_month'),
|
||||
period: period
|
||||
}
|
||||
end
|
||||
|
||||
# don't redirect to top
|
||||
nil
|
||||
end
|
||||
|
||||
def treat_as_new_topic_start_date
|
||||
duration = new_topic_duration_minutes || SiteSetting.default_other_new_topic_duration_minutes.to_i
|
||||
times = [case duration
|
||||
when User::NewTopicDuration::ALWAYS
|
||||
user.created_at
|
||||
when User::NewTopicDuration::LAST_VISIT
|
||||
user.previous_visit_at || user.user_stat.new_since
|
||||
else
|
||||
duration.minutes.ago
|
||||
end, user.user_stat.new_since, Time.at(SiteSetting.min_new_topics_time).to_datetime]
|
||||
|
||||
times.max
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user