From 5eeaa7d1893af58ac8d3a3ee988e69b1e33f2722 Mon Sep 17 00:00:00 2001 From: kikito Date: Sat, 22 Aug 2015 23:20:55 +0200 Subject: [PATCH] implements /moderation/debates --- .../moderation/comments_controller.rb | 20 ++-- .../moderation/debates_controller.rb | 38 +++++- app/models/debate.rb | 5 + app/views/moderation/comments/index.html.erb | 10 +- app/views/moderation/debates/index.html.erb | 48 ++++++++ config/locales/moderation.en.yml | 27 ++++- config/locales/moderation.es.yml | 27 ++++- spec/features/moderation/debates_spec.rb | 111 +++++++++++++++++- 8 files changed, 258 insertions(+), 28 deletions(-) create mode 100644 app/views/moderation/debates/index.html.erb diff --git a/app/controllers/moderation/comments_controller.rb b/app/controllers/moderation/comments_controller.rb index e44021e72..03667e286 100644 --- a/app/controllers/moderation/comments_controller.rb +++ b/app/controllers/moderation/comments_controller.rb @@ -26,17 +26,17 @@ class Moderation::CommentsController < Moderation::BaseController private - def load_comments - @comments = Comment.accessible_by(current_ability, :hide).flagged_as_inappropiate.sorted_for_moderation.includes(:commentable) - end + def load_comments + @comments = Comment.accessible_by(current_ability, :hide).flagged_as_inappropiate.sorted_for_moderation.includes(:commentable) + end - def set_valid_filters - @valid_filters = %w{all pending_review reviewed} - end + def set_valid_filters + @valid_filters = %w{all pending_review reviewed} + end - def parse_filter - @filter = params[:filter] - @filter = 'all' unless @valid_filters.include?(@filter) - end + def parse_filter + @filter = params[:filter] + @filter = 'all' unless @valid_filters.include?(@filter) + end end diff --git a/app/controllers/moderation/debates_controller.rb b/app/controllers/moderation/debates_controller.rb index 622116765..22e4eac6b 100644 --- a/app/controllers/moderation/debates_controller.rb +++ b/app/controllers/moderation/debates_controller.rb @@ -1,8 +1,42 @@ class Moderation::DebatesController < Moderation::BaseController + before_filter :set_valid_filters, only: :index + before_filter :parse_filter, only: :index + before_filter :load_debates, only: :index + + load_and_authorize_resource + + def index + @debates = @debates.send(@filter) + @debates = @debates.page(params[:page]) + end def hide - @debate = Debate.find(params[:id]) @debate.hide end -end \ No newline at end of file + def hide_in_moderation_screen + @debate.hide + redirect_to request.query_parameters.merge(action: :index) + end + + def mark_as_reviewed + @debate.mark_as_reviewed + redirect_to request.query_parameters.merge(action: :index) + end + + private + + def load_debates + @debates = Debate.accessible_by(current_ability, :hide).flagged_as_inappropiate.sorted_for_moderation + end + + def set_valid_filters + @valid_filters = %w{all pending_review reviewed} + end + + def parse_filter + @filter = params[:filter] + @filter = 'all' unless @valid_filters.include?(@filter) + end + +end diff --git a/app/models/debate.rb b/app/models/debate.rb index 042c334c7..c16048f70 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -23,6 +23,11 @@ class Debate < ActiveRecord::Base before_validation :sanitize_description before_validation :sanitize_tag_list + scope :sorted_for_moderation, -> { order(inappropiate_flags_count: :desc, updated_at: :desc) } + scope :pending_review, -> { where(reviewed_at: nil, hidden_at: nil) } + scope :reviewed, -> { where("reviewed_at IS NOT NULL AND hidden_at IS NULL") } + scope :flagged_as_inappropiate, -> { where("inappropiate_flags_count > 0") } + # Ahoy setup visitable # Ahoy will automatically assign visit_id on create diff --git a/app/views/moderation/comments/index.html.erb b/app/views/moderation/comments/index.html.erb index 4393f4cb3..0d89114f1 100644 --- a/app/views/moderation/comments/index.html.erb +++ b/app/views/moderation/comments/index.html.erb @@ -16,11 +16,11 @@ - - - - - + + + + + <% @comments.each do |comment| %> diff --git a/app/views/moderation/debates/index.html.erb b/app/views/moderation/debates/index.html.erb new file mode 100644 index 000000000..611f68e16 --- /dev/null +++ b/app/views/moderation/debates/index.html.erb @@ -0,0 +1,48 @@ +

