mirror of
https://github.com/discourse/discourse.git
synced 2025-06-05 14:07:30 +08:00
FEATURE: global admin override of most of the user preferences
This commit is contained in:
27
app/models/auto_track_duration_site_setting.rb
Normal file
27
app/models/auto_track_duration_site_setting.rb
Normal file
@ -0,0 +1,27 @@
|
||||
require_dependency 'enum_site_setting'
|
||||
|
||||
class AutoTrackDurationSiteSetting < EnumSiteSetting
|
||||
|
||||
def self.valid_value?(val)
|
||||
values.any? { |v| v[:value].to_s == val.to_s }
|
||||
end
|
||||
|
||||
def self.values
|
||||
@values ||= [
|
||||
{ name: 'user.auto_track_options.never', value: -1 },
|
||||
{ name: 'user.auto_track_options.immediately', value: 0 },
|
||||
{ name: 'user.auto_track_options.after_30_seconds', value: 1000 * 30 },
|
||||
{ name: 'user.auto_track_options.after_1_minute', value: 1000 * 60 },
|
||||
{ name: 'user.auto_track_options.after_2_minutes', value: 1000 * 60 * 2 },
|
||||
{ name: 'user.auto_track_options.after_3_minutes', value: 1000 * 60 * 3 },
|
||||
{ name: 'user.auto_track_options.after_4_minutes', value: 1000 * 60 * 4 },
|
||||
{ name: 'user.auto_track_options.after_5_minutes', value: 1000 * 60 * 5 },
|
||||
{ name: 'user.auto_track_options.after_10_minutes', value: 1000 * 60 * 10 },
|
||||
]
|
||||
end
|
||||
|
||||
def self.translate_names?
|
||||
true
|
||||
end
|
||||
|
||||
end
|
24
app/models/new_topic_duration_site_setting.rb
Normal file
24
app/models/new_topic_duration_site_setting.rb
Normal file
@ -0,0 +1,24 @@
|
||||
require_dependency 'enum_site_setting'
|
||||
|
||||
class NewTopicDurationSiteSetting < EnumSiteSetting
|
||||
|
||||
def self.valid_value?(val)
|
||||
values.any? { |v| v[:value].to_s == val.to_s }
|
||||
end
|
||||
|
||||
def self.values
|
||||
@values ||= [
|
||||
{ name: 'user.new_topic_duration.not_viewed', value: -1 },
|
||||
{ name: 'user.new_topic_duration.after_1_day', value: 60 * 24 },
|
||||
{ name: 'user.new_topic_duration.after_2_days', value: 60 * 24 * 2 },
|
||||
{ name: 'user.new_topic_duration.after_1_week', value: 60 * 24 * 7 },
|
||||
{ name: 'user.new_topic_duration.after_2_weeks', value: 60 * 24 * 7 * 2 },
|
||||
{ name: 'user.new_topic_duration.last_here', value: -2 },
|
||||
]
|
||||
end
|
||||
|
||||
def self.translate_names?
|
||||
true
|
||||
end
|
||||
|
||||
end
|
@ -99,6 +99,14 @@ class SiteSetting < ActiveRecord::Base
|
||||
false
|
||||
end
|
||||
|
||||
def self.default_categories_selected
|
||||
[
|
||||
SiteSetting.default_categories_watching.split("|"),
|
||||
SiteSetting.default_categories_tracking.split("|"),
|
||||
SiteSetting.default_categories_muted.split("|"),
|
||||
].flatten.to_set
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
|
@ -110,7 +110,7 @@ class TopicTrackingState
|
||||
now: DateTime.now,
|
||||
last_visit: User::NewTopicDuration::LAST_VISIT,
|
||||
always: User::NewTopicDuration::ALWAYS,
|
||||
default_duration: SiteSetting.new_topic_duration_minutes
|
||||
default_duration: SiteSetting.default_other_new_topic_duration_minutes
|
||||
).where_values[0]
|
||||
end
|
||||
|
||||
|
@ -97,7 +97,7 @@ class TopicUser < ActiveRecord::Base
|
||||
if rows == 0
|
||||
now = DateTime.now
|
||||
auto_track_after = User.select(:auto_track_topics_after_msecs).find_by(id: user_id).auto_track_topics_after_msecs
|
||||
auto_track_after ||= SiteSetting.auto_track_topics_after
|
||||
auto_track_after ||= SiteSetting.default_other_auto_track_topics_after_msecs
|
||||
|
||||
if auto_track_after >= 0 && auto_track_after <= (attrs[:total_msecs_viewed] || 0)
|
||||
attrs[:notification_level] ||= notification_levels[:tracking]
|
||||
@ -143,7 +143,7 @@ class TopicUser < ActiveRecord::Base
|
||||
now: DateTime.now,
|
||||
msecs: msecs,
|
||||
tracking: notification_levels[:tracking],
|
||||
threshold: SiteSetting.auto_track_topics_after
|
||||
threshold: SiteSetting.default_other_auto_track_topics_after_msecs
|
||||
}
|
||||
|
||||
# In case anyone seens "highest_seen_post_number" and gets confused, like I do.
|
||||
@ -198,7 +198,7 @@ class TopicUser < ActiveRecord::Base
|
||||
if rows.length == 0
|
||||
# The user read at least one post in a topic that they haven't viewed before.
|
||||
args[:new_status] = notification_levels[:regular]
|
||||
if (user.auto_track_topics_after_msecs || SiteSetting.auto_track_topics_after) == 0
|
||||
if (user.auto_track_topics_after_msecs || SiteSetting.default_other_auto_track_topics_after_msecs) == 0
|
||||
args[:new_status] = notification_levels[:tracking]
|
||||
end
|
||||
TopicTrackingState.publish_read(topic_id, post_number, user.id, args[:new_status])
|
||||
|
@ -75,14 +75,15 @@ class User < ActiveRecord::Base
|
||||
validates :ip_address, allowed_ip_address: {on: :create, message: :signup_not_allowed}
|
||||
|
||||
after_initialize :add_trust_level
|
||||
after_initialize :set_default_email_digest
|
||||
after_initialize :set_default_external_links_in_new_tab
|
||||
|
||||
before_create :set_default_user_preferences
|
||||
|
||||
after_create :create_email_token
|
||||
after_create :create_user_stat
|
||||
after_create :create_user_profile
|
||||
after_create :ensure_in_trust_level_group
|
||||
after_create :automatic_group_membership
|
||||
after_create :set_default_categories_preferences
|
||||
|
||||
before_save :update_username_lower
|
||||
before_save :ensure_password_is_hashed
|
||||
@ -578,7 +579,7 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def treat_as_new_topic_start_date
|
||||
duration = new_topic_duration_minutes || SiteSetting.new_topic_duration_minutes
|
||||
duration = new_topic_duration_minutes || SiteSetting.default_other_new_topic_duration_minutes
|
||||
[case duration
|
||||
when User::NewTopicDuration::ALWAYS
|
||||
created_at
|
||||
@ -901,26 +902,42 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
def set_default_email_digest
|
||||
if has_attribute?(:email_digests) && self.email_digests.nil?
|
||||
if SiteSetting.default_digest_email_frequency.blank?
|
||||
self.email_digests = false
|
||||
else
|
||||
self.email_digests = true
|
||||
self.digest_after_days ||= SiteSetting.default_digest_email_frequency.to_i if has_attribute?(:digest_after_days)
|
||||
end
|
||||
end
|
||||
def set_default_user_preferences
|
||||
set_default_email_digest_frequency
|
||||
set_default_email_private_messages
|
||||
set_default_email_direct
|
||||
set_default_email_mailing_list_mode
|
||||
set_default_email_always
|
||||
|
||||
set_default_other_new_topic_duration_minutes
|
||||
set_default_other_auto_track_topics_after_msecs
|
||||
set_default_other_external_links_in_new_tab
|
||||
set_default_other_enable_quoting
|
||||
set_default_other_dynamic_favicon
|
||||
set_default_other_disable_jump_reply
|
||||
set_default_other_edit_history_public
|
||||
|
||||
# needed, otherwise the callback chain is broken...
|
||||
true
|
||||
end
|
||||
|
||||
def set_default_external_links_in_new_tab
|
||||
if has_attribute?(:external_links_in_new_tab) && self.external_links_in_new_tab.nil?
|
||||
self.external_links_in_new_tab = !SiteSetting.default_external_links_in_new_tab.blank?
|
||||
def set_default_categories_preferences
|
||||
values = []
|
||||
|
||||
%w{watching tracking muted}.each do |s|
|
||||
category_ids = SiteSetting.send("default_categories_#{s}").split("|")
|
||||
category_ids.each do |category_id|
|
||||
values << "(#{self.id}, #{category_id}, #{CategoryUser.notification_levels[s.to_sym]})"
|
||||
end
|
||||
end
|
||||
|
||||
if values.present?
|
||||
exec_sql("INSERT INTO category_users (user_id, category_id, notification_level) VALUES #{values.join(",")}")
|
||||
end
|
||||
end
|
||||
|
||||
# Delete unactivated accounts (without verified email) that are over a week old
|
||||
def self.purge_unactivated
|
||||
|
||||
to_destroy = User.where(active: false)
|
||||
.joins('INNER JOIN user_stats AS us ON us.user_id = users.id')
|
||||
.where("created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago)
|
||||
@ -950,6 +967,39 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
def set_default_email_digest_frequency
|
||||
if has_attribute?(:email_digests)
|
||||
if SiteSetting.default_email_digest_frequency.blank?
|
||||
self.email_digests = false
|
||||
else
|
||||
self.email_digests = true
|
||||
self.digest_after_days ||= SiteSetting.default_email_digest_frequency.to_i if has_attribute?(:digest_after_days)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def set_default_email_mailing_list_mode
|
||||
self.mailing_list_mode = SiteSetting.default_email_mailing_list_mode if has_attribute?(:mailing_list_mode)
|
||||
end
|
||||
|
||||
%w{private_messages direct always}.each do |s|
|
||||
define_method("set_default_email_#{s}") do
|
||||
self.send("email_#{s}=", SiteSetting.send("default_email_#{s}")) if has_attribute?("email_#{s}")
|
||||
end
|
||||
end
|
||||
|
||||
%w{new_topic_duration_minutes auto_track_topics_after_msecs}.each do |s|
|
||||
define_method("set_default_other_#{s}") do
|
||||
self.send("#{s}=", SiteSetting.send("default_other_#{s}").to_i) if has_attribute?(s)
|
||||
end
|
||||
end
|
||||
|
||||
%w{external_links_in_new_tab enable_quoting dynamic_favicon disable_jump_reply edit_history_public}.each do |s|
|
||||
define_method("set_default_other_#{s}") do
|
||||
self.send("#{s}=", SiteSetting.send("default_other_#{s}")) if has_attribute?(s)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
|
Reference in New Issue
Block a user