From 63cbe2f7c115e5602cd8f73bbc2f9029b8e38759 Mon Sep 17 00:00:00 2001 From: Manuel Lucena Date: Tue, 3 Oct 2017 18:25:22 +0200 Subject: [PATCH] 20171003 - [WIP] Functionality and tests for polls comments --- app/controllers/polls_controller.rb | 5 + app/helpers/flags_helper.rb | 2 +- app/models/comment.rb | 2 +- app/models/comment_notifier.rb | 1 + app/models/poll.rb | 5 +- app/views/polls/questions/show.html.erb | 92 +++++++++++++++++++ app/views/polls/show.html.erb | 6 +- app/views/shared/_comments.html.erb | 31 +++++++ ...71003143034_add_comments_count_to_polls.rb | 7 ++ db/schema.rb | 3 + spec/features/polls/polls_spec.rb | 33 +++++++ 11 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 app/views/polls/questions/show.html.erb create mode 100644 app/views/shared/_comments.html.erb create mode 100644 db/migrate/20171003143034_add_comments_count_to_polls.rb 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? %> +
+
+ +
+
+ +<% end %> + +
+
+

<%= t('poll_questions.show.more_info') %>

+ <%= @question.description %> +
+
+ +
+ <%= render "polls/questions/filter_subnav" %> + +
+ <%= render "shared/comments" %> +
+ +
+ <%= 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 %> - + + +
+ <%= render "shared/comments" %> +
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 %> +
+
+
+

+ <%= 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 %> +
+ +
+ <%= t("shared.comments.login_to_comment", + signin: link_to(t("votes.signin"), new_user_session_path), + signup: link_to(t("votes.signup"), new_user_registration_path)).html_safe %> +
+ <% end %> + + <% @comment_tree.root_comments.each do |comment| %> + <%= render 'comments/comment', comment: comment %> + <% end %> + <%= paginate @comment_tree.root_comments %> +
+
+
+<% 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