mirror of
https://github.com/discourse/discourse.git
synced 2025-03-23 05:45:42 +08:00
Merge pull request #4675 from tgxworld/fix_polls_forever_broken_if_approval_required
FIX: Polls permanently broken if post requires approval.
This commit is contained in:
commit
112ca20c96
@ -78,7 +78,7 @@ class QueuedPost < ActiveRecord::Base
|
|||||||
# Do sidekiq work outside of the transaction
|
# Do sidekiq work outside of the transaction
|
||||||
creator.enqueue_jobs
|
creator.enqueue_jobs
|
||||||
|
|
||||||
DiscourseEvent.trigger(:approved_post, self)
|
DiscourseEvent.trigger(:approved_post, self, created_post)
|
||||||
created_post
|
created_post
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -295,11 +295,11 @@ after_initialize do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
validate(:post, :validate_polls) do
|
validate(:post, :validate_polls) do |force=nil|
|
||||||
return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?)
|
return if !SiteSetting.poll_enabled? && (self.user && !self.user.staff?)
|
||||||
|
|
||||||
# only care when raw has changed!
|
# only care when raw has changed!
|
||||||
return unless self.raw_changed?
|
return unless self.raw_changed? || force
|
||||||
|
|
||||||
validator = DiscoursePoll::PollsValidator.new(self)
|
validator = DiscoursePoll::PollsValidator.new(self)
|
||||||
return unless (polls = validator.validate_polls)
|
return unless (polls = validator.validate_polls)
|
||||||
@ -316,6 +316,29 @@ after_initialize do
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
NewPostManager.add_handler(1) do |manager|
|
||||||
|
post = Post.new(raw: manager.args[:raw])
|
||||||
|
|
||||||
|
if !DiscoursePoll::PollsValidator.new(post).validate_polls
|
||||||
|
result = NewPostResult.new(:poll, false)
|
||||||
|
|
||||||
|
post.errors.full_messages.each do |message|
|
||||||
|
result.errors[:base] << message
|
||||||
|
end
|
||||||
|
|
||||||
|
result
|
||||||
|
else
|
||||||
|
manager.args["is_poll"] = true
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
on(:approved_post) do |queued_post, created_post|
|
||||||
|
if queued_post.post_options["is_poll"]
|
||||||
|
created_post.validate_polls(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Post.register_custom_field_type(DiscoursePoll::POLLS_CUSTOM_FIELD, :json)
|
Post.register_custom_field_type(DiscoursePoll::POLLS_CUSTOM_FIELD, :json)
|
||||||
Post.register_custom_field_type(DiscoursePoll::VOTES_CUSTOM_FIELD, :json)
|
Post.register_custom_field_type(DiscoursePoll::VOTES_CUSTOM_FIELD, :json)
|
||||||
|
|
||||||
|
35
plugins/poll/spec/lib/new_post_manager_spec.rb
Normal file
35
plugins/poll/spec/lib/new_post_manager_spec.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe NewPostManager do
|
||||||
|
let(:user) { Fabricate(:newuser) }
|
||||||
|
let(:admin) { Fabricate(:admin) }
|
||||||
|
|
||||||
|
describe 'when new post containing a poll is queued for approval' do
|
||||||
|
it 'should render the poll upon approval' do
|
||||||
|
params = {
|
||||||
|
raw: "[poll]\n* 1\n* 2\n* 3\n[/poll]",
|
||||||
|
archetype: "regular",
|
||||||
|
category: "",
|
||||||
|
typing_duration_msecs: "2700",
|
||||||
|
composer_open_duration_msecs: "12556",
|
||||||
|
visible: true,
|
||||||
|
image_sizes: nil,
|
||||||
|
is_warning: false,
|
||||||
|
title: "This is a test post with a poll",
|
||||||
|
ip_address: "127.0.0.1",
|
||||||
|
user_agent: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
|
||||||
|
referrer: "http://localhost:3000/",
|
||||||
|
first_post_checks: true
|
||||||
|
}
|
||||||
|
|
||||||
|
expect { NewPostManager.new(user, params).perform }
|
||||||
|
.to change { QueuedPost.count }.by(1)
|
||||||
|
|
||||||
|
queued_post = QueuedPost.last
|
||||||
|
queued_post.approve!(admin)
|
||||||
|
|
||||||
|
expect(Post.last.custom_fields[DiscoursePoll::POLLS_CUSTOM_FIELD])
|
||||||
|
.to_not eq(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user