Class: UserOption

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/user_option.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.email_level_typesObject



46
47
48
# File 'app/models/user_option.rb', line 46

def self.email_level_types
  @email_level_type ||= Enum.new(always: 0, only_when_away: 1, never: 2)
end

.ensure_consistency!Object



19
20
21
22
23
24
25
26
27
# File 'app/models/user_option.rb', line 19

def self.ensure_consistency!
  sql = <<~SQL
    SELECT u.id FROM users u
    LEFT JOIN user_options o ON o.user_id = u.id
    WHERE o.user_id IS NULL
  SQL

  DB.query_single(sql).each { |id| UserOption.create(user_id: id) }
end

.like_notification_frequency_typeObject



33
34
35
36
# File 'app/models/user_option.rb', line 33

def self.like_notification_frequency_type
  @like_notification_frequency_type ||=
    Enum.new(always: 0, first_time_and_daily: 1, first_time: 2, never: 3)
end

.previous_replies_typeObject



29
30
31
# File 'app/models/user_option.rb', line 29

def self.previous_replies_type
  @previous_replies_type ||= Enum.new(always: 0, unless_emailed: 1, never: 2)
end

.text_sizesObject



38
39
40
# File 'app/models/user_option.rb', line 38

def self.text_sizes
  @text_sizes ||= Enum.new(normal: 0, larger: 1, largest: 2, smaller: 3, smallest: 4)
end

.title_count_modesObject



42
43
44
# File 'app/models/user_option.rb', line 42

def self.title_count_modes
  @title_count_modes ||= Enum.new(notifications: 0, contextual: 1)
end

.user_tzinfo(user_id) ⇒ Object



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'app/models/user_option.rb', line 218

def self.user_tzinfo(user_id)
  timezone = UserOption.where(user_id: user_id).pluck(:timezone).first || "UTC"

  tzinfo = nil
  begin
    tzinfo = ActiveSupport::TimeZone.find_tzinfo(timezone)
  rescue TZInfo::InvalidTimezoneIdentifier
    Rails.logger.warn(
      "#{User.find_by(id: user_id)&.username} has the timezone #{timezone} set, we do not know how to parse it in Rails, fallback to UTC",
    )
    tzinfo = ActiveSupport::TimeZone.find_tzinfo("UTC")
  end

  tzinfo
end

Instance Method Details

#homepageObject



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'app/models/user_option.rb', line 172

def homepage
  case homepage_id
  when 1
    "latest"
  when 2
    "categories"
  when 3
    "unread"
  when 4
    "new"
  when 5
    "top"
  when 6
    "bookmarks"
  when 7
    "unseen"
  else
    SiteSetting.homepage
  end
end

#likes_notifications_disabled?Boolean

Returns:

  • (Boolean)


214
215
216
# File 'app/models/user_option.rb', line 214

def likes_notifications_disabled?
  like_notification_frequency == UserOption.like_notification_frequency_type[:never]
end

#mailing_list_modeObject



98
99
100
101
# File 'app/models/user_option.rb', line 98

def mailing_list_mode
  return false if SiteSetting.disable_mailing_list_mode
  super
end

#redirected_to_topObject



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'app/models/user_option.rb', line 128

def redirected_to_top
  # redirect is enabled
  return unless SiteSetting.redirect_users_to_top_page

  # PERF: bypass min_redirected_to_top query for users that were seen already
  return if user.trust_level > 0 && user.last_seen_at && user.last_seen_at > 1.month.ago

  # top must be in the top_menu
  return unless SiteSetting.top_menu[/\btop\b/i]

  # not enough topics
  return unless period = SiteSetting.min_redirected_to_top_period(1.day.ago)

  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

#redirected_to_top_yet?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'app/models/user_option.rb', line 103

def redirected_to_top_yet?
  last_redirected_to_top_at.present?
end

#set_defaultsObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'app/models/user_option.rb', line 55

def set_defaults
  self.mailing_list_mode = SiteSetting.default_email_mailing_list_mode
  self.mailing_list_mode_frequency = SiteSetting.default_email_mailing_list_mode_frequency
  self.email_level = SiteSetting.default_email_level
  self.email_messages_level = SiteSetting.default_email_messages_level
  self.automatically_unpin_topics = SiteSetting.default_topics_automatic_unpin
  self.email_previous_replies = SiteSetting.default_email_previous_replies
  self.email_in_reply_to = SiteSetting.default_email_in_reply_to

  self.enable_quoting = SiteSetting.default_other_enable_quoting
  self.enable_defer = SiteSetting.default_other_enable_defer
  self.external_links_in_new_tab = SiteSetting.default_other_external_links_in_new_tab
  self.dynamic_favicon = SiteSetting.default_other_dynamic_favicon
  self.skip_new_user_tips = SiteSetting.default_other_skip_new_user_tips

  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
  self.notification_level_when_replying =
    SiteSetting.default_other_notification_level_when_replying

  self.like_notification_frequency = SiteSetting.default_other_like_notification_frequency

  if SiteSetting.default_email_digest_frequency.to_i <= 0
    self.email_digests = false
  else
    self.email_digests = true
  end

  self.digest_after_minutes ||= SiteSetting.default_email_digest_frequency.to_i

  self.include_tl0_in_digests = SiteSetting.default_include_tl0_in_digests

  self.text_size = SiteSetting.default_text_size

  self.title_count_mode = SiteSetting.default_title_count_mode

  self.hide_profile_and_presence = SiteSetting.default_hide_profile_and_presence
  self.sidebar_link_to_filtered_list = SiteSetting.default_sidebar_link_to_filtered_list
  self.sidebar_show_count_of_new_items = SiteSetting.default_sidebar_show_count_of_new_items

  true
end

#should_be_redirected_to_topObject



124
125
126
# File 'app/models/user_option.rb', line 124

def should_be_redirected_to_top
  redirected_to_top.present?
end

#text_sizeObject



193
194
195
# File 'app/models/user_option.rb', line 193

def text_size
  UserOption.text_sizes[text_size_key]
end

#text_size=(value) ⇒ Object



197
198
199
# File 'app/models/user_option.rb', line 197

def text_size=(value)
  self.text_size_key = UserOption.text_sizes[value.to_sym]
end

#title_count_modeObject



201
202
203
# File 'app/models/user_option.rb', line 201

def title_count_mode
  UserOption.title_count_modes[title_count_mode_key]
end

#title_count_mode=(value) ⇒ Object



205
206
207
# File 'app/models/user_option.rb', line 205

def title_count_mode=(value)
  self.title_count_mode_key = UserOption.title_count_modes[value.to_sym]
end

#treat_as_new_topic_start_dateObject



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'app/models/user_option.rb', line 153

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.created_at,
    Time.at(SiteSetting.min_new_topics_time).to_datetime,
  ]

  times.max
end

#unsubscribed_from_all?Boolean

Returns:

  • (Boolean)


209
210
211
212
# File 'app/models/user_option.rb', line 209

def unsubscribed_from_all?
  !mailing_list_mode && !email_digests && email_level == UserOption.email_level_types[:never] &&
    email_messages_level == UserOption.email_level_types[:never]
end

#update_last_redirected_to_top!Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'app/models/user_option.rb', line 107

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 Discourse.redis.setnx(key, "1")
  Discourse.redis.expire(key, delay)

  # delay the update
  Jobs.enqueue_in(
    delay / 2,
    :update_top_redirection,
    user_id: self.user_id,
    redirected_at: Time.zone.now.to_s,
  )
end