<%= t('moderation.debates.index.title') %>

+ +

+ <%= t('moderation.debates.index.filter') %>: + <% @valid_filters.each do |filter| %> + <% if @filter == filter %> + <%= t("moderation.debates.index.filters.#{filter}") %> + <% else %> + <%= link_to t("moderation.debates.index.filters.#{filter}"), + moderation_debates_path(filter: filter) %> + <% end %> + <% end %> +

+ +

<%= page_entries_info @debates %>

+ +
<%= t('moderation.comments.index.flags') %><%= t('moderation.comments.index.updated_at') %><%= t('moderation.comments.index.commentable_type') %><%= t('moderation.comments.index.commentable') %><%= t('moderation.comments.index.comment') %><%= t('moderation.comments.index.headers.flags') %><%= t('moderation.comments.index.headers.updated_at') %><%= t('moderation.comments.index.headers.commentable_type') %><%= t('moderation.comments.index.headers.commentable') %><%= t('moderation.comments.index.headers.comment') %>
+ + + + + + + <% @debates.each do |debate| %> + + + + + + + <% if can? :mark_as_reviewed, debate %> + + <% end %> + <% if debate.reviewed? %> + + <% end %> + + <% end %> +
<%= t('moderation.debates.index.headers.flags') %><%= t('moderation.debates.index.headers.updated_at') %><%= t('moderation.debates.index.headers.title') %><%= t('moderation.debates.index.headers.description') %>
<%= debate.inappropiate_flags_count %><%= l debate.updated_at.to_date %><%= link_to debate.title, debate %><%= debate.description %> + <%= link_to t('moderation.debates.index.hide'), hide_in_moderation_screen_moderation_debate_path(debate, request.query_parameters), method: :put %> + + <%= link_to t('moderation.debates.index.mark_as_reviewed'), mark_as_reviewed_moderation_debate_path(debate, request.query_parameters), method: :put %> + + <%= t('moderation.debates.index.reviewed') %> +
+ +<%= paginate @debates %> + diff --git a/config/locales/moderation.en.yml b/config/locales/moderation.en.yml index 107d95518..0fc762d8d 100644 --- a/config/locales/moderation.en.yml +++ b/config/locales/moderation.en.yml @@ -6,11 +6,28 @@ en: comments: index: title: Comments flagged as inappropiate - commentable_type: Type - commentable: Root - comment: Comment - updated_at: Date - flags: Flags + headers: + flags: Flags + updated_at: Date + commentable_type: Type + commentable: Root + comment: Comment + hide: Hide + mark_as_reviewed: Mark as reviewed + reviewed: Reviewed + filter: Filter + filters: + all: All + pending_review: Pending + reviewed: Reviewed + debates: + index: + title: Debates flagged as inappropiate + headers: + flags: Flags + updated_at: Date + title: Title + description: Description hide: Hide mark_as_reviewed: Mark as reviewed reviewed: Reviewed diff --git a/config/locales/moderation.es.yml b/config/locales/moderation.es.yml index 7f53cdb3d..bae811511 100644 --- a/config/locales/moderation.es.yml +++ b/config/locales/moderation.es.yml @@ -6,11 +6,28 @@ es: comments: index: title: Comentarios Denunciados como Inapropiados - commentable_type: Tipo - commentable: Raíz - comment: Comentario - updated_at: Fecha - flags: Denuncias + headers: + flags: Denuncias + updated_at: Fecha + commentable_type: Tipo + commentable: Raíz + comment: Comentario + hide: Ocultar + mark_as_reviewed: Marcar como revisado + reviewed: Revisado + filter: Filtrar + filters: + all: Todos + pending_review: Pendientes + reviewed: Revisados + debates: + index: + title: Debates Denunciados como Inapropiados + headers: + flags: Denuncias + updated_at: Fecha + title: Title + description: Descripción hide: Ocultar mark_as_reviewed: Marcar como revisado reviewed: Revisado diff --git a/spec/features/moderation/debates_spec.rb b/spec/features/moderation/debates_spec.rb index 5692a8b5b..bb2b58c24 100644 --- a/spec/features/moderation/debates_spec.rb +++ b/spec/features/moderation/debates_spec.rb @@ -23,4 +23,113 @@ feature 'Moderate debates' do expect(page).to have_css('.debate', count: 0) end -end \ No newline at end of file + feature '/moderation/ menu' do + + background do + moderator = create(:moderator) + login_as(moderator.user) + end + + scenario "Current filter is properly highlighted" do + visit moderation_debates_path + expect(page).to_not have_link('All') + expect(page).to have_link('Pending') + expect(page).to have_link('Reviewed') + + visit moderation_debates_path(filter: 'all') + expect(page).to_not have_link('All') + expect(page).to have_link('Pending') + expect(page).to have_link('Reviewed') + + visit moderation_debates_path(filter: 'pending_review') + expect(page).to have_link('All') + expect(page).to_not have_link('Pending') + expect(page).to have_link('Reviewed') + + visit moderation_debates_path(filter: 'reviewed') + expect(page).to have_link('All') + expect(page).to have_link('Pending') + expect(page).to_not have_link('Reviewed') + end + + scenario "Filtering debates" do + create(:debate, :flagged_as_inappropiate, title: "Pending debate") + create(:debate, :flagged_as_inappropiate, :hidden, title: "Hidden debate") + create(:debate, :flagged_as_inappropiate, :reviewed, title: "Reviewed debate") + + visit moderation_debates_path(filter: 'all') + expect(page).to have_content('Pending debate') + expect(page).to_not have_content('Hidden debate') + expect(page).to have_content('Reviewed debate') + + visit moderation_debates_path(filter: 'pending_review') + expect(page).to have_content('Pending debate') + expect(page).to_not have_content('Hidden debate') + expect(page).to_not have_content('Reviewed debate') + + visit moderation_debates_path(filter: 'reviewed') + expect(page).to_not have_content('Pending debate') + expect(page).to_not have_content('Hidden debate') + expect(page).to have_content('Reviewed debate') + end + + scenario "Reviewing links remember the pagination setting and the filter" do + per_page = Kaminari.config.default_per_page + (per_page + 2).times { create(:debate, :flagged_as_inappropiate) } + + visit moderation_debates_path(filter: 'pending_review', page: 2) + + click_link('Mark as reviewed', match: :first) + + uri = URI.parse(current_url) + query_params = Rack::Utils.parse_nested_query(uri.query).symbolize_keys + + expect(query_params[:filter]).to eq('pending_review') + expect(query_params[:page]).to eq('2') + end + + feature 'A flagged debate exists' do + + background do + @debate = create(:debate, :flagged_as_inappropiate, title: 'spammy spam', description: 'buy buy buy') + visit moderation_debates_path + end + + scenario 'It is displayed with the correct attributes' do + within("#debate_#{@debate.id}") do + expect(page).to have_link('spammy spam') + expect(page).to have_content('buy buy buy') + expect(page).to have_content('1') + expect(page).to have_link('Hide') + expect(page).to have_link('Mark as reviewed') + end + end + + scenario 'Hiding the debate' do + within("#debate_#{@debate.id}") do + click_link('Hide') + end + + expect(current_path).to eq(moderation_debates_path) + expect(page).to_not have_selector("#debate_#{@debate.id}") + + expect(@debate.reload).to be_hidden + end + + scenario 'Marking the debate as reviewed' do + within("#debate_#{@debate.id}") do + click_link('Mark as reviewed') + end + + expect(current_path).to eq(moderation_debates_path) + + within("#debate_#{@debate.id}") do + expect(page).to have_content('Reviewed') + end + + expect(@debate.reload).to be_reviewed + end + end + end + +end