mirror of
https://github.com/discourse/discourse.git
synced 2025-05-30 07:11:34 +08:00
FIX: Recovered posts with no user will be taken over by system user (#8834)
This commit is contained in:
@ -187,7 +187,7 @@ module PostGuardian
|
|||||||
# Recovery Method
|
# Recovery Method
|
||||||
def can_recover_post?(post)
|
def can_recover_post?(post)
|
||||||
if is_staff?
|
if is_staff?
|
||||||
post.deleted_at && post.user
|
!!post.deleted_at
|
||||||
else
|
else
|
||||||
is_my_own?(post) && post.user_deleted && !post.deleted_at
|
is_my_own?(post) && post.user_deleted && !post.deleted_at
|
||||||
end
|
end
|
||||||
|
@ -113,7 +113,7 @@ module TopicGuardian
|
|||||||
# Recovery Method
|
# Recovery Method
|
||||||
def can_recover_topic?(topic)
|
def can_recover_topic?(topic)
|
||||||
if is_staff?
|
if is_staff?
|
||||||
!!(topic && topic.deleted_at && topic.user)
|
!!(topic && topic.deleted_at)
|
||||||
else
|
else
|
||||||
topic && can_recover_post?(topic.ordered_posts.first)
|
topic && can_recover_post?(topic.ordered_posts.first)
|
||||||
end
|
end
|
||||||
|
@ -91,6 +91,7 @@ class PostDestroyer
|
|||||||
user_recovered
|
user_recovered
|
||||||
end
|
end
|
||||||
topic = Topic.with_deleted.find @post.topic_id
|
topic = Topic.with_deleted.find @post.topic_id
|
||||||
|
topic.update_column(:user_id, Discourse::SYSTEM_USER_ID) if !topic.user_id
|
||||||
topic.recover!(@user) if @post.is_first_post?
|
topic.recover!(@user) if @post.is_first_post?
|
||||||
topic.update_statistics
|
topic.update_statistics
|
||||||
UserActionManager.post_created(@post)
|
UserActionManager.post_created(@post)
|
||||||
@ -103,6 +104,7 @@ class PostDestroyer
|
|||||||
end
|
end
|
||||||
|
|
||||||
def staff_recovered
|
def staff_recovered
|
||||||
|
@post.update_column(:user_id, Discourse::SYSTEM_USER_ID) if !@post.user_id
|
||||||
@post.recover!
|
@post.recover!
|
||||||
|
|
||||||
mark_topic_changed
|
mark_topic_changed
|
||||||
|
@ -1159,7 +1159,7 @@ describe Guardian do
|
|||||||
PostDestroyer.new(moderator, topic.first_post).destroy
|
PostDestroyer.new(moderator, topic.first_post).destroy
|
||||||
topic.first_post.user.destroy!
|
topic.first_post.user.destroy!
|
||||||
|
|
||||||
expect(Guardian.new(moderator).can_recover_topic?(topic.reload)).to be_falsey
|
expect(Guardian.new(moderator).can_recover_topic?(topic.reload)).to be_truthy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1199,7 +1199,7 @@ describe Guardian do
|
|||||||
PostDestroyer.new(moderator, post).destroy
|
PostDestroyer.new(moderator, post).destroy
|
||||||
post.user.destroy!
|
post.user.destroy!
|
||||||
|
|
||||||
expect(Guardian.new(moderator).can_recover_post?(post.reload)).to be_falsey
|
expect(Guardian.new(moderator).can_recover_post?(post.reload)).to be_truthy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -180,6 +180,15 @@ describe PostDestroyer do
|
|||||||
expect(post_action).to be_present
|
expect(post_action).to be_present
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "works with topics and posts with no user" do
|
||||||
|
post = Fabricate(:post)
|
||||||
|
UserDestroyer.new(Discourse.system_user).destroy(post.user, delete_posts: true)
|
||||||
|
|
||||||
|
expect { PostDestroyer.new(Fabricate(:admin), post.reload).recover }
|
||||||
|
.to change { post.reload.user_id }.to(Discourse.system_user.id)
|
||||||
|
.and change { post.topic.user_id }.to(Discourse.system_user.id)
|
||||||
|
end
|
||||||
|
|
||||||
describe "post_count recovery" do
|
describe "post_count recovery" do
|
||||||
before do
|
before do
|
||||||
post
|
post
|
||||||
|
Reference in New Issue
Block a user