Fix a case when a staff user views a topic with a deleted post by a nuked user; might be a temporary solution until we decide what to do with nuked records
This commit is contained in:
parent
91dc0b9ef1
commit
8814f9ed05
|
@ -3,7 +3,7 @@
|
||||||
# Use the AdminLogger class to log records to this table.
|
# Use the AdminLogger class to log records to this table.
|
||||||
class AdminLog < ActiveRecord::Base
|
class AdminLog < ActiveRecord::Base
|
||||||
belongs_to :admin, class_name: 'User'
|
belongs_to :admin, class_name: 'User'
|
||||||
belongs_to :target_user, class_name: 'User' # can be nil
|
belongs_to :target_user, class_name: 'User' # can be nil, or return nil if user record was nuked
|
||||||
|
|
||||||
validates_presence_of :admin_id
|
validates_presence_of :admin_id
|
||||||
validates_presence_of :action
|
validates_presence_of :action
|
||||||
|
|
|
@ -45,6 +45,7 @@ class Post < ActiveRecord::Base
|
||||||
scope :public_posts, -> { joins(:topic).where('topics.archetype <> ?', Archetype.private_message) }
|
scope :public_posts, -> { joins(:topic).where('topics.archetype <> ?', Archetype.private_message) }
|
||||||
scope :private_posts, -> { joins(:topic).where('topics.archetype = ?', Archetype.private_message) }
|
scope :private_posts, -> { joins(:topic).where('topics.archetype = ?', Archetype.private_message) }
|
||||||
scope :with_topic_subtype, ->(subtype) { joins(:topic).where('topics.subtype = ?', subtype) }
|
scope :with_topic_subtype, ->(subtype) { joins(:topic).where('topics.subtype = ?', subtype) }
|
||||||
|
scope :without_nuked_users, -> { where(nuked_user: false) }
|
||||||
|
|
||||||
def self.hidden_reasons
|
def self.hidden_reasons
|
||||||
@hidden_reasons ||= Enum.new(:flag_threshold_reached, :flag_threshold_reached_again, :new_user_spam_threshold_reached)
|
@hidden_reasons ||= Enum.new(:flag_threshold_reached, :flag_threshold_reached_again, :new_user_spam_threshold_reached)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddNukedUserToPosts < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :posts, :nuked_user, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,6 +10,7 @@ class AdminLogger
|
||||||
AdminLog.create(
|
AdminLog.create(
|
||||||
action: AdminLog.actions[:delete_user],
|
action: AdminLog.actions[:delete_user],
|
||||||
admin_id: @admin.id,
|
admin_id: @admin.id,
|
||||||
|
target_user_id: deleted_user.id,
|
||||||
details: [:id, :username, :name, :created_at, :trust_level, :last_seen_at, :last_emailed_at].map { |x| "#{x}: #{deleted_user.send(x)}" }.join(', ')
|
details: [:id, :username, :name, :created_at, :trust_level, :last_seen_at, :last_emailed_at].map { |x| "#{x}: #{deleted_user.send(x)}" }.join(', ')
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,7 +27,7 @@ class TopicView
|
||||||
@limit = options[:limit] || SiteSetting.posts_per_page;
|
@limit = options[:limit] || SiteSetting.posts_per_page;
|
||||||
|
|
||||||
@filtered_posts = @topic.posts
|
@filtered_posts = @topic.posts
|
||||||
@filtered_posts = @filtered_posts.with_deleted if user.try(:staff?)
|
@filtered_posts = @filtered_posts.with_deleted.without_nuked_users if user.try(:staff?)
|
||||||
@filtered_posts = @filtered_posts.best_of if options[:filter] == 'best_of'
|
@filtered_posts = @filtered_posts.best_of if options[:filter] == 'best_of'
|
||||||
@filtered_posts = @filtered_posts.where('posts.post_type <> ?', Post.types[:moderator_action]) if options[:best].present?
|
@filtered_posts = @filtered_posts.where('posts.post_type <> ?', Post.types[:moderator_action]) if options[:best].present?
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ class UserDestroyer
|
||||||
User.transaction do
|
User.transaction do
|
||||||
user.destroy.tap do |u|
|
user.destroy.tap do |u|
|
||||||
if u
|
if u
|
||||||
|
Post.with_deleted.where(user_id: user.id).update_all("nuked_user = true")
|
||||||
AdminLogger.new(@admin).log_user_deletion(user)
|
AdminLogger.new(@admin).log_user_deletion(user)
|
||||||
DiscourseHub.unregister_nickname(user.username) if SiteSetting.call_discourse_hub?
|
DiscourseHub.unregister_nickname(user.username) if SiteSetting.call_discourse_hub?
|
||||||
MessageBus.publish "/file-change", ["refresh"], user_ids: [user.id]
|
MessageBus.publish "/file-change", ["refresh"], user_ids: [user.id]
|
||||||
|
|
|
@ -29,6 +29,7 @@ describe AdminLogger do
|
||||||
|
|
||||||
it 'creates a new AdminLog record' do
|
it 'creates a new AdminLog record' do
|
||||||
expect { log_user_deletion }.to change { AdminLog.count }.by(1)
|
expect { log_user_deletion }.to change { AdminLog.count }.by(1)
|
||||||
|
AdminLog.last.target_user_id.should == deleted_user.id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,12 @@ describe UserDestroyer do
|
||||||
DiscourseHub.expects(:unregister_nickname).never
|
DiscourseHub.expects(:unregister_nickname).never
|
||||||
destroy
|
destroy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should mark the user's deleted posts as belonging to a nuked user" do
|
||||||
|
post = Fabricate(:post, user: @user, deleted_at: 1.hour.ago)
|
||||||
|
expect { destroy }.to change { User.count }.by(-1)
|
||||||
|
post.reload.nuked_user.should be_true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'and destroy fails' do
|
context 'and destroy fails' do
|
||||||
|
|
Loading…
Reference in New Issue