DEV: Move min_trust_level_for_here_mention to group setting (#24263)

c.f. https://meta.discourse.org/t/-/283408
This commit is contained in:
Martin Brennan 2023-11-09 12:07:01 +10:00 committed by GitHub
parent 37fda6d479
commit 67ac4c5616
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 1 deletions

View File

@ -1987,6 +1987,7 @@ en:
here_mention: "Name used for a @mention to allow privileged users to notify up to 'max_here_mentioned' people participating in the topic. Must not be an existing username." here_mention: "Name used for a @mention to allow privileged users to notify up to 'max_here_mentioned' people participating in the topic. Must not be an existing username."
max_here_mentioned: "Maximum number of mentioned people by @here." max_here_mentioned: "Maximum number of mentioned people by @here."
min_trust_level_for_here_mention: "The minimum trust level allowed to mention @here." min_trust_level_for_here_mention: "The minimum trust level allowed to mention @here."
here_mention_allowed_groups: "Groups that are allowed to mention @here."
create_thumbnails: "Create thumbnails and lightbox images that are too large to fit in a post." create_thumbnails: "Create thumbnails and lightbox images that are too large to fit in a post."
@ -2540,6 +2541,7 @@ en:
keywords: keywords:
anonymous_posting_allowed_groups: "anonymous_posting_min_trust_level" anonymous_posting_allowed_groups: "anonymous_posting_min_trust_level"
here_mention_allowed_groups: "min_trust_level_for_here_mention"
shared_drafts_allowed_groups: "shared_drafts_min_trust_level" shared_drafts_allowed_groups: "shared_drafts_min_trust_level"
placeholder: placeholder:

View File

@ -960,6 +960,13 @@ posting:
min_trust_level_for_here_mention: min_trust_level_for_here_mention:
default: "2" default: "2"
enum: "TrustLevelAndStaffSetting" enum: "TrustLevelAndStaffSetting"
here_mention_allowed_groups:
default: "12" # auto group trust_level_2
type: group_list
client: true
allow_any: false
refresh: true
validator: "AtLeastOneGroupValidator"
title_max_word_length: title_max_word_length:
default: 30 default: 30
locale_default: locale_default:

View File

@ -0,0 +1,42 @@
# frozen_string_literal: true
class MigrateMinTrustLevelForHereMentionToGroup < ActiveRecord::Migration[7.0]
def up
min_trust_level_for_here_mention_raw =
DB.query_single(
"SELECT value FROM site_settings WHERE name = 'min_trust_level_for_here_mention'",
).first
# Default for old setting is trust level 2 and is TrustLevelAndStaffSetting, we only need to do anything if it's been changed in the DB.
if min_trust_level_for_here_mention_raw.present?
# Matches Group::AUTO_GROUPS to the trust levels & special admin/staff cases.
here_mention_allowed_groups =
case min_trust_level_for_here_mention_raw
when "admin"
"1"
when "staff"
"3"
when "0"
"10"
when "1"
"11"
when "2"
"12"
when "3"
"13"
when "4"
"14"
end
# Data_type 20 is group_list.
DB.exec(<<~SQL, setting: here_mention_allowed_groups)
INSERT INTO site_settings(name, value, data_type, created_at, updated_at)
VALUES('here_mention_allowed_groups', :setting, 20, NOW(), NOW())
SQL
end
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -607,6 +607,7 @@ class Guardian
return false if !authenticated? return false if !authenticated?
return false if User.where(username_lower: SiteSetting.here_mention).exists? return false if User.where(username_lower: SiteSetting.here_mention).exists?
@user.in_any_groups?(SiteSetting.here_mention_allowed_groups_map) ||
@user.has_trust_level_or_staff?(SiteSetting.min_trust_level_for_here_mention) @user.has_trust_level_or_staff?(SiteSetting.min_trust_level_for_here_mention)
end end

View File

@ -10,6 +10,7 @@ module SiteSettings::DeprecatedSettings
["default_categories_regular", "default_categories_normal", true, "3.0"], ["default_categories_regular", "default_categories_normal", true, "3.0"],
["anonymous_posting_min_trust_level", "anonymous_posting_allowed_groups", false, "3.3"], ["anonymous_posting_min_trust_level", "anonymous_posting_allowed_groups", false, "3.3"],
["shared_drafts_min_trust_level", "shared_drafts_allowed_groups", false, "3.3"], ["shared_drafts_min_trust_level", "shared_drafts_allowed_groups", false, "3.3"],
["min_trust_level_for_here_mention", "here_mention_allowed_groups", false, "3.3"],
] ]
def setup_deprecated_methods def setup_deprecated_methods

View File

@ -4289,6 +4289,8 @@ RSpec.describe Guardian do
end end
describe "#can_mention_here?" do describe "#can_mention_here?" do
before { Group.refresh_automatic_groups! }
it "returns false if disabled" do it "returns false if disabled" do
SiteSetting.max_here_mentioned = 0 SiteSetting.max_here_mentioned = 0
expect(admin.guardian.can_mention_here?).to eq(false) expect(admin.guardian.can_mention_here?).to eq(false)
@ -4301,6 +4303,7 @@ RSpec.describe Guardian do
it "works with trust levels" do it "works with trust levels" do
SiteSetting.min_trust_level_for_here_mention = 2 SiteSetting.min_trust_level_for_here_mention = 2
SiteSetting.here_mention_allowed_groups = Group::AUTO_GROUPS[:trust_level_2]
expect(trust_level_0.guardian.can_mention_here?).to eq(false) expect(trust_level_0.guardian.can_mention_here?).to eq(false)
expect(trust_level_1.guardian.can_mention_here?).to eq(false) expect(trust_level_1.guardian.can_mention_here?).to eq(false)
@ -4313,6 +4316,7 @@ RSpec.describe Guardian do
it "works with staff" do it "works with staff" do
SiteSetting.min_trust_level_for_here_mention = "staff" SiteSetting.min_trust_level_for_here_mention = "staff"
SiteSetting.here_mention_allowed_groups = Group::AUTO_GROUPS[:staff]
expect(trust_level_4.guardian.can_mention_here?).to eq(false) expect(trust_level_4.guardian.can_mention_here?).to eq(false)
expect(moderator.guardian.can_mention_here?).to eq(true) expect(moderator.guardian.can_mention_here?).to eq(true)
@ -4321,6 +4325,7 @@ RSpec.describe Guardian do
it "works with admin" do it "works with admin" do
SiteSetting.min_trust_level_for_here_mention = "admin" SiteSetting.min_trust_level_for_here_mention = "admin"
SiteSetting.here_mention_allowed_groups = Group::AUTO_GROUPS[:admins]
expect(trust_level_4.guardian.can_mention_here?).to eq(false) expect(trust_level_4.guardian.can_mention_here?).to eq(false)
expect(moderator.guardian.can_mention_here?).to eq(false) expect(moderator.guardian.can_mention_here?).to eq(false)