mirror of
https://github.com/discourse/discourse.git
synced 2026-08-06 02:11:32 +08:00
We want to allow users to choose between email subject formats, so we will retire this setting at `stable` and remove the associated upcoming change metadata. The site setting action was also updated to follow the convention adopted in other site setting actions by inheriting from `Service::ActionBase` and passing an `enabled` value as true/false. I have moved the call site for this site setting toggle from track upcoming change toggle over to the track site setting initializer.
105 lines
3.8 KiB
Ruby
Vendored
105 lines
3.8 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value|
|
|
Category.clear_subcategory_ids if name === :max_category_nesting
|
|
|
|
# Enabling `must_approve_users` on an existing site is odd, so we assume that the
|
|
# existing users are approved unless they currently have a pending reviewable.
|
|
if name == :must_approve_users && new_value == true
|
|
User
|
|
.where(approved: false)
|
|
.joins(
|
|
"LEFT JOIN reviewables r ON r.target_id = users.id AND r.target_type = 'User' AND r.status = #{Reviewable.statuses[:pending]}",
|
|
)
|
|
.where(r: { id: nil })
|
|
.update_all(approved: true)
|
|
end
|
|
|
|
if name == :emoji_set
|
|
Emoji.clear_cache
|
|
|
|
before = "/images/emoji/#{old_value}/"
|
|
after = "/images/emoji/#{new_value}/"
|
|
|
|
Scheduler::Defer.later("Fix Emoji Links") do
|
|
DB.exec(
|
|
"UPDATE posts SET cooked = REPLACE(cooked, :before, :after) WHERE cooked LIKE :like",
|
|
before: before,
|
|
after: after,
|
|
like: "%#{before}%",
|
|
)
|
|
end
|
|
end
|
|
|
|
Stylesheet::Manager.clear_color_scheme_cache! if %i[base_font heading_font].include?(name)
|
|
|
|
Report.clear_cache(:storage_stats) if %i[backup_location s3_backup_bucket].include?(name)
|
|
|
|
if name == :slug_generation_method
|
|
Scheduler::Defer.later("Null topic slug") { Topic.update_all(slug: nil) }
|
|
end
|
|
|
|
SvgSprite.expire_cache if name.to_s.include?("_icon")
|
|
|
|
SiteIconManager.ensure_optimized! if SiteIconManager::WATCHED_SETTINGS.include?(name)
|
|
|
|
# Make sure medium and high priority thresholds were calculated.
|
|
if name == :reviewable_low_priority_threshold && Reviewable.min_score_for_priority(:medium) > 0
|
|
Reviewable.set_priorities(low: new_value)
|
|
end
|
|
|
|
Emoji.clear_cache && Discourse.request_refresh! if name == :emoji_deny_list
|
|
|
|
Discourse.clear_urls! if %i[tos_topic_id privacy_topic_id].include?(name)
|
|
|
|
# Update seeded topics
|
|
if %i[title site_description].include?(name)
|
|
topics = SeedData::Topics.with_default_locale
|
|
topics.update(site_setting_names: ["welcome_topic_id"], skip_changed: true)
|
|
end
|
|
|
|
Theme.expire_site_cache! if name == :default_theme_id
|
|
|
|
if name == :splash_screen_image && new_value.present?
|
|
SiteSetting::SplashScreenImageChanged.call(
|
|
upload_id: new_value,
|
|
guardian: Discourse.system_user.guardian,
|
|
) do |result|
|
|
on_model_not_found(:upload) { Rails.logger.error("Upload not found for #{name} change") }
|
|
on_model_not_found(:svg) do
|
|
Rails.logger.error("SVG could not be parsed from upload #{new_value} when updating #{name}")
|
|
end
|
|
on_success { Rails.logger.info("Successfully updated #{name} SVG") }
|
|
on_failure { Rails.logger.error("Failed to update #{name} SVG") }
|
|
end
|
|
end
|
|
|
|
if name == :simple_email_subject
|
|
SiteSetting::Action::SimpleEmailSubjectToggled.call(enabled: new_value)
|
|
end
|
|
|
|
if name == :content_localization_enabled && new_value == true
|
|
%i[post_menu post_menu_hidden_items].each do |setting_name|
|
|
current_items = SiteSetting.get(setting_name).split("|")
|
|
if current_items.exclude?("addTranslation")
|
|
edit_index = current_items.index("edit")
|
|
insert_position = edit_index ? edit_index + 1 : 0
|
|
current_items.insert(insert_position, "addTranslation")
|
|
SiteSetting.set(setting_name, current_items.join("|"))
|
|
end
|
|
end
|
|
end
|
|
|
|
# Update Discourse ID metadata
|
|
if SiteSetting.discourse_id_client_id.present? && SiteSetting.discourse_id_client_secret.present?
|
|
if %i[title logo logo_small site_description].include?(name)
|
|
Scheduler::Defer.later("Update Discourse ID metadata") do
|
|
DiscourseId::Register.call(update: true)
|
|
rescue StandardError => e
|
|
Rails.logger.error(
|
|
"Failed to update Discourse ID metadata after #{name} change: #{e.message}",
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|