2016-02-17 15:46:19 +11:00
class UserOption < ActiveRecord :: Base
self . primary_key = :user_id
belongs_to :user
before_create :set_defaults
2016-02-18 16:57:22 +11:00
after_save :update_tracked_topics
2016-02-17 15:46:19 +11:00
def set_defaults
self . email_always = SiteSetting . default_email_always
self . mailing_list_mode = SiteSetting . default_email_mailing_list_mode
self . email_direct = SiteSetting . default_email_direct
self . automatically_unpin_topics = SiteSetting . default_topics_automatic_unpin
self . email_private_messages = SiteSetting . default_email_private_messages
self . enable_quoting = SiteSetting . default_other_enable_quoting
self . external_links_in_new_tab = SiteSetting . default_other_external_links_in_new_tab
self . dynamic_favicon = SiteSetting . default_other_dynamic_favicon
self . disable_jump_reply = SiteSetting . default_other_disable_jump_reply
self . edit_history_public = SiteSetting . default_other_edit_history_public
2016-02-18 16:57:22 +11:00
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
2016-02-17 15:46:19 +11:00
if SiteSetting . default_email_digest_frequency . to_i < = 0
self . email_digests = false
else
self . email_digests = true
self . digest_after_days || = SiteSetting . default_email_digest_frequency . to_i
end
true
end
2016-02-18 16:57:22 +11:00
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
2016-02-17 15:46:19 +11:00
end