mirror of
https://github.com/discourse/discourse.git
synced 2025-02-08 09:09:45 +08:00
FIX: Applying default user options didn't work for boolean flags (#16890)
It also ensures that only human users are updated and replaces usage of `send` with `public_send`. Also, it adds more specs for existing code.
This commit is contained in:
parent
d15867463f
commit
eef17318c3
|
@ -34,12 +34,12 @@ class Admin::SiteSettingsController < Admin::AdminController
|
||||||
end
|
end
|
||||||
|
|
||||||
update_existing_users = params[:update_existing_user].present?
|
update_existing_users = params[:update_existing_user].present?
|
||||||
previous_value = SiteSetting.public_send(id) || "" if update_existing_users
|
previous_value = value_or_default(SiteSetting.public_send(id)) if update_existing_users
|
||||||
|
|
||||||
SiteSetting.set_and_log(id, value, current_user)
|
SiteSetting.set_and_log(id, value, current_user)
|
||||||
|
|
||||||
if update_existing_users
|
if update_existing_users
|
||||||
new_value = value || ""
|
new_value = value_or_default(value)
|
||||||
|
|
||||||
if (user_option = user_options[id.to_sym]).present?
|
if (user_option = user_options[id.to_sym]).present?
|
||||||
if user_option == "text_size_key"
|
if user_option == "text_size_key"
|
||||||
|
@ -53,7 +53,7 @@ class Admin::SiteSettingsController < Admin::AdminController
|
||||||
attrs = { user_option => new_value }
|
attrs = { user_option => new_value }
|
||||||
attrs[:email_digests] = (new_value.to_i != 0) if id == "default_email_digest_frequency"
|
attrs[:email_digests] = (new_value.to_i != 0) if id == "default_email_digest_frequency"
|
||||||
|
|
||||||
UserOption.where(user_option => previous_value).update_all(attrs)
|
UserOption.human_users.where(user_option => previous_value).update_all(attrs)
|
||||||
elsif id.start_with?("default_categories_")
|
elsif id.start_with?("default_categories_")
|
||||||
previous_category_ids = previous_value.split("|")
|
previous_category_ids = previous_value.split("|")
|
||||||
new_category_ids = new_value.split("|")
|
new_category_ids = new_value.split("|")
|
||||||
|
@ -106,10 +106,10 @@ class Admin::SiteSettingsController < Admin::AdminController
|
||||||
params.require(:site_setting_id)
|
params.require(:site_setting_id)
|
||||||
id = params[:site_setting_id]
|
id = params[:site_setting_id]
|
||||||
raise Discourse::NotFound unless id.start_with?("default_")
|
raise Discourse::NotFound unless id.start_with?("default_")
|
||||||
new_value = params[id] || ""
|
new_value = value_or_default(params[id])
|
||||||
|
|
||||||
raise_access_hidden_setting(id)
|
raise_access_hidden_setting(id)
|
||||||
previous_value = SiteSetting.send(id) || ""
|
previous_value = value_or_default(SiteSetting.public_send(id))
|
||||||
json = {}
|
json = {}
|
||||||
|
|
||||||
if (user_option = user_options[id.to_sym]).present?
|
if (user_option = user_options[id.to_sym]).present?
|
||||||
|
@ -119,7 +119,7 @@ class Admin::SiteSettingsController < Admin::AdminController
|
||||||
previous_value = UserOption.title_count_modes[previous_value.to_sym]
|
previous_value = UserOption.title_count_modes[previous_value.to_sym]
|
||||||
end
|
end
|
||||||
|
|
||||||
json[:user_count] = UserOption.where(user_option => previous_value).count
|
json[:user_count] = UserOption.human_users.where(user_option => previous_value).count
|
||||||
elsif id.start_with?("default_categories_")
|
elsif id.start_with?("default_categories_")
|
||||||
previous_category_ids = previous_value.split("|")
|
previous_category_ids = previous_value.split("|")
|
||||||
new_category_ids = new_value.split("|")
|
new_category_ids = new_value.split("|")
|
||||||
|
@ -220,4 +220,8 @@ class Admin::SiteSettingsController < Admin::AdminController
|
||||||
NotificationLevels.all[:regular]
|
NotificationLevels.all[:regular]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def value_or_default(value)
|
||||||
|
value.nil? ? "" : value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,6 +11,8 @@ class UserOption < ActiveRecord::Base
|
||||||
|
|
||||||
after_save :update_tracked_topics
|
after_save :update_tracked_topics
|
||||||
|
|
||||||
|
scope :human_users, -> { where('user_id > 0') }
|
||||||
|
|
||||||
enum default_calendar: { none_selected: 0, ics: 1, google: 2 }, _scopes: false
|
enum default_calendar: { none_selected: 0, ics: 1, google: 2 }, _scopes: false
|
||||||
|
|
||||||
def self.ensure_consistency!
|
def self.ensure_consistency!
|
||||||
|
|
|
@ -102,7 +102,7 @@ describe Admin::SiteSettingsController do
|
||||||
default_email_digest_frequency: 0,
|
default_email_digest_frequency: 0,
|
||||||
update_existing_user: true
|
update_existing_user: true
|
||||||
}
|
}
|
||||||
}.to change { UserOption.where(email_digests: false).count }.by(User.count)
|
}.to change { UserOption.where(email_digests: false).count }.by(User.human_users.count)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -254,6 +254,70 @@ describe Admin::SiteSettingsController do
|
||||||
|
|
||||||
SiteSetting.setting(:default_tags_watching, "")
|
SiteSetting.setting(:default_tags_watching, "")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "user options" do
|
||||||
|
def expect_user_count(site_setting_name:, user_setting_name:, current_site_setting_value:, new_site_setting_value:,
|
||||||
|
current_user_setting_value: nil, new_user_setting_value: nil)
|
||||||
|
|
||||||
|
current_user_setting_value ||= current_site_setting_value
|
||||||
|
new_user_setting_value ||= new_site_setting_value
|
||||||
|
|
||||||
|
SiteSetting.public_send("#{site_setting_name}=", current_site_setting_value)
|
||||||
|
UserOption.human_users.update_all(user_setting_name => current_user_setting_value)
|
||||||
|
user_count = User.human_users.count
|
||||||
|
|
||||||
|
# Correctly counts users when all of them have default value
|
||||||
|
put "/admin/site_settings/#{site_setting_name}/user_count.json", params: {
|
||||||
|
site_setting_name => new_site_setting_value
|
||||||
|
}
|
||||||
|
expect(response.parsed_body["user_count"]).to eq(user_count)
|
||||||
|
|
||||||
|
# Correctly counts users when one of them already has new value
|
||||||
|
user.user_option.update!(user_setting_name => new_user_setting_value)
|
||||||
|
put "/admin/site_settings/#{site_setting_name}/user_count.json", params: {
|
||||||
|
site_setting_name => new_site_setting_value
|
||||||
|
}
|
||||||
|
expect(response.parsed_body["user_count"]).to eq(user_count - 1)
|
||||||
|
|
||||||
|
# Correctly counts users when site setting value has been changed
|
||||||
|
SiteSetting.public_send("#{site_setting_name}=", new_site_setting_value)
|
||||||
|
put "/admin/site_settings/#{site_setting_name}/user_count.json", params: {
|
||||||
|
site_setting_name => current_site_setting_value
|
||||||
|
}
|
||||||
|
expect(response.parsed_body["user_count"]).to eq(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return correct user count for boolean setting" do
|
||||||
|
expect_user_count(
|
||||||
|
site_setting_name: "default_other_external_links_in_new_tab",
|
||||||
|
user_setting_name: "external_links_in_new_tab",
|
||||||
|
current_site_setting_value: false,
|
||||||
|
new_site_setting_value: true
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return correct user count for 'text_size_key'" do
|
||||||
|
expect_user_count(
|
||||||
|
site_setting_name: "default_text_size",
|
||||||
|
user_setting_name: "text_size_key",
|
||||||
|
current_site_setting_value: "normal",
|
||||||
|
new_site_setting_value: "larger",
|
||||||
|
current_user_setting_value: UserOption.text_sizes[:normal],
|
||||||
|
new_user_setting_value: UserOption.text_sizes[:larger]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return correct user count for 'title_count_mode_key'" do
|
||||||
|
expect_user_count(
|
||||||
|
site_setting_name: "default_title_count_mode",
|
||||||
|
user_setting_name: "title_count_mode_key",
|
||||||
|
current_site_setting_value: "notifications",
|
||||||
|
new_site_setting_value: "contextual",
|
||||||
|
current_user_setting_value: UserOption.title_count_modes[:notifications],
|
||||||
|
new_user_setting_value: UserOption.title_count_modes[:contextual]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'upload site settings' do
|
describe 'upload site settings' do
|
||||||
|
|
Loading…
Reference in New Issue
Block a user