DEV: trash category definition topic instead of destroying. (#14356)

After deleting a category, we should soft-delete the category definition topic instead of hard deleting it. Else it causes issues while doing the user merge action if the source user has an orphan post that belongs to the deleted topic.
This commit is contained in:
Vinoth Kannan 2021-09-20 11:20:49 +05:30 committed by GitHub
parent a29a6522d0
commit a8b2e7e343
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 2 deletions

View File

@ -25,7 +25,7 @@ class Category < ActiveRecord::Base
register_custom_field_type(REQUIRE_REPLY_APPROVAL, :boolean) register_custom_field_type(REQUIRE_REPLY_APPROVAL, :boolean)
register_custom_field_type(NUM_AUTO_BUMP_DAILY, :integer) register_custom_field_type(NUM_AUTO_BUMP_DAILY, :integer)
belongs_to :topic, dependent: :destroy belongs_to :topic
belongs_to :topic_only_relative_url, belongs_to :topic_only_relative_url,
-> { select "id, title, slug" }, -> { select "id, title, slug" },
class_name: "Topic", class_name: "Topic",
@ -67,6 +67,7 @@ class Category < ActiveRecord::Base
validates :slug, exclusion: { in: RESERVED_SLUGS } validates :slug, exclusion: { in: RESERVED_SLUGS }
after_create :create_category_definition after_create :create_category_definition
after_destroy :trash_category_definition
before_save :apply_permissions before_save :apply_permissions
before_save :downcase_email before_save :downcase_email
@ -296,6 +297,10 @@ class Category < ActiveRecord::Base
end end
end end
def trash_category_definition
self.topic&.trash!
end
def topic_url def topic_url
if has_attribute?("topic_slug") if has_attribute?("topic_slug")
Topic.relative_url(topic_id, read_attribute(:topic_slug)) Topic.relative_url(topic_id, read_attribute(:topic_slug))

View File

@ -538,7 +538,7 @@ describe Category do
it 'is deleted correctly' do it 'is deleted correctly' do
@category.destroy @category.destroy
expect(Category.exists?(id: @category_id)).to be false expect(Category.exists?(id: @category_id)).to be false
expect(Topic.exists?(id: @topic_id)).to be false expect(Topic.with_deleted.where.not(deleted_at: nil).exists?(id: @topic_id)).to be true
expect(SiteSetting.shared_drafts_category).to be_blank expect(SiteSetting.shared_drafts_category).to be_blank
end end