FEATURE: adds poll_allow_staff_to_create

This setting will bypass poll_minimum_trust_level_to_create if set to true
This commit is contained in:
Joffrey JAFFEUX 2017-12-04 18:12:17 +01:00 committed by GitHub
parent cde42c3f69
commit 76bc173d47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 96 additions and 19 deletions

View File

@ -4,13 +4,16 @@ import showModal from 'discourse/lib/show-modal';
function initializePollUIBuilder(api) { function initializePollUIBuilder(api) {
api.modifyClass('controller:composer', { api.modifyClass('controller:composer', {
@computed('siteSettings.poll_enabled', 'siteSettings.poll_minimum_trust_level_to_create') @computed('siteSettings.poll_enabled',
canBuildPoll(pollEnabled, minimumTrustLevelToCreate) { 'siteSettings.poll_minimum_trust_level_to_create',
'siteSettings.poll_allow_staff_to_create')
canBuildPoll(pollEnabled, minimumTrustLevel, allowStaff) {
return pollEnabled && return pollEnabled &&
this.currentUser && this.currentUser &&
( (
this.currentUser.admin || this.currentUser.admin ||
this.currentUser.trust_level >= minimumTrustLevelToCreate (this.currentUser.staff && allowStaff) ||
this.currentUser.trust_level >= minimumTrustLevel
); );
}, },

View File

@ -19,7 +19,8 @@ en:
poll_enabled: "Allow polls?" poll_enabled: "Allow polls?"
poll_maximum_options: "Maximum number of options allowed in a poll." poll_maximum_options: "Maximum number of options allowed in a poll."
poll_edit_window_mins: "Number of minutes after post creation during which polls can be edited." poll_edit_window_mins: "Number of minutes after post creation during which polls can be edited."
poll_minimum_trust_level_to_create: "Define the minimum trust level needed to create polls" poll_minimum_trust_level_to_create: "Define the minimum trust level needed to create polls."
poll_allow_staff_to_create: "Allow staff to create polls, regardless of their trust level."
poll: poll:
multiple_polls_without_name: "There are multiple polls without a name. Use the '<code>name</code>' attribute to uniquely identify your polls." multiple_polls_without_name: "There are multiple polls without a name. Use the '<code>name</code>' attribute to uniquely identify your polls."
@ -62,7 +63,7 @@ en:
topic_must_be_open_to_toggle_status: "The topic must be open to toggle status." topic_must_be_open_to_toggle_status: "The topic must be open to toggle status."
only_staff_or_op_can_toggle_status: "Only a staff member or the original poster can toggle a poll status." only_staff_or_op_can_toggle_status: "Only a staff member or the original poster can toggle a poll status."
insufficient_trust_level_to_create: "Your trust level (%{current}) is insufficient to create polls (required: %{required})" insufficient_rights_to_create: "You are not allowed to create polls."
email: email:
link_to_poll: "Click to view the poll." link_to_poll: "Click to view the poll."

View File

@ -11,3 +11,6 @@ plugins:
default: 1 default: 1
client: true client: true
enum: 'TrustLevelSetting' enum: 'TrustLevelSetting'
poll_allow_staff_to_create:
default: true
client: true

View File

@ -6,14 +6,13 @@ module DiscoursePoll
def validate_post def validate_post
min_trust_level = SiteSetting.poll_minimum_trust_level_to_create min_trust_level = SiteSetting.poll_minimum_trust_level_to_create
staff_allowed = SiteSetting.poll_allow_staff_to_create
trusted = @post&.user&.admin || trusted = @post&.user&.admin ||
(@post&.user&.staff? && staff_allowed) ||
@post&.user&.trust_level >= TrustLevel[min_trust_level] @post&.user&.trust_level >= TrustLevel[min_trust_level]
if !trusted if !trusted
message = I18n.t("poll.insufficient_trust_level_to_create", message = I18n.t("poll.insufficient_rights_to_create")
current: @post&.user&.trust_level,
required: min_trust_level
)
@post.errors.add(:base, message) @post.errors.add(:base, message)
return false return false

View File

@ -352,7 +352,7 @@ describe PostsController do
end end
end end
describe "insufficient trust level" do describe "regular user with insufficient trust level" do
before do before do
SiteSetting.poll_minimum_trust_level_to_create = 2 SiteSetting.poll_minimum_trust_level_to_create = 2
end end
@ -366,16 +366,11 @@ describe PostsController do
expect(response).not_to be_success expect(response).not_to be_success
json = ::JSON.parse(response.body) json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq( expect(json["errors"][0]).to eq(I18n.t("poll.insufficient_rights_to_create"))
I18n.t("poll.insufficient_trust_level_to_create",
current: user.trust_level,
required: SiteSetting.poll_minimum_trust_level_to_create
)
)
end end
end end
describe "equal trust level" do describe "regular user with equal trust level" do
before do before do
SiteSetting.poll_minimum_trust_level_to_create = 2 SiteSetting.poll_minimum_trust_level_to_create = 2
end end
@ -394,7 +389,7 @@ describe PostsController do
end end
end end
describe "superior trust level" do describe "regular user with superior trust level" do
before do before do
SiteSetting.poll_minimum_trust_level_to_create = 2 SiteSetting.poll_minimum_trust_level_to_create = 2
end end
@ -413,7 +408,6 @@ describe PostsController do
end end
end end
describe "admin with insufficient trust level" do describe "admin with insufficient trust level" do
before do before do
SiteSetting.poll_minimum_trust_level_to_create = 2 SiteSetting.poll_minimum_trust_level_to_create = 2
@ -432,4 +426,47 @@ describe PostsController do
expect(json["polls"]["poll"]).to be expect(json["polls"]["poll"]).to be
end end
end end
describe "staff" do
before do
SiteSetting.poll_minimum_trust_level_to_create = 4
end
describe "allow staff enabled" do
before do
SiteSetting.poll_allow_staff_to_create = true
end
it "validates the post" do
log_in_user(Fabricate(:user, moderator: true, trust_level: 1))
post :create, params: {
title: title, raw: "[poll]\n- A\n- B\n[/poll]"
}, format: :json
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json["cooked"]).to match("data-poll-")
expect(json["polls"]["poll"]).to be
end
end
describe "allow staff disabled" do
before do
SiteSetting.poll_allow_staff_to_create = false
end
it "invalidates the post" do
log_in_user(Fabricate(:user, moderator: true, trust_level: 1))
post :create, params: {
title: title, raw: "[poll]\n- A\n- B\n[/poll]"
}, format: :json
expect(response).not_to be_success
json = ::JSON.parse(response.body)
expect(json["errors"][0]).to eq(I18n.t("poll.insufficient_rights_to_create"))
end
end
end
end end

View File

@ -0,0 +1,22 @@
import { acceptance } from "helpers/qunit-helpers";
import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button";
import { replaceCurrentUser } from "discourse/plugins/poll/helpers/replace-current-user";
acceptance("Poll Builder - allow staff", {
loggedIn: true,
settings: {
poll_enabled: true,
poll_allow_staff_to_create: true,
poll_minimum_trust_level_to_create: 4
}
});
test("staff", (assert) => {
replaceCurrentUser({ staff: true, trust_level: 3 });
displayPollBuilderButton();
andThen(() => {
assert.ok(exists("button[title='Build Poll']"), "it shows the builder button");
});
});

View File

@ -6,6 +6,7 @@ acceptance("Poll Builder - polls are enabled", {
loggedIn: true, loggedIn: true,
settings: { settings: {
poll_enabled: true, poll_enabled: true,
poll_allow_staff_to_create: false,
poll_minimum_trust_level_to_create: 1 poll_minimum_trust_level_to_create: 1
} }
}); });
@ -30,6 +31,17 @@ test("insufficient trust level", (assert) => {
}); });
}); });
test("staff with insufficient trust level", (assert) => {
replaceCurrentUser({ admin: false, staff: true, trust_level: 0 });
displayPollBuilderButton();
andThen(() => {
assert.ok(!exists("button[title='Build Poll']"), "it hides the builder button");
});
});
test("admin with insufficient trust level", (assert) => { test("admin with insufficient trust level", (assert) => {
replaceCurrentUser({ admin: true, trust_level: 0 }); replaceCurrentUser({ admin: true, trust_level: 0 });