diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb
index 41a038b46..289a33be3 100644
--- a/app/controllers/polls_controller.rb
+++ b/app/controllers/polls_controller.rb
@@ -1,8 +1,10 @@
class PollsController < ApplicationController
+ include CommentableActions
load_and_authorize_resource
has_filters %w{current expired incoming}
+ has_orders %w{most_voted newest oldest}, only: :show
::Poll::Answer # trigger autoload
@@ -13,6 +15,9 @@ class PollsController < ApplicationController
def show
@questions = @poll.questions.for_render.sort_for_list
+ @commentable = @poll
+ @comment_tree = CommentTree.new(@commentable, params[:page], @current_order)
+
@answers_by_question_id = {}
poll_answers = ::Poll::Answer.by_question(@poll.question_ids).by_author(current_user.try(:id))
poll_answers.each do |answer|
diff --git a/app/helpers/flags_helper.rb b/app/helpers/flags_helper.rb
index b5ba67f41..9983b34ae 100644
--- a/app/helpers/flags_helper.rb
+++ b/app/helpers/flags_helper.rb
@@ -12,7 +12,7 @@ module FlagsHelper
def flagged?(flaggable)
if flaggable.is_a? Comment
- @comment_flags[flaggable.id]
+ @comment_flags[flaggable.id] unless flaggable.commentable_type == "Poll"
else
Flag.flagged?(current_user, flaggable)
end
diff --git a/app/models/comment.rb b/app/models/comment.rb
index 8b68e11ad..37fa9b630 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -3,7 +3,7 @@ class Comment < ActiveRecord::Base
include HasPublicAuthor
include Graphqlable
- COMMENTABLE_TYPES = %w(Debate Proposal Budget::Investment Poll::Question Legislation::Question Legislation::Annotation Topic).freeze
+ COMMENTABLE_TYPES = %w(Debate Proposal Budget::Investment Poll::Question Legislation::Question Legislation::Annotation Topic Poll).freeze
acts_as_paranoid column: :hidden_at
include ActsAsParanoidAliases
diff --git a/app/models/comment_notifier.rb b/app/models/comment_notifier.rb
index 68b350e6b..600009a23 100644
--- a/app/models/comment_notifier.rb
+++ b/app/models/comment_notifier.rb
@@ -22,6 +22,7 @@ class CommentNotifier
end
def email_on_comment?
+ return false if @comment.commentable.is_a?(Poll)
commentable_author = @comment.commentable.author
commentable_author != @author && commentable_author.email_on_comment?
end
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 84349bf0b..60b6d1406 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -1,6 +1,7 @@
class Poll < ActiveRecord::Base
include Imageable
-
+ acts_as_paranoid column: :hidden_at
+ include ActsAsParanoidAliases
has_many :booth_assignments, class_name: "Poll::BoothAssignment"
has_many :booths, through: :booth_assignments
has_many :partial_results, through: :booth_assignments
@@ -9,8 +10,10 @@ class Poll < ActiveRecord::Base
has_many :officer_assignments, through: :booth_assignments
has_many :officers, through: :officer_assignments
has_many :questions
+ has_many :comments, as: :commentable
has_and_belongs_to_many :geozones
+ belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
validates :name, presence: true
diff --git a/app/views/polls/questions/show.html.erb b/app/views/polls/questions/show.html.erb
new file mode 100644
index 000000000..f8d12c59d
--- /dev/null
+++ b/app/views/polls/questions/show.html.erb
@@ -0,0 +1,92 @@
+<% provide :title do %><%= @question.title %><% end %>
+
+
+
+
+ <%= back_link_to %>
+
+
<%= @question.title %>
+
+ <% if @question.proposal.present? %>
+
+ <%= link_to t('poll_questions.show.original_proposal'), @question.proposal %>
+
+ <% end %>
+
+ <% if can? :answer, @question %>
+ <%= link_to t('poll_questions.show.answer_this_question'),
+ @question.poll,
+ class: 'large button' %>
+ <% else %>
+ <%= render 'polls/reasons_for_not_answering', poll: @question.poll %>
+ <% end %>
+
+
+
+
+
+ <%= t('poll_questions.show.author') %>
+
+
+ <% if @question.author_visible_name.present? %>
+ <%= @question.author_visible_name %>
+ <% else %>
+ <%= link_to @question.author.name, @question.author %>
+ <% end %>
+
+
+
+
+
+ <%= t('poll_questions.show.poll') %>
+
+
+ <%= link_to @question.poll.name, @question.poll %>
+
+
+
+
+ <%= t('poll_questions.show.dates_title') %>
+
+
+ <%= poll_dates(@question.poll) %>
+
+
+
+
+
+<% if @question.video_url.present? %>
+
+
+
+
+
+ <%= t('proposals.show.title_video_url') %>
+
+ <%= text_with_links @question.video_url %>
+
+
+
+
+<% end %>
+
+
+
+
<%= t('poll_questions.show.more_info') %>
+ <%= @question.description %>
+
+
+
+
+ <%= render "polls/questions/filter_subnav" %>
+
+
+
+
+ <%= render 'documents/documents',
+ documents: @question.documents,
+ max_documents_allowed: Poll::Question.max_documents_allowed %>
+
+
diff --git a/app/views/polls/show.html.erb b/app/views/polls/show.html.erb
index b632fac55..ae334568c 100644
--- a/app/views/polls/show.html.erb
+++ b/app/views/polls/show.html.erb
@@ -79,6 +79,10 @@
<% end %>
-
+
+
+
diff --git a/app/views/shared/_comments.html.erb b/app/views/shared/_comments.html.erb
new file mode 100644
index 000000000..db097a7c4
--- /dev/null
+++ b/app/views/shared/_comments.html.erb
@@ -0,0 +1,31 @@
+<% cache [locale_and_user_status, @current_order, commentable_cache_key(@commentable), @comment_tree.comments, @comment_tree.comment_authors, @commentable.comments_count, @comment_flags] do %>
+
+<% end %>
diff --git a/db/migrate/20171003143034_add_comments_count_to_polls.rb b/db/migrate/20171003143034_add_comments_count_to_polls.rb
new file mode 100644
index 000000000..675acae3f
--- /dev/null
+++ b/db/migrate/20171003143034_add_comments_count_to_polls.rb
@@ -0,0 +1,7 @@
+class AddCommentsCountToPolls < ActiveRecord::Migration
+ def change
+ add_column :polls, :comments_count, :integer, default: 0
+ add_column :polls, :author_id, :integer
+ add_column :polls, :hidden_at, :datetime
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index dbbd3ec46..d393716e6 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -792,6 +792,9 @@ ActiveRecord::Schema.define(version: 20171004151553) do
t.boolean "geozone_restricted", default: false
t.text "summary"
t.text "description"
+ t.integer "comments_count", default: 0
+ t.integer "author_id"
+ t.datetime "hidden_at"
end
add_index "polls", ["starts_at", "ends_at"], name: "index_polls_on_starts_at_and_ends_at", using: :btree
diff --git a/spec/features/polls/polls_spec.rb b/spec/features/polls/polls_spec.rb
index 22b90740a..1c18e752d 100644
--- a/spec/features/polls/polls_spec.rb
+++ b/spec/features/polls/polls_spec.rb
@@ -256,5 +256,38 @@ feature 'Polls' do
expect(page).to have_link('Han Solo')
end
+ scenario 'User can write comments' do
+ create(:comment, commentable: poll)
+
+ visit poll_path(poll)
+
+ expect(page).to have_css('.comment', count: 1)
+
+ comment = Comment.last
+ within first('.comment') do
+ expect(page).to have_content comment.user.name
+ expect(page).to have_content I18n.l(comment.created_at, format: :datetime)
+ expect(page).to have_content comment.body
+ end
+ end
+
+ scenario 'user can reply to comment' do
+ oliver = create(:user, username: 'Oliver Atom')
+ benji = create(:user, username: 'Benji Prince')
+ create(:comment, commentable: poll, user: oliver)
+
+ login_as(oliver)
+ visit poll_path(poll)
+
+ expect(page).to have_content oliver.username
+ end
+
+ scenario 'user can upvote a comment' do
+
+ end
+
+ scenario 'user can downvote a comment' do
+
+ end
end
end
+ <%= t("shared.comments.title") %> + (<%= @commentable.comments_count %>) +
+ + <%= render 'shared/wide_order_selector', i18n_namespace: "comments" %> + + <% if user_signed_in? %> + <%= render 'comments/form', {commentable: @commentable, parent_id: nil, toggeable: false} %> + <% else %> ++ +