diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index 01066c8ad..332d031a5 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -152,4 +152,5 @@ module CommentableActions def index_customization nil end + end diff --git a/app/controllers/debate_links_controller.rb b/app/controllers/debate_links_controller.rb deleted file mode 100644 index f6f7c3af8..000000000 --- a/app/controllers/debate_links_controller.rb +++ /dev/null @@ -1,31 +0,0 @@ -class DebateLinksController < ApplicationController - include FeatureFlags - include CommentableActions - - before_action :authenticate_user!, except: [:show] - - load_and_authorize_resource class: "Debate" - - feature_flag :debates - - respond_to :html, :js - - private - - def create_params - params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key).merge(link_required: true) - end - - def debate_params - params.require(:debate).permit(:title, :external_link, :tag_list, :terms_of_service, :captcha, :captcha_key).merge(link_required: true) - end - - def after_create_path - debate_path(@resource) - end - - def resource_model - Debate - end - -end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index b5a0ae25a..b747cd903 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -18,6 +18,10 @@ class DebatesController < ApplicationController helper_method :resource_model, :resource_name respond_to :html, :js + def index_customization + @featured_debates = @debates.featured + end + def show super redirect_to debate_path(@debate), status: :moved_permanently if request.path != debate_path(@debate) @@ -28,6 +32,16 @@ class DebatesController < ApplicationController set_debate_votes(@debate) end + def unmark_featured + @debate.update_attribute(:featured_at, nil) + redirect_to request.query_parameters.merge(action: :index) + end + + def mark_featured + @debate.update_attribute(:featured_at, Time.now) + redirect_to request.query_parameters.merge(action: :index) + end + private def debate_params diff --git a/app/helpers/debates_helper.rb b/app/helpers/debates_helper.rb new file mode 100644 index 000000000..3c1aa02a7 --- /dev/null +++ b/app/helpers/debates_helper.rb @@ -0,0 +1,6 @@ +module DebatesHelper + + def has_featured? + Debate.all.featured.count > 0 + end +end \ No newline at end of file diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index ee5e963f2..f043a3c86 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -30,6 +30,9 @@ module Abilities can :confirm_hide, User cannot :confirm_hide, User, hidden_at: nil + can :mark_featured, Debate + can :unmark_featured, Debate + can :comment_as_administrator, [Debate, Comment, Proposal] can [:search, :create, :index, :destroy], ::Moderator diff --git a/app/models/debate.rb b/app/models/debate.rb index ceec9946b..cdae527f7 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -36,7 +36,8 @@ class Debate < ActiveRecord::Base scope :sort_by_random, -> { reorder("RANDOM()") } scope :sort_by_relevance, -> { all } scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } - scope :last_week, -> { where("created_at >= ?", 7.days.ago)} + scope :last_week, -> { where("created_at >= ?", 7.days.ago)} + scope :featured, -> { where("featured_at is not null")} # Ahoy setup visitable # Ahoy will automatically assign visit_id on create @@ -132,4 +133,8 @@ class Debate < ActiveRecord::Base self.tags.each{ |t| t.increment_custom_counter_for('Debate') } end + def featured? + self.featured_at.present? + end + end diff --git a/app/views/debates/_actions.html.erb b/app/views/debates/_actions.html.erb index db9821ad0..1b61e045b 100644 --- a/app/views/debates/_actions.html.erb +++ b/app/views/debates/_actions.html.erb @@ -8,3 +8,14 @@ <%= link_to t("admin.actions.hide_author").capitalize, hide_moderation_user_path(debate.author_id), method: :put, data: { confirm: t('admin.actions.confirm') } %> <% end %> + +<% if can? :mark_featured, debate %> +  |  + <% if debate.featured? %> + <%= link_to t("admin.actions.unmark_featured").capitalize, unmark_featured_debate_path(debate), + method: :put, data: { confirm: t('admin.actions.confirm') } %> + <% else %> + <%= link_to t("admin.actions.mark_featured").capitalize, mark_featured_debate_path(debate), + method: :put, data: { confirm: t('admin.actions.confirm') } %> + <% end %> +<% end %> diff --git a/app/views/debates/_featured_debates.html.erb b/app/views/debates/_featured_debates.html.erb new file mode 100644 index 000000000..577a6da77 --- /dev/null +++ b/app/views/debates/_featured_debates.html.erb @@ -0,0 +1,13 @@ + diff --git a/app/views/debates/_featured_debates_static.html.erb b/app/views/debates/_featured_debates_static.html.erb deleted file mode 100644 index 8f7d0b68d..000000000 --- a/app/views/debates/_featured_debates_static.html.erb +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index 6488b5844..ab0a137c7 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -25,8 +25,8 @@ <% end %> - <% unless @tag_filter || @search_terms %> - <%= render "featured_debates_static" %> + <% unless @tag_filter || @search_terms || !has_featured? %> + <%= render "featured_debates" %> <% end %> <%= render "shared/advanced_search", search_path: debates_path(page: 1) %> diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index d24991654..32adadbd2 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -7,6 +7,8 @@ en: hide: Hide hide_author: Hide author restore: Restore + mark_featured: Featured + unmark_featured: Unmark featured activity: show: action: Action diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index b5466a080..a3f8785e0 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -7,6 +7,8 @@ es: hide: Ocultar hide_author: Bloquear al autor restore: Volver a mostrar + mark_featured: Destacar + unmark_featured: Quitar destacado activity: show: action: Acción diff --git a/config/routes.rb b/config/routes.rb index 6c9b629f2..fa414c8b0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -36,6 +36,8 @@ Rails.application.routes.draw do post :vote put :flag put :unflag + put :mark_featured + put :unmark_featured end collection do get :map diff --git a/db/migrate/20160315084335_add_featured_at_to_debates.rb b/db/migrate/20160315084335_add_featured_at_to_debates.rb new file mode 100644 index 000000000..81093aed3 --- /dev/null +++ b/db/migrate/20160315084335_add_featured_at_to_debates.rb @@ -0,0 +1,5 @@ +class AddFeaturedAtToDebates < ActiveRecord::Migration + def change + add_column :debates, :featured_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 7e83ab7cc..726beac1a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -120,6 +120,7 @@ ActiveRecord::Schema.define(version: 20160422094733) do t.integer "confidence_score", default: 0 t.integer "geozone_id" t.tsvector "tsv" + t.datetime "featured_at" end add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index d9ab8c8eb..0db455401 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -1008,4 +1008,53 @@ feature 'Debates' do end end end + + scenario 'Matk/Unmark a debate as featured' do + admin = create(:administrator) + login_as(admin.user) + + debate = create(:debate) + + visit debates_path + expect(page).to_not have_content 'Featured' + + click_link debate.title + + click_link 'Featured' + + visit debates_path + expect(page).to have_content 'Featured' + within('#featured-debates') do + expect(page).to have_content debate.title + end + + visit debate_path(debate) + click_link 'Unmark featured' + + expect(page).to_not have_content 'Featured' + end + + + scenario 'Index include featured debates' do + admin = create(:administrator) + login_as(admin.user) + + debate1 = create(:debate, featured_at: Time.now) + debate2 = create(:debate) + + visit debates_path + expect(page).to have_content("Featured") + end + + + scenario 'Index do not show featured debates if none is marked as featured' do + admin = create(:administrator) + login_as(admin.user) + + debate1 = create(:debate) + debate2 = create(:debate) + + visit debates_path + expect(page).to_not have_content("Featured") + end end