diff --git a/app/assets/javascripts/discourse/app/lib/site-setting-filter.js b/app/assets/javascripts/discourse/app/lib/site-setting-filter.js index cdaf7acee5c..91c74f18169 100644 --- a/app/assets/javascripts/discourse/app/lib/site-setting-filter.js +++ b/app/assets/javascripts/discourse/app/lib/site-setting-filter.js @@ -78,10 +78,12 @@ export default class SiteSettingFilter { setting.includes(filter) || setting.replace(/_/g, " ").includes(filter) || item.get("description").toLowerCase().includes(filter) || - (item.get("keywords") || "") - .replace(/_/g, " ") - .toLowerCase() - .includes(filter.replace(/_/g, " ")) || + (item.get("keywords") || []).any((keyword) => + keyword + .replace(/_/g, " ") + .toLowerCase() + .includes(filter.replace(/_/g, " ")) + ) || (item.get("value") || "").toString().toLowerCase().includes(filter); if (!filterResult && fuzzyRegex && fuzzyRegex.test(setting)) { // Tightens up fuzzy search results a bit. diff --git a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js index 0b5c2ad16e2..43bb3cca3d9 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js +++ b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js @@ -21,7 +21,7 @@ export default { preview: null, secret: false, type: "username", - keywords: "blah blah", + keywords: ["blah blah"], }, { setting: "logo", diff --git a/app/models/user.rb b/app/models/user.rb index 2e58aacc053..8f773d7629b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2023,8 +2023,11 @@ class User < ActiveRecord::Base destroyer = UserDestroyer.new(Discourse.system_user) User + .joins( + "LEFT JOIN user_histories ON user_histories.target_user_id = users.id AND action = #{UserHistory.actions[:deactivate_user]} AND acting_user_id > 0", + ) .where(active: false) - .where("created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago) + .where("users.created_at < ?", SiteSetting.purge_unactivated_users_grace_period_days.days.ago) .where("NOT admin AND NOT moderator") .where( "NOT EXISTS @@ -2036,6 +2039,7 @@ class User < ActiveRecord::Base (SELECT 1 FROM posts p WHERE p.user_id = users.id LIMIT 1) ", ) + .where("user_histories.id IS NULL") .limit(200) .find_each do |user| begin diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 676ca560e8a..93fac23fa7b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2673,6 +2673,14 @@ en: user_api_key_allowed_groups: "min_trust_level_for_user_api_key" tag_topic_allowed_groups: "min_trust_level_to_tag_topics" profile_background_allowed_groups: "min_trust_level_to_allow_profile_background" + clean_up_inactive_users_after_days: + - "deactivated" + - "inactive" + - "unactivated" + purge_unactivated_users_grace_period_days: + - "deactivated" + - "inactive" + - "unactivated" placeholder: discourse_connect_provider_secrets: diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb index bad24028cb1..969ebfc7f41 100644 --- a/lib/site_setting_extension.rb +++ b/lib/site_setting_extension.rb @@ -260,7 +260,7 @@ module SiteSettingExtension end def keywords(setting) - I18n.t("site_settings.keywords.#{setting}", default: "") + Array.wrap(I18n.t("site_settings.keywords.#{setting}", default: "")) end def placeholder(setting) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 897a42df5ee..265aef02dc7 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1794,6 +1794,7 @@ RSpec.describe User do describe "#purge_unactivated" do fab!(:user) { Fabricate(:user, refresh_auto_groups: true) } + fab!(:admin) { Fabricate(:user) } fab!(:unactivated) { Fabricate(:user, active: false) } fab!(:unactivated_old) { Fabricate(:user, active: false, created_at: 1.month.ago) } fab!(:unactivated_old_with_system_pm) do @@ -1805,6 +1806,12 @@ RSpec.describe User do fab!(:unactivated_old_with_post) do Fabricate(:user, active: false, created_at: 1.month.ago, refresh_auto_groups: true) end + fab!(:unactivated_by_admin) do + Fabricate(:user, active: false, created_at: 1.month.ago, refresh_auto_groups: true) + end + fab!(:unactivated_by_system) do + Fabricate(:user, active: false, created_at: 1.month.ago, refresh_auto_groups: true) + end before do PostCreator.new( @@ -1828,12 +1835,30 @@ RSpec.describe User do title: "Test topic from a user", raw: "This is a sample message", ).create + + UserHistory.create!( + action: UserHistory.actions[:deactivate_user], + acting_user: admin, + target_user: unactivated_by_admin, + ) + UserHistory.create!( + action: UserHistory.actions[:deactivate_user], + acting_user: Discourse.system_user, + target_user: unactivated_by_system, + ) end - it "should only remove old, unactivated users" do + it "should only remove old, unactivated users that haven't been manually deactivated" do User.purge_unactivated expect(User.real.all).to match_array( - [user, unactivated, unactivated_old_with_human_pm, unactivated_old_with_post], + [ + user, + unactivated, + unactivated_old_with_human_pm, + unactivated_old_with_post, + unactivated_by_admin, + admin, + ], ) end @@ -1848,6 +1873,9 @@ RSpec.describe User do unactivated_old_with_system_pm, unactivated_old_with_human_pm, unactivated_old_with_post, + unactivated_by_admin, + unactivated_by_system, + admin, ], ) end diff --git a/spec/system/admin_site_setting_search_spec.rb b/spec/system/admin_site_setting_search_spec.rb index 375977013db..75c765d58d8 100644 --- a/spec/system/admin_site_setting_search_spec.rb +++ b/spec/system/admin_site_setting_search_spec.rb @@ -33,6 +33,13 @@ describe "Admin Site Setting Search", type: :system do expect(settings_page).to have_search_result("anonymous_posting_allowed_groups") end + it "finds the associated site setting when many keywords" do + settings_page.visit + settings_page.type_in_search("deactivated") + expect(settings_page).to have_search_result("clean_up_inactive_users_after_days") + expect(settings_page).to have_search_result("purge_unactivated_users_grace_period_days") + end + it "can search for previous site setting without underscores" do settings_page.visit settings_page.type_in_search("anonymous posting min")