FEATURE: New 'Reviewable' model to make reviewable items generic

Includes support for flags, reviewable users and queued posts, with REST API
backwards compatibility.

Co-Authored-By: romanrizzi <romanalejandro@gmail.com>
Co-Authored-By: jjaffeux <j.jaffeux@gmail.com>
This commit is contained in:
Robin Ward
2019-01-03 12:03:01 -05:00
parent 9a56b398a1
commit b58867b6e9
354 changed files with 8090 additions and 5225 deletions

View File

@ -93,6 +93,8 @@ class User < ActiveRecord::Base
has_many :acting_group_histories, dependent: :destroy, foreign_key: :acting_user_id, class_name: 'GroupHistory'
has_many :targeted_group_histories, dependent: :destroy, foreign_key: :target_user_id, class_name: 'GroupHistory'
has_many :reviewable_scores, dependent: :destroy
delegate :last_sent_email_address, to: :email_logs
validates_presence_of :username
@ -114,6 +116,7 @@ class User < ActiveRecord::Base
after_create :set_random_avatar
after_create :ensure_in_trust_level_group
after_create :set_default_categories_preferences
after_create :create_reviewable
before_save :update_username_lower
before_save :ensure_password_is_hashed
@ -411,19 +414,22 @@ class User < ActiveRecord::Base
end
# Approve this user
def approve(approver, send_mail = true)
self.approved = true
self.approved_at = Time.zone.now
self.approved_by = approver
def approve(approved_by, send_mail = true)
Discourse.deprecate("User#approve is deprecated. Please use the Reviewable API instead.", output_in_test: true, since: "2.3.0beta5", drop_from: "2.4")
if result = save
send_approval_email if send_mail
DiscourseEvent.trigger(:user_approved, self)
# Backwards compatibility - in case plugins or something is using the old API which accepted
# either a Number or object. Probably should remove at some point
approved_by = User.find_by(id: approved_by) if approved_by.is_a?(Numeric)
if reviewable_user = ReviewableUser.find_by(target: self)
result = reviewable_user.perform(approved_by, :approve, send_email: send_mail)
if result.success?
Reviewable.set_approved_fields!(self, approved_by)
return true
end
end
StaffActionLogger.new(approver).log_user_approve(self)
result
false
end
def self.email_hash(email)
@ -813,7 +819,7 @@ class User < ActiveRecord::Base
def delete_posts_in_batches(guardian, batch_size = 20)
raise Discourse::InvalidAccess unless guardian.can_delete_all_posts? self
QueuedPost.where(user_id: id).delete_all
Reviewable.where(created_by_id: id).delete_all
posts.order("post_number desc").limit(batch_size).each do |p|
PostDestroyer.new(guardian.user, p).destroy
@ -974,6 +980,8 @@ class User < ActiveRecord::Base
# Flag all posts from a user as spam
def flag_linked_posts_as_spam
results = []
disagreed_flag_post_ids = PostAction.where(post_action_type_id: PostActionType.types[:spam])
.where.not(disagreed_at: nil)
.pluck(:post_id)
@ -981,13 +989,12 @@ class User < ActiveRecord::Base
topic_links.includes(:post)
.where.not(post_id: disagreed_flag_post_ids)
.each do |tl|
begin
message = I18n.t('flag_reason.spam_hosts', domain: tl.domain, base_path: Discourse.base_path)
PostAction.act(Discourse.system_user, tl.post, PostActionType.types[:spam], message: message)
rescue PostAction::AlreadyActed
# If the user has already acted, just ignore it
end
message = I18n.t('flag_reason.spam_hosts', domain: tl.domain, base_path: Discourse.base_path)
results << PostActionCreator.create(Discourse.system_user, tl.post, :spam, message: message)
end
results
end
def has_uploaded_avatar
@ -1231,6 +1238,20 @@ class User < ActiveRecord::Base
Group.user_trust_level_change!(id, trust_level)
end
def create_reviewable
return unless SiteSetting.must_approve_users? || SiteSetting.invite_only?
return if approved?
reviewable = ReviewableUser.needs_review!(target: self, created_by: Discourse.system_user, reviewable_by_moderator: true)
reviewable.add_score(
Discourse.system_user,
ReviewableScore.types[:needs_approval],
force_review: true
)
reviewable
end
def create_user_stat
stat = UserStat.new(new_since: Time.now)
stat.user_id = id
@ -1310,15 +1331,6 @@ class User < ActiveRecord::Base
end
end
def send_approval_email
if SiteSetting.must_approve_users
Jobs.enqueue(:critical_user_email,
type: :signup_after_approval,
user_id: id
)
end
end
def set_default_categories_preferences
return if self.staged?
@ -1465,6 +1477,7 @@ end
# staged :boolean default(FALSE), not null
# first_seen_at :datetime
# silenced_till :datetime
# group_locked_trust_level :integer
# manual_locked_trust_level :integer
#
# Indexes