From 0a708ba0646524f760e8f950e34ac33b4ad1ef5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 27 Feb 2019 17:00:21 +0100 Subject: [PATCH] FIX: preload poll voters --- .../poll/app/serializers/poll_serializer.rb | 11 +++++++++- .../javascripts/widgets/discourse-poll.js.es6 | 5 +++-- plugins/poll/plugin.rb | 20 +++++++++++-------- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/plugins/poll/app/serializers/poll_serializer.rb b/plugins/poll/app/serializers/poll_serializer.rb index fb8cd269a86..2048f6bcaa0 100644 --- a/plugins/poll/app/serializers/poll_serializer.rb +++ b/plugins/poll/app/serializers/poll_serializer.rb @@ -9,7 +9,8 @@ class PollSerializer < ApplicationSerializer :step, :options, :voters, - :close + :close, + :preloaded_voters def public true @@ -47,4 +48,12 @@ class PollSerializer < ApplicationSerializer object.close_at.present? end + def preloaded_voters + DiscoursePoll::Poll.serialized_voters(object) + end + + def include_preloaded_voters? + object.can_see_voters?(scope) + end + end diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index 9d74877adc2..39d4d16049b 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -120,6 +120,7 @@ createWidget("discourse-poll-voters", { : result.voters[attrs.optionId]; const existingVoters = new Set(state.voters.map(voter => voter.username)); + newVoters.forEach(voter => { if (!existingVoters.has(voter.username)) { existingVoters.add(voter.username); @@ -202,8 +203,8 @@ createWidget("discourse-poll-standard-results", { }); if (isPublic && !state.loaded) { + state.voters = poll.get("preloaded_voters"); state.loaded = true; - this.fetchVoters(); } const percentages = @@ -290,8 +291,8 @@ createWidget("discourse-poll-number-results", { if (poll.get("public")) { if (!state.loaded) { + state.voters = poll.get("preloaded_voters"); state.loaded = true; - this.fetchVoters(); } contents.push( diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index b0bc4cd56d5..20de8e64b8d 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -149,13 +149,7 @@ after_initialize do end end - def voters(post_id, poll_name, user, opts = {}) - post = Post.find_by(id: post_id) - raise Discourse::InvalidParameters.new("post_id is invalid") unless post - - poll = Poll.find_by(post_id: post_id, name: poll_name) - raise Discourse::InvalidParameters.new("poll_name is invalid") unless poll&.can_see_voters?(user) - + def serialized_voters(poll, opts = {}) limit = (opts["limit"] || 25).to_i limit = 0 if limit < 0 limit = 50 if limit > 50 @@ -208,7 +202,7 @@ after_initialize do WHERE row BETWEEN #{offset} AND #{offset + limit} SQL - user_ids = votes.map { |v| v.user_id }.to_set + user_ids = votes.map(&:user_id).uniq user_hashes = User .where(id: user_ids) @@ -225,6 +219,16 @@ after_initialize do result end + def voters(post_id, poll_name, user, opts = {}) + post = Post.find_by(id: post_id) + raise Discourse::InvalidParameters.new("post_id is invalid") unless post + + poll = Poll.find_by(post_id: post_id, name: poll_name) + raise Discourse::InvalidParameters.new("poll_name is invalid") unless poll&.can_see_voters?(user) + + serialized_voters(poll, opts) + end + def schedule_jobs(post) Poll.where(post: post).find_each do |poll| job_args = {