FEATURE: Non-staff users can use shared drafts. (#11329)
You can let non-staff users use shared drafts by modifying the `shared_drafts_min_trust_level` site setting. These users must have access to the shared draft category.
This commit is contained in:
parent
e773e21f0a
commit
9fb36290e3
|
@ -1964,7 +1964,7 @@ en:
|
||||||
label: "New Topic"
|
label: "New Topic"
|
||||||
shared_draft:
|
shared_draft:
|
||||||
label: "Shared Draft"
|
label: "Shared Draft"
|
||||||
desc: "Draft a topic that will only be visible to staff"
|
desc: "Draft a topic that will only be visible to allowed users"
|
||||||
toggle_topic_bump:
|
toggle_topic_bump:
|
||||||
label: "Toggle topic bump"
|
label: "Toggle topic bump"
|
||||||
desc: "Reply without changing latest reply date"
|
desc: "Reply without changing latest reply date"
|
||||||
|
|
|
@ -2252,6 +2252,7 @@ en:
|
||||||
city_for_disputes: "City for Disputes"
|
city_for_disputes: "City for Disputes"
|
||||||
|
|
||||||
shared_drafts_category: "Enable the Shared Drafts feature by designating a category for topic drafts. Topics in this category will be suppressed from topic lists for staff users."
|
shared_drafts_category: "Enable the Shared Drafts feature by designating a category for topic drafts. Topics in this category will be suppressed from topic lists for staff users."
|
||||||
|
shared_drafts_min_trust_level: "Allow users to see and edit Shared Drafts."
|
||||||
|
|
||||||
push_notifications_prompt: "Display user consent prompt."
|
push_notifications_prompt: "Display user consent prompt."
|
||||||
push_notifications_icon: "The badge icon that appears in the notification corner. A 96×96 monochromatic PNG with transparency is recommended."
|
push_notifications_icon: "The badge icon that appears in the notification corner. A 96×96 monochromatic PNG with transparency is recommended."
|
||||||
|
|
|
@ -772,6 +772,9 @@ posting:
|
||||||
shared_drafts_category:
|
shared_drafts_category:
|
||||||
type: category
|
type: category
|
||||||
default: ""
|
default: ""
|
||||||
|
shared_drafts_min_trust_level:
|
||||||
|
default: "staff"
|
||||||
|
enum: "TrustLevelAndStaffSetting"
|
||||||
post_edit_time_limit:
|
post_edit_time_limit:
|
||||||
default: 1440
|
default: 1440
|
||||||
max: 10080
|
max: 10080
|
||||||
|
|
|
@ -139,6 +139,14 @@ module PostGuardian
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return true if (
|
||||||
|
can_see_post?(post) &&
|
||||||
|
can_create_post?(post.topic) &&
|
||||||
|
post.topic.category_id == SiteSetting.shared_drafts_category.to_i &&
|
||||||
|
can_see_category?(post.topic.category) &&
|
||||||
|
can_create_shared_draft?
|
||||||
|
)
|
||||||
|
|
||||||
if post.wiki && (@user.trust_level >= SiteSetting.min_trust_to_edit_wiki_post.to_i)
|
if post.wiki && (@user.trust_level >= SiteSetting.min_trust_to_edit_wiki_post.to_i)
|
||||||
return can_create_post?(post.topic)
|
return can_create_post?(post.topic)
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,7 +22,12 @@ module TopicGuardian
|
||||||
alias :can_moderate_topic? :can_review_topic?
|
alias :can_moderate_topic? :can_review_topic?
|
||||||
|
|
||||||
def can_create_shared_draft?
|
def can_create_shared_draft?
|
||||||
is_staff? && SiteSetting.shared_drafts_enabled?
|
return false unless SiteSetting.shared_drafts_enabled?
|
||||||
|
|
||||||
|
return is_admin? if SiteSetting.shared_drafts_min_trust_level.to_s == 'admin'
|
||||||
|
return is_staff? if SiteSetting.shared_drafts_min_trust_level.to_s == 'staff'
|
||||||
|
|
||||||
|
@user.has_trust_level?(SiteSetting.shared_drafts_min_trust_level.to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_create_whisper?
|
def can_create_whisper?
|
||||||
|
@ -34,7 +39,7 @@ module TopicGuardian
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_publish_topic?(topic, category)
|
def can_publish_topic?(topic, category)
|
||||||
is_staff? && can_see?(topic) && can_create_topic?(category)
|
can_create_shared_draft? && can_see?(topic) && can_create_topic_on_category?(category)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Creating Methods
|
# Creating Methods
|
||||||
|
@ -91,6 +96,16 @@ module TopicGuardian
|
||||||
return false if !can_create_topic_on_category?(topic.category)
|
return false if !can_create_topic_on_category?(topic.category)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Editing a shared draft.
|
||||||
|
return true if (
|
||||||
|
!topic.archived &&
|
||||||
|
!topic.private_message? &&
|
||||||
|
topic.category_id == SiteSetting.shared_drafts_category.to_i &&
|
||||||
|
can_see_category?(topic.category) &&
|
||||||
|
can_create_shared_draft? &&
|
||||||
|
can_create_post?(topic)
|
||||||
|
)
|
||||||
|
|
||||||
# TL4 users can edit archived topics, but can not edit private messages
|
# TL4 users can edit archived topics, but can not edit private messages
|
||||||
return true if (
|
return true if (
|
||||||
SiteSetting.trusted_users_can_edit_others? &&
|
SiteSetting.trusted_users_can_edit_others? &&
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe TopicGuardian do
|
||||||
|
fab!(:admin) { Fabricate(:admin) }
|
||||||
|
fab!(:tl3_user) { Fabricate(:leader) }
|
||||||
|
fab!(:moderator) { Fabricate(:moderator) }
|
||||||
|
fab!(:category) { Fabricate(:category) }
|
||||||
|
|
||||||
|
describe '#can_create_shared_draft?' do
|
||||||
|
it 'when shared_drafts are disabled' do
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = 'admin'
|
||||||
|
|
||||||
|
expect(Guardian.new(admin).can_create_shared_draft?).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'when user is a moderator and access is set to admin' do
|
||||||
|
SiteSetting.shared_drafts_category = category.id
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = 'admin'
|
||||||
|
|
||||||
|
expect(Guardian.new(moderator).can_create_shared_draft?).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'when user is a moderator and access is set to staff' do
|
||||||
|
SiteSetting.shared_drafts_category = category.id
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = 'staff'
|
||||||
|
|
||||||
|
expect(Guardian.new(moderator).can_create_shared_draft?).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'when user is TL3 and access is set to TL2' do
|
||||||
|
SiteSetting.shared_drafts_category = category.id
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = '2'
|
||||||
|
|
||||||
|
expect(Guardian.new(tl3_user).can_create_shared_draft?).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#can_edit_topic?' do
|
||||||
|
context 'when the topic is a shared draft' do
|
||||||
|
let(:tl2_user) { Fabricate(:user, trust_level: TrustLevel[2]) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
SiteSetting.shared_drafts_category = category.id
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = '2'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the topic is a PM' do
|
||||||
|
pm_with_draft = Fabricate(:private_message_topic, category: category)
|
||||||
|
Fabricate(:shared_draft, topic: pm_with_draft)
|
||||||
|
|
||||||
|
expect(Guardian.new(tl2_user).can_edit_topic?(pm_with_draft)).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the topic is archived' do
|
||||||
|
archived_topic = Fabricate(:topic, archived: true, category: category)
|
||||||
|
Fabricate(:shared_draft, topic: archived_topic)
|
||||||
|
|
||||||
|
expect(Guardian.new(tl2_user).can_edit_topic?(archived_topic)).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns true if a shared draft exists' do
|
||||||
|
topic = Fabricate(:topic, category: category)
|
||||||
|
Fabricate(:shared_draft, topic: topic)
|
||||||
|
|
||||||
|
expect(Guardian.new(tl2_user).can_edit_topic?(topic)).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the user has a lower trust level' do
|
||||||
|
tl1_user = Fabricate(:user, trust_level: TrustLevel[1])
|
||||||
|
topic = Fabricate(:topic, category: category)
|
||||||
|
Fabricate(:shared_draft, topic: topic)
|
||||||
|
|
||||||
|
expect(Guardian.new(tl1_user).can_edit_topic?(topic)).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns true if the shared_draft is from a different category' do
|
||||||
|
topic = Fabricate(:topic, category: Fabricate(:category))
|
||||||
|
Fabricate(:shared_draft, topic: topic)
|
||||||
|
|
||||||
|
expect(Guardian.new(tl2_user).can_edit_topic?(topic)).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -456,4 +456,31 @@ describe UserGuardian do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#can_edit_post?' do
|
||||||
|
fab!(:category) { Fabricate(:category) }
|
||||||
|
|
||||||
|
let(:topic) { Fabricate(:topic, category: category) }
|
||||||
|
let(:post_with_draft) { Fabricate(:post, topic: topic) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
SiteSetting.shared_drafts_category = category.id
|
||||||
|
SiteSetting.shared_drafts_min_trust_level = '2'
|
||||||
|
Fabricate(:shared_draft, topic: topic)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns true if a shared draft exists' do
|
||||||
|
expect(Guardian.new(trust_level_2).can_edit_post?(post_with_draft)).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the user has a lower trust level' do
|
||||||
|
expect(Guardian.new(trust_level_1).can_edit_post?(post_with_draft)).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns false if the draft is from a different category' do
|
||||||
|
topic.update!(category: Fabricate(:category))
|
||||||
|
|
||||||
|
expect(Guardian.new(trust_level_2).can_edit_post?(post_with_draft)).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue