FEATURE: global admin override of most of the user preferences

This commit is contained in:
Régis Hanol
2015-08-21 20:39:21 +02:00
parent 73264648f2
commit bef80633b1
56 changed files with 438 additions and 215 deletions

View 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

View 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

View File

@ -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

View File

@ -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

View File

@ -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])

View File

@ -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