diff --git a/plugins/poll/config/locales/server.en.yml b/plugins/poll/config/locales/server.en.yml index d3716baa435..6ae0bea3c42 100644 --- a/plugins/poll/config/locales/server.en.yml +++ b/plugins/poll/config/locales/server.en.yml @@ -18,6 +18,7 @@ en: site_settings: poll_enabled: "Allow users to create polls?" 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: multiple_polls_without_name: "There are multiple polls without a name. Use the 'name' attribute to uniquely identify your polls." @@ -44,9 +45,10 @@ en: default_cannot_be_made_public: "Poll with votes cannot be made public." named_cannot_be_made_public: "Poll named %{name} has votes cannot be made public." - cannot_change_polls_after_5_minutes: "You cannot add, remove or rename polls after the first 5 minutes." - op_cannot_edit_options_after_5_minutes: "You cannot add or remove poll options after the first 5 minutes. Please contact a moderator if you need to edit a poll option." - staff_cannot_add_or_remove_options_after_5_minutes: "You cannot add or remove poll options after the first 5 minutes. You should close this topic and create a new one instead." + edit_window_expired: + cannot_change_polls: "You cannot add, remove or rename polls after the first %{minutes} minutes." + op_cannot_edit_options: "You cannot add or remove poll options after the first %{minutes} minutes. Please contact a moderator if you need to edit a poll option." + staff_cannot_add_or_remove_options: "You cannot add or remove poll options after the first %{minutes} minutes. You should close this topic and create a new one instead." no_polls_associated_with_this_post: "No polls are associated with this post." no_poll_with_this_name: "No poll named %{name} associated with this post." diff --git a/plugins/poll/config/settings.yml b/plugins/poll/config/settings.yml index 2d01ba6b884..04bf21f5e99 100644 --- a/plugins/poll/config/settings.yml +++ b/plugins/poll/config/settings.yml @@ -5,3 +5,5 @@ plugins: poll_maximum_options: default: 20 client: true + poll_edit_window_mins: + default: 5 diff --git a/plugins/poll/lib/polls_updater.rb b/plugins/poll/lib/polls_updater.rb index df3b22432d9..42d67f219d7 100644 --- a/plugins/poll/lib/polls_updater.rb +++ b/plugins/poll/lib/polls_updater.rb @@ -14,11 +14,16 @@ module DiscoursePoll if polls_updated?(polls, previous_polls) || (current_option_ids != previous_option_ids) has_votes = total_votes(previous_polls) > 0 - # outside of the 5-minute edit window? - if post.created_at < 5.minutes.ago && has_votes + # outside of the edit window? + poll_edit_window_mins = SiteSetting.poll_edit_window_mins + + if post.created_at < poll_edit_window_mins.minutes.ago && has_votes # cannot add/remove/rename polls if polls.keys.sort != previous_polls.keys.sort - post.errors.add(:base, I18n.t("poll.cannot_change_polls_after_5_minutes")) + post.errors.add(:base, I18n.t( + "poll.edit_window_expired.cannot_change_polls", minutes: poll_edit_window_mins + )) + return end @@ -27,13 +32,21 @@ module DiscoursePoll # staff can only edit options polls.each_key do |poll_name| if polls[poll_name]["options"].size != previous_polls[poll_name]["options"].size && previous_polls[poll_name]["voters"].to_i > 0 - post.errors.add(:base, I18n.t("poll.staff_cannot_add_or_remove_options_after_5_minutes")) + post.errors.add(:base, I18n.t( + "poll.edit_window_expired.staff_cannot_add_or_remove_options", + minutes: poll_edit_window_mins + )) + return end end else # OP cannot edit poll options - post.errors.add(:base, I18n.t("poll.op_cannot_edit_options_after_5_minutes")) + post.errors.add(:base, I18n.t( + "poll.edit_window_expired.op_cannot_edit_options", + minutes: poll_edit_window_mins + )) + return end end diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb index a79ea44e719..d5bf98b157b 100644 --- a/plugins/poll/spec/controllers/posts_controller_spec.rb +++ b/plugins/poll/spec/controllers/posts_controller_spec.rb @@ -114,7 +114,7 @@ describe PostsController do end - describe "after the first 5 minutes" do + describe "after the poll edit window has expired" do let(:poll) { "[poll]\n- A\n- B[/poll]" } let(:new_option) { "[poll]\n- A\n- C[/poll]" } @@ -127,6 +127,12 @@ describe PostsController do end end + let(:poll_edit_window_mins) { 6 } + + before do + SiteSetting.poll_edit_window_mins = poll_edit_window_mins + end + describe "with no vote" do it "OP can change the options" do @@ -163,7 +169,10 @@ describe PostsController do xhr :put, :update, { id: post_id, post: { raw: new_option } } expect(response).not_to be_success json = ::JSON.parse(response.body) - expect(json["errors"][0]).to eq(I18n.t("poll.op_cannot_edit_options_after_5_minutes")) + expect(json["errors"][0]).to eq(I18n.t( + "poll.edit_window_expired.op_cannot_edit_options", + minutes: poll_edit_window_mins + )) end it "staff can change the options and votes are merged" do diff --git a/plugins/poll/spec/lib/polls_updater_spec.rb b/plugins/poll/spec/lib/polls_updater_spec.rb index 1e07cf8fe66..4210b12d5e7 100644 --- a/plugins/poll/spec/lib/polls_updater_spec.rb +++ b/plugins/poll/spec/lib/polls_updater_spec.rb @@ -217,12 +217,14 @@ describe DiscoursePoll::PollsUpdater do end end - describe "when post has been created more than 5 minutes ago" do - let(:another_post) { Fabricate(:post, created_at: Time.zone.now - 5.minutes) } + describe "when poll edit window has expired" do + let(:poll_edit_window_mins) { 6 } + let(:another_post) { Fabricate(:post, created_at: Time.zone.now - poll_edit_window_mins.minutes) } before do polls.each { |key, value| value["voters"] = 2 } described_class.update(another_post, polls) + SiteSetting.poll_edit_window_mins = poll_edit_window_mins end it "should not allow new polls to be added" do @@ -231,8 +233,9 @@ describe DiscoursePoll::PollsUpdater do end expect(another_post.errors[:base]).to include(I18n.t( - "poll.cannot_change_polls_after_5_minutes") - ) + "poll.edit_window_expired.cannot_change_polls", + minutes: poll_edit_window_mins + )) expect(messages).to eq([]) end @@ -243,7 +246,8 @@ describe DiscoursePoll::PollsUpdater do end expect(another_post.errors[:base]).to include(I18n.t( - "poll.op_cannot_edit_options_after_5_minutes" + "poll.edit_window_expired.op_cannot_edit_options", + minutes: poll_edit_window_mins )) expect(messages).to eq([]) @@ -258,7 +262,8 @@ describe DiscoursePoll::PollsUpdater do end expect(another_post.errors[:base]).to include(I18n.t( - "poll.staff_cannot_add_or_remove_options_after_5_minutes" + "poll.edit_window_expired.staff_cannot_add_or_remove_options", + minutes: poll_edit_window_mins )) expect(messages).to eq([])