Merge pull request #1041 from consul/select-featured-debates

Select featured debates
This commit is contained in:
Juanjo Bazán
2016-04-25 18:19:40 +02:00
16 changed files with 117 additions and 51 deletions

View File

@@ -152,4 +152,5 @@ module CommentableActions
def index_customization def index_customization
nil nil
end end
end end

View File

@@ -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

View File

@@ -18,6 +18,10 @@ class DebatesController < ApplicationController
helper_method :resource_model, :resource_name helper_method :resource_model, :resource_name
respond_to :html, :js respond_to :html, :js
def index_customization
@featured_debates = @debates.featured
end
def show def show
super super
redirect_to debate_path(@debate), status: :moved_permanently if request.path != debate_path(@debate) 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) set_debate_votes(@debate)
end 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 private
def debate_params def debate_params

View File

@@ -0,0 +1,6 @@
module DebatesHelper
def has_featured?
Debate.all.featured.count > 0
end
end

View File

@@ -30,6 +30,9 @@ module Abilities
can :confirm_hide, User can :confirm_hide, User
cannot :confirm_hide, User, hidden_at: nil cannot :confirm_hide, User, hidden_at: nil
can :mark_featured, Debate
can :unmark_featured, Debate
can :comment_as_administrator, [Debate, Comment, Proposal] can :comment_as_administrator, [Debate, Comment, Proposal]
can [:search, :create, :index, :destroy], ::Moderator can [:search, :create, :index, :destroy], ::Moderator

View File

@@ -36,7 +36,8 @@ class Debate < ActiveRecord::Base
scope :sort_by_random, -> { reorder("RANDOM()") } scope :sort_by_random, -> { reorder("RANDOM()") }
scope :sort_by_relevance, -> { all } scope :sort_by_relevance, -> { all }
scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } 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 # Ahoy setup
visitable # Ahoy will automatically assign visit_id on create 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') } self.tags.each{ |t| t.increment_custom_counter_for('Debate') }
end end
def featured?
self.featured_at.present?
end
end end

View File

@@ -8,3 +8,14 @@
<%= link_to t("admin.actions.hide_author").capitalize, hide_moderation_user_path(debate.author_id), <%= link_to t("admin.actions.hide_author").capitalize, hide_moderation_user_path(debate.author_id),
method: :put, data: { confirm: t('admin.actions.confirm') } %> method: :put, data: { confirm: t('admin.actions.confirm') } %>
<% end %> <% end %>
<% if can? :mark_featured, debate %>
&nbsp;|&nbsp;
<% 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 %>

View File

@@ -0,0 +1,13 @@
<div id="featured-debates" class="row featured-debates">
<div class="small-12 column">
<h2><%= t("debates.index.featured_debates") %></h2>
</div>
<% @featured_debates.each do |debate| %>
<div class="small-12 medium-6 column end">
<h3><%= link_to debate.title, debate %></h3>
<%= link_to debate.author.name, user_path(debate.author)%>
</div>
<% end %>
</div>

View File

@@ -1,17 +0,0 @@
<div id="featured-debates" class="row featured-debates">
<div class="small-12 column">
<h2><%= t("debates.index.featured_debates") %></h2>
</div>
<div class="small-12 medium-6 column">
<h3><%= link_to "#Túpreguntas: Manuela Carmena, Alcaldesa de Madrid.", "https://decide.madrid.es/debates/4320" %></h3>
<%= link_to "Manuela Carmena ", "https://decide.madrid.es/users/21452"%>
</div>
<div class="small-12 medium-6 column">
<h3><%= link_to "¿Y si pudieras entrevistar a Manuela Carmena o a los otros concejales?", "https://decide.madrid.es/debates/4299" %></h3>
<%= link_to "ParticipaciónYTransparenciaAytoMadrid", "https://decide.madrid.es/users/52055"%>
</div>
</div>

View File

@@ -25,8 +25,8 @@
<% end %> <% end %>
</div> </div>
<% unless @tag_filter || @search_terms %> <% unless @tag_filter || @search_terms || !has_featured? %>
<%= render "featured_debates_static" %> <%= render "featured_debates" %>
<% end %> <% end %>
<%= render "shared/advanced_search", search_path: debates_path(page: 1) %> <%= render "shared/advanced_search", search_path: debates_path(page: 1) %>

View File

@@ -7,6 +7,8 @@ en:
hide: Hide hide: Hide
hide_author: Hide author hide_author: Hide author
restore: Restore restore: Restore
mark_featured: Featured
unmark_featured: Unmark featured
activity: activity:
show: show:
action: Action action: Action

View File

@@ -7,6 +7,8 @@ es:
hide: Ocultar hide: Ocultar
hide_author: Bloquear al autor hide_author: Bloquear al autor
restore: Volver a mostrar restore: Volver a mostrar
mark_featured: Destacar
unmark_featured: Quitar destacado
activity: activity:
show: show:
action: Acción action: Acción

View File

@@ -36,6 +36,8 @@ Rails.application.routes.draw do
post :vote post :vote
put :flag put :flag
put :unflag put :unflag
put :mark_featured
put :unmark_featured
end end
collection do collection do
get :map get :map

View File

@@ -0,0 +1,5 @@
class AddFeaturedAtToDebates < ActiveRecord::Migration
def change
add_column :debates, :featured_at, :datetime
end
end

View File

@@ -120,6 +120,7 @@ ActiveRecord::Schema.define(version: 20160422094733) do
t.integer "confidence_score", default: 0 t.integer "confidence_score", default: 0
t.integer "geozone_id" t.integer "geozone_id"
t.tsvector "tsv" t.tsvector "tsv"
t.datetime "featured_at"
end end
add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree add_index "debates", ["author_id", "hidden_at"], name: "index_debates_on_author_id_and_hidden_at", using: :btree

View File

@@ -1008,4 +1008,53 @@ feature 'Debates' do
end end
end 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 end