diff --git a/app/assets/javascripts/discourse/app/templates/about.hbs b/app/assets/javascripts/discourse/app/templates/about.hbs
index 2e7a123032c..90254d34939 100644
--- a/app/assets/javascripts/discourse/app/templates/about.hbs
+++ b/app/assets/javascripts/discourse/app/templates/about.hbs
@@ -18,12 +18,16 @@
"faq"
}}
{{/if}}
-
{{i18n
- "tos"
- }}
- {{i18n
- "privacy"
- }}
+ {{#if (gt this.siteSettings.tos_topic_id 0)}}
+ {{i18n
+ "tos"
+ }}
+ {{/if}}
+ {{#if (gt this.siteSettings.privacy_topic_id 0)}}
+ {{i18n
+ "privacy"
+ }}
+ {{/if}}
diff --git a/app/views/static/show.html.erb b/app/views/static/show.html.erb
index b82fff8fa3b..a0ec792c408 100644
--- a/app/views/static/show.html.erb
+++ b/app/views/static/show.html.erb
@@ -10,8 +10,12 @@
' href='<%=faq_path%>'><%= t 'js.faq' %>
<% end %>
<% end %>
- '><%= t 'js.tos' %>
- '><%= t 'js.privacy' %>
+ <% if SiteSetting.tos_topic_id > 0 %>
+ '><%= t 'js.tos' %>
+ <% end %>
+ <% if SiteSetting.privacy_topic_id > 0 %>
+ '><%= t 'js.privacy' %>
+ <% end %>
<% if staff? %>
diff --git a/config/initializers/014-track-setting-changes.rb b/config/initializers/014-track-setting-changes.rb
index 498123a5475..98d2132e4bf 100644
--- a/config/initializers/014-track-setting-changes.rb
+++ b/config/initializers/014-track-setting-changes.rb
@@ -66,21 +66,23 @@ DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value|
Emoji.clear_cache && Discourse.request_refresh! if name == :emoji_deny_list
- if (name == :title || name == :site_description) &&
- topic = Topic.find_by(id: SiteSetting.welcome_topic_id)
- PostRevisor.new(topic.first_post, topic).revise!(
- Discourse.system_user,
- {
- title: I18n.t("discourse_welcome_topic.title", site_title: SiteSetting.title),
- raw:
- I18n.t(
- "discourse_welcome_topic.body",
- base_path: Discourse.base_path,
- site_title: SiteSetting.title,
- site_description: SiteSetting.site_description,
- ),
- },
- skip_revision: true,
- )
+ # 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)
+ elsif %i[company_name contact_email governing_law city_for_disputes].include?(name)
+ topics = SeedData::Topics.with_default_locale
+ %w[tos_topic_id privacy_topic_id].each do |site_setting|
+ topic_id = SiteSetting.get(site_setting)
+ if topic_id > 0 && Topic.with_deleted.exists?(id: topic_id)
+ if SiteSetting.company_name.blank?
+ topics.delete(site_setting_names: [site_setting], skip_changed: true)
+ else
+ topics.update(site_setting_names: [site_setting], skip_changed: true)
+ end
+ elsif SiteSetting.company_name.present?
+ topics.create(site_setting_names: [site_setting])
+ end
+ end
end
end
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 98ff694b03c..4d8969986dc 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -2477,12 +2477,14 @@ uncategorized:
tos_topic_id:
default: -1
hidden: true
+ client: true
guidelines_topic_id:
default: -1
hidden: true
privacy_topic_id:
default: -1
hidden: true
+ client: true
welcome_topic_id:
default: -1
hidden: true
diff --git a/lib/seed_data/topics.rb b/lib/seed_data/topics.rb
index ad4d15052f0..d3f3cca6570 100644
--- a/lib/seed_data/topics.rb
+++ b/lib/seed_data/topics.rb
@@ -10,18 +10,28 @@ module SeedData
@locale = locale
end
- def create(site_setting_names: nil, include_welcome_topics: true)
+ def create(site_setting_names: nil, include_welcome_topics: true, include_legal_topics: false)
I18n.with_locale(@locale) do
- topics(site_setting_names, include_welcome_topics).each { |params| create_topic(**params) }
+ topics(
+ site_setting_names: site_setting_names,
+ include_welcome_topics: include_welcome_topics,
+ include_legal_topics: include_legal_topics || SiteSetting.company_name.present?,
+ ).each { |params| create_topic(**params) }
end
end
def update(site_setting_names: nil, skip_changed: false)
I18n.with_locale(@locale) do
- topics(site_setting_names).each do |params|
- params.except!(:category, :after_create)
- params[:skip_changed] = skip_changed
- update_topic(**params)
+ topics(site_setting_names: site_setting_names).each do |params|
+ update_topic(**params.except(:category, :after_create), skip_changed: skip_changed)
+ end
+ end
+ end
+
+ def delete(site_setting_names: nil, skip_changed: false)
+ I18n.with_locale(@locale) do
+ topics(site_setting_names: site_setting_names).each do |params|
+ delete_topic(**params.slice(:site_setting_name), skip_changed: skip_changed)
end
end
end
@@ -41,12 +51,14 @@ module SeedData
private
- def topics(site_setting_names = nil, include_welcome_topics = true)
+ def topics(site_setting_names: nil, include_welcome_topics: true, include_legal_topics: true)
staff_category = Category.find_by(id: SiteSetting.staff_category_id)
- topics = [
- # Terms of Service
- {
+ topics = []
+
+ # Terms of Service
+ if include_legal_topics
+ topics << {
site_setting_name: "tos_topic_id",
title: I18n.t("tos_topic.title"),
raw:
@@ -60,24 +72,28 @@ module SeedData
),
category: staff_category,
static_first_reply: true,
- },
- # FAQ/Guidelines
- {
- site_setting_name: "guidelines_topic_id",
- title: I18n.t("guidelines_topic.title"),
- raw: I18n.t("guidelines_topic.body", base_path: Discourse.base_path),
- category: staff_category,
- static_first_reply: true,
- },
- # Privacy Policy
- {
+ }
+ end
+
+ # FAQ/Guidelines
+ topics << {
+ site_setting_name: "guidelines_topic_id",
+ title: I18n.t("guidelines_topic.title"),
+ raw: I18n.t("guidelines_topic.body", base_path: Discourse.base_path),
+ category: staff_category,
+ static_first_reply: true,
+ }
+
+ # Privacy Policy
+ if include_legal_topics
+ topics << {
site_setting_name: "privacy_topic_id",
title: I18n.t("privacy_topic.title"),
raw: I18n.t("privacy_topic.body"),
category: staff_category,
static_first_reply: true,
- },
- ]
+ }
+ end
if include_welcome_topics
# Welcome Topic
@@ -152,27 +168,42 @@ module SeedData
end
def update_topic(site_setting_name:, title:, raw:, static_first_reply: false, skip_changed:)
- post = find_post(site_setting_name)
+ post = find_post(site_setting_name, deleted: true)
return if !post
if !skip_changed || unchanged?(post)
- changes = { title: title, raw: raw }
- post.revise(Discourse.system_user, changes, skip_validations: true)
+ if post.trashed?
+ PostDestroyer.new(Discourse.system_user, post).recover
+ post.reload
+ end
+
+ post.revise(Discourse.system_user, { title: title, raw: raw }, skip_validations: true)
end
if static_first_reply && (reply = first_reply(post)) && (!skip_changed || unchanged?(reply))
- changes = { raw: first_reply_raw(title) }
- reply.revise(Discourse.system_user, changes, skip_validations: true)
+ reply.revise(Discourse.system_user, { raw: first_reply_raw(title) }, skip_validations: true)
end
end
- def find_post(site_setting_name)
+ def delete_topic(site_setting_name:, skip_changed:)
+ post = find_post(site_setting_name)
+ return if !post
+
+ PostDestroyer.new(Discourse.system_user, post).destroy if !skip_changed || unchanged?(post)
+ end
+
+ def find_post(site_setting_name, deleted: false)
topic_id = SiteSetting.get(site_setting_name)
- Post.find_by(topic_id: topic_id, post_number: 1) if topic_id > 0
+ return if topic_id < 1
+
+ posts = Post.where(topic_id: topic_id, post_number: 1)
+ posts = posts.with_deleted if deleted
+ posts.first
end
def unchanged?(post)
- post.last_editor_id == Discourse::SYSTEM_USER_ID
+ post.last_editor_id == Discourse::SYSTEM_USER_ID &&
+ (!post.deleted_by_id || post.deleted_by_id == Discourse::SYSTEM_USER_ID)
end
def setting_value(site_setting_key)
diff --git a/lib/tasks/annotate.rake b/lib/tasks/annotate.rake
index 677c7d6d1f4..57bc0129ac3 100644
--- a/lib/tasks/annotate.rake
+++ b/lib/tasks/annotate.rake
@@ -17,7 +17,7 @@ desc "ensure the asynchronously-created post_search_data index is present"
task "annotate:ensure_all_indexes" => :environment do |task, args|
# One of the indexes on post_search_data is created by a sidekiq job
# We need to do some acrobatics to create it on-demand
- SeedData::Topics.with_default_locale.create(include_welcome_topics: true)
+ SeedData::Topics.with_default_locale.create
SiteSetting.search_enable_recent_regular_posts_offset_size = 1
Jobs::CreateRecentPostSearchIndexes.new.execute([])
end
diff --git a/spec/initializers/track_setting_changes_spec.rb b/spec/initializers/track_setting_changes_spec.rb
index 47c538b4f5a..024a61b7ec7 100644
--- a/spec/initializers/track_setting_changes_spec.rb
+++ b/spec/initializers/track_setting_changes_spec.rb
@@ -43,4 +43,54 @@ RSpec.describe "Setting changes" do
expect(Reviewable.min_score_for_priority(:low)).not_to eq(new_threshold)
end
end
+
+ describe "#title and #site_description" do
+ before do
+ general_category = Fabricate(:category, name: "General")
+ SiteSetting.general_category_id = general_category.id
+ SeedData::Topics.with_default_locale.create(site_setting_names: ["welcome_topic_id"])
+ end
+
+ it "updates the welcome topic when title changes" do
+ SiteSetting.title = SecureRandom.alphanumeric
+
+ topic = Topic.find(SiteSetting.welcome_topic_id)
+ expect(topic.title).to include(SiteSetting.title)
+ expect(topic.first_post.raw).to include(SiteSetting.title)
+ end
+
+ it "updates the welcome topic when site_description changes" do
+ SiteSetting.site_description = SecureRandom.alphanumeric
+
+ topic = Topic.find(SiteSetting.welcome_topic_id)
+ expect(topic.first_post.raw).to include(SiteSetting.site_description)
+ end
+ end
+
+ describe "#company_name" do
+ it "creates the TOS and Privacy topics" do
+ expect { SiteSetting.company_name = "Company Name" }.to change { Topic.count }.by(
+ 2,
+ ).and change { SiteSetting.tos_topic_id }.and change { SiteSetting.privacy_topic_id }
+ end
+
+ it "creates, updates and deletes the topic" do
+ # Topic is created
+ expect { SiteSetting.company_name = "Company Name" }.to change { Topic.count }.by(2)
+ topic = Topic.find(SiteSetting.tos_topic_id)
+ first_post = topic.first_post
+ expect(first_post.raw).to include("Company Name")
+
+ # Topic is edited
+ expect { SiteSetting.company_name = "Other Name" }.not_to change { Topic.count }
+ expect(first_post.reload.raw).to include("Other Name")
+
+ # Topic can be deleted
+ expect { SiteSetting.company_name = "" }.to change { Topic.count }.by(-2)
+
+ # Topic can be recovered and edited
+ SiteSetting.company_name = "New Name"
+ expect(first_post.reload.raw).to include("New Name")
+ end
+ end
end
diff --git a/spec/lib/seed_data/topics_spec.rb b/spec/lib/seed_data/topics_spec.rb
index 815d30ac314..aeaa2dd1bf2 100644
--- a/spec/lib/seed_data/topics_spec.rb
+++ b/spec/lib/seed_data/topics_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe SeedData::Topics do
end
def create_topic(name = "welcome_topic_id")
- subject.create(site_setting_names: [name])
+ subject.create(site_setting_names: [name], include_legal_topics: true)
end
describe "#create" do
@@ -71,6 +71,19 @@ RSpec.describe SeedData::Topics do
expect { create_topic }.to_not change { Topic.count }
end
+
+ it "does not create a legal topic if company_name is not set" do
+ subject.create(site_setting_names: ["tos_topic_id"])
+
+ expect(SiteSetting.tos_topic_id).to eq(-1)
+ end
+
+ it "creates a legal topic if company_name is set" do
+ SiteSetting.company_name = "Company Name"
+ subject.create(site_setting_names: ["tos_topic_id"])
+
+ expect(SiteSetting.tos_topic_id).to_not eq(-1)
+ end
end
describe "#update" do
@@ -129,6 +142,29 @@ RSpec.describe SeedData::Topics do
end
end
+ describe "#delete" do
+ def delete_topic(name = "welcome_topic_id", skip_changed: false)
+ subject.delete(site_setting_names: [name], skip_changed: skip_changed)
+ end
+
+ it "deletes the topic" do
+ create_topic
+
+ topic = Topic.last
+
+ expect { delete_topic }.to change { Topic.count }.by(-1)
+ end
+
+ it "does not delete the topic if changed" do
+ create_topic
+
+ topic = Topic.last
+ topic.first_post.revise(Fabricate(:admin), raw: "New text of first post.")
+
+ expect { delete_topic(skip_changed: true) }.not_to change { Topic.count }
+ end
+ end
+
describe "#reseed_options" do
it "returns only existing topics as options" do
create_topic("guidelines_topic_id")