mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FEATURE: allow TL3 promotions for overturned penalties
Restore tl3 reachability by calculating penalty counts vs unsuspend/unsilence. Only count unsuspend or unsilences that have been made by a user other than the Discourse system user.
This commit is contained in:
parent
00477d8f88
commit
eca1c643d5
@ -104,18 +104,33 @@ class TrustLevel3Requirements
|
|||||||
def penalty_counts
|
def penalty_counts
|
||||||
args = {
|
args = {
|
||||||
user_id: @user.id,
|
user_id: @user.id,
|
||||||
|
system_user_id: Discourse.system_user.id,
|
||||||
silence_user: UserHistory.actions[:silence_user],
|
silence_user: UserHistory.actions[:silence_user],
|
||||||
|
unsilence_user: UserHistory.actions[:unsilence_user],
|
||||||
suspend_user: UserHistory.actions[:suspend_user],
|
suspend_user: UserHistory.actions[:suspend_user],
|
||||||
|
unsuspend_user: UserHistory.actions[:unsuspend_user],
|
||||||
since: FORGIVENESS_PERIOD.ago
|
since: FORGIVENESS_PERIOD.ago
|
||||||
}
|
}
|
||||||
|
|
||||||
sql = <<~SQL
|
sql = <<~SQL
|
||||||
SELECT
|
SELECT
|
||||||
SUM(CASE WHEN action = :silence_user THEN 1 ELSE 0 END) AS silence_count,
|
SUM(
|
||||||
SUM(CASE WHEN action = :suspend_user THEN 1 ELSE 0 END) AS suspend_count
|
CASE
|
||||||
|
WHEN action = :silence_user THEN 1
|
||||||
|
WHEN action = :unsilence_user AND acting_user_id != :system_user_id THEN -1
|
||||||
|
ELSE 0
|
||||||
|
END
|
||||||
|
) AS silence_count,
|
||||||
|
SUM(
|
||||||
|
CASE
|
||||||
|
WHEN action = :suspend_user THEN 1
|
||||||
|
WHEN action = :unsuspend_user AND acting_user_id != :system_user_id THEN -1
|
||||||
|
ELSE 0
|
||||||
|
END
|
||||||
|
) AS suspend_count
|
||||||
FROM user_histories AS uh
|
FROM user_histories AS uh
|
||||||
WHERE uh.target_user_id = :user_id
|
WHERE uh.target_user_id = :user_id
|
||||||
AND uh.action IN (:silence_user, :suspend_user)
|
AND uh.action IN (:silence_user, :suspend_user, :unsilence_user, :unsuspend_user)
|
||||||
AND uh.created_at > :since
|
AND uh.created_at > :since
|
||||||
SQL
|
SQL
|
||||||
|
|
||||||
|
@ -31,6 +31,17 @@ describe TrustLevel3Requirements do
|
|||||||
expect(tl3_requirements.penalty_counts.silenced).to eq(1)
|
expect(tl3_requirements.penalty_counts.silenced).to eq(1)
|
||||||
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
||||||
UserSilencer.new(user, moderator).unsilence
|
UserSilencer.new(user, moderator).unsilence
|
||||||
|
expect(tl3_requirements.penalty_counts.silenced).to eq(0)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "ignores system user unsilences" do
|
||||||
|
expect(tl3_requirements.penalty_counts.silenced).to eq(0)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(0)
|
||||||
|
UserSilencer.new(user, moderator).silence
|
||||||
|
expect(tl3_requirements.penalty_counts.silenced).to eq(1)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
||||||
|
UserSilencer.new(user, Discourse.system_user).unsilence
|
||||||
expect(tl3_requirements.penalty_counts.silenced).to eq(1)
|
expect(tl3_requirements.penalty_counts.silenced).to eq(1)
|
||||||
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
||||||
end
|
end
|
||||||
@ -43,6 +54,7 @@ describe TrustLevel3Requirements do
|
|||||||
|
|
||||||
UserHistory.create!(
|
UserHistory.create!(
|
||||||
target_user_id: user.id,
|
target_user_id: user.id,
|
||||||
|
acting_user_id: moderator.id,
|
||||||
action: UserHistory.actions[:suspend_user]
|
action: UserHistory.actions[:suspend_user]
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -51,6 +63,32 @@ describe TrustLevel3Requirements do
|
|||||||
|
|
||||||
UserHistory.create!(
|
UserHistory.create!(
|
||||||
target_user_id: user.id,
|
target_user_id: user.id,
|
||||||
|
acting_user_id: moderator.id,
|
||||||
|
action: UserHistory.actions[:unsuspend_user]
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(tl3_requirements.penalty_counts.suspended).to eq(0)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "ignores system user un-suspend" do
|
||||||
|
user.save!
|
||||||
|
|
||||||
|
expect(tl3_requirements.penalty_counts.suspended).to eq(0)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(0)
|
||||||
|
|
||||||
|
UserHistory.create!(
|
||||||
|
target_user_id: user.id,
|
||||||
|
acting_user_id: Discourse.system_user.id,
|
||||||
|
action: UserHistory.actions[:suspend_user]
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(tl3_requirements.penalty_counts.suspended).to eq(1)
|
||||||
|
expect(tl3_requirements.penalty_counts.total).to eq(1)
|
||||||
|
|
||||||
|
UserHistory.create!(
|
||||||
|
target_user_id: user.id,
|
||||||
|
acting_user_id: Discourse.system_user.id,
|
||||||
action: UserHistory.actions[:unsuspend_user]
|
action: UserHistory.actions[:unsuspend_user]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user