DEV: the ability to define setting areas (#28570)

A new setting attribute is used to define the areas (separated by `|`).

In addition, endpoint `/admin/config/site_settings.json` accepts new `filter_area` data.
This commit is contained in:
Krzysztof Kotlarek 2024-09-03 09:25:45 +10:00 committed by GitHub
parent 050c665160
commit 7577231ba2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 123 additions and 23 deletions

View File

@ -3,7 +3,7 @@ import { tracked } from "@glimmer/tracking";
import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import didInsert from "@ember/render-modifiers/modifiers/did-insert";
import { service } from "@ember/service"; import { service } from "@ember/service";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item"; import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import SiteSettingFilter from "discourse/lib/site-setting-filter"; import { ajax } from "discourse/lib/ajax";
import i18n from "discourse-common/helpers/i18n"; import i18n from "discourse-common/helpers/i18n";
import { bind } from "discourse-common/utils/decorators"; import { bind } from "discourse-common/utils/decorators";
import AdminFilteredSiteSettings from "admin/components/admin-filtered-site-settings"; import AdminFilteredSiteSettings from "admin/components/admin-filtered-site-settings";
@ -15,13 +15,20 @@ export default class AdminConfigAreasFlagsSettings extends Component {
@bind @bind
loadSettings() { loadSettings() {
SiteSetting.findAll({ ajax("/admin/config/site_settings.json", {
categories: ["spam", "rate_limits", "chat"], data: {
}).then((settings) => { filter_area: "flags",
this.settings = new SiteSettingFilter(settings).performSearch( },
"flags", }).then((result) => {
{} this.settings = [
); {
name: "All",
nameKey: "all_results",
siteSettings: result.site_settings.map((setting) =>
SiteSetting.create(setting)
),
},
];
}); });
} }

View File

@ -12,12 +12,15 @@ class Admin::Config::SiteSettingsController < Admin::AdminController
# UI itself uses the Admin::SiteSettingsController#index endpoint, # UI itself uses the Admin::SiteSettingsController#index endpoint,
# which also supports a `category` and `plugin` filter. # which also supports a `category` and `plugin` filter.
def index def index
params.require(:filter_names) if params[:filter_names].blank? && SiteSetting::VALID_AREAS.exclude?(params[:filter_area])
raise Discourse::InvalidParameters
end
render_json_dump( render_json_dump(
site_settings: site_settings:
SiteSetting.all_settings( SiteSetting.all_settings(
filter_names: params[:filter_names], filter_names: params[:filter_names],
filter_area: params[:filter_area],
include_locale_setting: false, include_locale_setting: false,
include_hidden: true, include_hidden: true,
filter_allowed_hidden: ADMIN_CONFIG_AREA_ALLOWLISTED_HIDDEN_SETTINGS, filter_allowed_hidden: ADMIN_CONFIG_AREA_ALLOWLISTED_HIDDEN_SETTINGS,

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
class SiteSetting < ActiveRecord::Base class SiteSetting < ActiveRecord::Base
VALID_AREAS = %w[flags]
extend GlobalPath extend GlobalPath
extend SiteSettingExtension extend SiteSettingExtension

View File

@ -2153,9 +2153,14 @@ spam:
type: enum type: enum
enum: "ReviewableSensitivitySetting" enum: "ReviewableSensitivitySetting"
default: 3 default: 3
num_users_to_silence_new_user: 3 area: "flags"
num_users_to_silence_new_user:
default: 3
area: "flags"
notify_mods_when_user_silenced: false notify_mods_when_user_silenced: false
flag_sockpuppets: false flag_sockpuppets:
default: false
area: "flags"
newuser_spam_host_threshold: 3 newuser_spam_host_threshold: 3
allowed_spam_host_domains: allowed_spam_host_domains:
default: "" default: ""
@ -2168,7 +2173,9 @@ spam:
min_ban_entries_for_roll_up: 5 min_ban_entries_for_roll_up: 5
max_age_unmatched_emails: 365 max_age_unmatched_emails: 365
max_age_unmatched_ips: 365 max_age_unmatched_ips: 365
num_flaggers_to_close_topic: 5 num_flaggers_to_close_topic:
default: 5
area: "flags"
auto_close_topic_sensitivity: auto_close_topic_sensitivity:
type: enum type: enum
enum: "ReviewableSensitivitySetting" enum: "ReviewableSensitivitySetting"
@ -2176,14 +2183,18 @@ spam:
num_hours_to_close_topic: num_hours_to_close_topic:
default: 4 default: 4
min: 1 min: 1
auto_respond_to_flag_actions: true auto_respond_to_flag_actions:
default: true
area: "flags"
min_first_post_typing_time: 3000 min_first_post_typing_time: 3000
auto_silence_fast_typers_on_first_post: true auto_silence_fast_typers_on_first_post: true
auto_silence_fast_typers_max_trust_level: auto_silence_fast_typers_max_trust_level:
default: 0 default: 0
enum: "TrustLevelSetting" enum: "TrustLevelSetting"
auto_silence_first_post_regex: "" auto_silence_first_post_regex: ""
high_trust_flaggers_auto_hide_posts: true high_trust_flaggers_auto_hide_posts:
default: true
area: "flags"
cooldown_hours_until_reflag: cooldown_hours_until_reflag:
default: 24 default: 24
min: 0 min: 0
@ -2238,7 +2249,9 @@ rate_limits:
max_personal_messages_per_day: 20 max_personal_messages_per_day: 20
max_likes_per_day: 50 max_likes_per_day: 50
max_bookmarks_per_day: 20 max_bookmarks_per_day: 20
max_flags_per_day: 20 max_flags_per_day:
default: 20
area: "flags"
max_edits_per_day: 30 max_edits_per_day: 30
max_invites_per_day: 10 max_invites_per_day: 10
max_topic_invitations_per_day: 30 max_topic_invitations_per_day: 30
@ -2251,9 +2264,15 @@ rate_limits:
tl2_additional_edits_per_day_multiplier: 1.5 tl2_additional_edits_per_day_multiplier: 1.5
tl3_additional_edits_per_day_multiplier: 2 tl3_additional_edits_per_day_multiplier: 2
tl4_additional_edits_per_day_multiplier: 3 tl4_additional_edits_per_day_multiplier: 3
tl2_additional_flags_per_day_multiplier: 1.5 tl2_additional_flags_per_day_multiplier:
tl3_additional_flags_per_day_multiplier: 2 default: 1.5
tl4_additional_flags_per_day_multiplier: 3 area: "flags"
tl3_additional_flags_per_day_multiplier:
default: 2
area: "flags"
tl4_additional_flags_per_day_multiplier:
default: 3
area: "flags"
alert_admins_if_errors_per_minute: alert_admins_if_errors_per_minute:
client: true client: true
default: 0 default: 0

View File

@ -87,6 +87,10 @@ module SiteSettingExtension
@categories ||= {} @categories ||= {}
end end
def areas
@areas ||= {}
end
def mandatory_values def mandatory_values
@mandatory_values ||= {} @mandatory_values ||= {}
end end
@ -194,7 +198,8 @@ module SiteSettingExtension
filter_categories: nil, filter_categories: nil,
filter_plugin: nil, filter_plugin: nil,
filter_names: nil, filter_names: nil,
filter_allowed_hidden: nil filter_allowed_hidden: nil,
filter_area: nil
) )
locale_setting_hash = { locale_setting_hash = {
setting: "default_locale", setting: "default_locale",
@ -231,6 +236,13 @@ module SiteSettingExtension
true true
end end
end end
.select do |setting_name, _|
if filter_area
Array.wrap(areas[setting_name]).include?(filter_area)
else
true
end
end
.select do |setting_name, _| .select do |setting_name, _|
if filter_plugin if filter_plugin
plugins[setting_name] == filter_plugin plugins[setting_name] == filter_plugin
@ -681,6 +693,15 @@ module SiteSettingExtension
categories[name] = opts[:category] || :uncategorized categories[name] = opts[:category] || :uncategorized
if opts[:area]
split_areas = opts[:area].split("|")
if split_areas.any? { |area| !SiteSetting::VALID_AREAS.include?(area) }
raise Discourse::InvalidParameters.new(
"Area is incorrect. Valid areas: #{SiteSetting::VALID_AREAS.join(", ")}",
)
end
areas[name] = split_areas
end
hidden_settings_provider.add_hidden(name) if opts[:hidden] hidden_settings_provider.add_hidden(name) if opts[:hidden]
if GlobalSetting.respond_to?(name) if GlobalSetting.respond_to?(name)

View File

@ -53,6 +53,7 @@ chat:
chat_auto_silence_from_flags_duration: chat_auto_silence_from_flags_duration:
default: 60 default: 60
min: 0 min: 0
area: "flags"
chat_allow_archiving_channels: chat_allow_archiving_channels:
default: false default: false
client: true client: true
@ -106,6 +107,7 @@ chat:
type: group_list type: group_list
allow_any: false allow_any: false
refresh: true refresh: true
area: "flags"
max_mentions_per_chat_message: max_mentions_per_chat_message:
client: true client: true
type: integer type: integer

View File

@ -490,6 +490,28 @@ RSpec.describe SiteSettingExtension do
end end
end end
describe "a setting with an area" do
before do
settings.setting(:test_setting, 88, area: "flags")
settings.setting(:test_setting2, 89, area: "flags")
settings.setting(:test_setting4, 90)
settings.refresh!
end
it "should allow to filter by area" do
expect(settings.all_settings(filter_area: "flags").map { |s| s[:setting].to_sym }).to eq(
%i[default_locale test_setting test_setting2],
)
end
it "raised an error when area is invalid" do
expect {
settings.setting(:test_setting, 89, area: "invalid")
settings.refresh!
}.to raise_error(Discourse::InvalidParameters)
end
end
describe "setting with a validator" do describe "setting with a validator" do
before do before do
settings.setting(:validated_setting, "info@example.com", type: "email") settings.setting(:validated_setting, "info@example.com", type: "email")

View File

@ -29,6 +29,11 @@ RSpec.describe Admin::SiteSettingsController do
expect(response.status).to eq(400) expect(response.status).to eq(400)
end end
it "returns 400 when no filter_area is invalid" do
get "/admin/config/site_settings.json", params: { filter_area: "invalid area" }
expect(response.status).to eq(400)
end
it "includes only certain allowed hidden settings" do it "includes only certain allowed hidden settings" do
get "/admin/config/site_settings.json", get "/admin/config/site_settings.json",
params: { params: {
@ -60,6 +65,25 @@ RSpec.describe Admin::SiteSettingsController do
%w[site_description enforce_second_factor], %w[site_description enforce_second_factor],
) )
end end
it "returns site settings by area" do
get "/admin/config/site_settings.json", params: { filter_area: "flags" }
expect(response.status).to eq(200)
expect(response.parsed_body["site_settings"].map { |s| s["setting"] }).to match_array(
%w[
silence_new_user_sensitivity
num_users_to_silence_new_user
flag_sockpuppets
num_flaggers_to_close_topic
auto_respond_to_flag_actions
high_trust_flaggers_auto_hide_posts
max_flags_per_day
tl2_additional_flags_per_day_multiplier
tl3_additional_flags_per_day_multiplier
tl4_additional_flags_per_day_multiplier
],
)
end
end end
end end
end end

View File

@ -160,14 +160,14 @@ describe "Admin Flags Page", type: :system do
[ [
"silence new user sensitivity", "silence new user sensitivity",
"num users to silence new user", "num users to silence new user",
"flag sockpuppets",
"num flaggers to close topic",
"auto respond to flag actions",
"high trust flaggers auto hide posts",
"max flags per day", "max flags per day",
"tl2 additional flags per day multiplier", "tl2 additional flags per day multiplier",
"tl3 additional flags per day multiplier", "tl3 additional flags per day multiplier",
"tl4 additional flags per day multiplier", "tl4 additional flags per day multiplier",
"flag sockpuppets",
"auto respond to flag actions",
"num flaggers to close topic",
"high trust flaggers auto hide posts",
], ],
) )
end end