mirror of
https://github.com/discourse/discourse.git
synced 2025-03-23 06:05:40 +08:00
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:
parent
cde42c3f69
commit
76bc173d47
@ -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
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -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."
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
|
});
|
||||||
|
});
|
@ -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 });
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user