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-03-17 10:03:56 +11:00
def self . ensure_consistency!
exec_sql ( " SELECT u.id FROM users u
LEFT JOIN user_options o ON o . user_id = u . id
WHERE o . user_id IS NULL " ).values.each do |id,_|
UserOption . create ( user_id : id . to_i )
end
end
2016-02-19 13:56:52 +11:00
def self . previous_replies_type
@previous_replies_type || = Enum . new ( always : 0 , unless_emailed : 1 , never : 2 )
end
2016-03-02 23:16:52 +11:00
def self . like_notification_frequency_type
2016-03-06 09:12:59 +11:00
@like_notification_frequency_type || = Enum . new ( always : 0 , first_time_and_daily : 1 , first_time : 2 , never : 3 )
2016-03-02 23:16:52 +11:00
end
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
2016-05-21 06:17:54 -07:00
self . mailing_list_mode_frequency = SiteSetting . default_email_mailing_list_mode_frequency
2016-02-17 15:46:19 +11:00
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
2016-02-19 13:56:52 +11:00
self . email_previous_replies = SiteSetting . default_email_previous_replies
2016-02-26 00:05:40 +11:00
self . email_in_reply_to = SiteSetting . default_email_in_reply_to
2016-02-17 15:46:19 +11:00
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-03-02 23:16:52 +11:00
self . like_notification_frequency = SiteSetting . default_other_like_notification_frequency
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
2016-03-02 15:26:27 -05:00
self . digest_after_minutes || = SiteSetting . default_email_digest_frequency . to_i
2016-02-17 15:46:19 +11:00
end
2016-03-17 17:35:23 -04:00
self . include_tl0_in_digests = SiteSetting . default_include_tl0_in_digests
2016-02-17 15:46:19 +11:00
true
end
2016-02-18 16:57:22 +11:00
2016-03-05 10:53:28 +13:00
def mailing_list_mode
return false if SiteSetting . disable_mailing_list_mode
super
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
2016-02-23 10:33:53 +11:00
# == Schema Information
#
# Table name: user_options
#
# user_id :integer not null, primary key
# email_always :boolean default(FALSE), not null
# mailing_list_mode :boolean default(FALSE), not null
# email_digests :boolean
# email_direct :boolean default(TRUE), not null
# email_private_messages :boolean default(TRUE), not null
# external_links_in_new_tab :boolean default(FALSE), not null
# enable_quoting :boolean default(TRUE), not null
# dynamic_favicon :boolean default(FALSE), not null
# disable_jump_reply :boolean default(FALSE), not null
# edit_history_public :boolean default(FALSE), not null
# automatically_unpin_topics :boolean default(TRUE), not null
2016-03-02 15:26:27 -05:00
# digest_after_minutes :integer
2016-02-23 10:33:53 +11:00
# auto_track_topics_after_msecs :integer
# new_topic_duration_minutes :integer
# last_redirected_to_top_at :datetime
2016-03-28 15:21:45 +11:00
# email_previous_replies :integer default(2), not null
# email_in_reply_to :boolean default(TRUE), not null
# like_notification_frequency :integer default(1), not null
# include_tl0_in_digests :boolean default(FALSE)
2016-05-30 10:45:32 +10:00
# mailing_list_mode_frequency :integer default(0), not null
2016-02-23 10:33:53 +11:00
#
# Indexes
#
# index_user_options_on_user_id (user_id) UNIQUE
#