Add recommended tab on proposals and debates index.
This commit is contained in:
@@ -8,13 +8,19 @@ module CommentableActions
|
|||||||
@resources = @advanced_search_terms.present? ? @resources.filter(@advanced_search_terms) : @resources
|
@resources = @advanced_search_terms.present? ? @resources.filter(@advanced_search_terms) : @resources
|
||||||
|
|
||||||
@resources = @resources.tagged_with(@tag_filter) if @tag_filter
|
@resources = @resources.tagged_with(@tag_filter) if @tag_filter
|
||||||
@resources = @resources.page(params[:page]).for_render.send("sort_by_#{@current_order}")
|
@resources = if @current_order == "recommended" && current_user.present?
|
||||||
|
@resources.recommended(current_user).page(params[:page]).send("sort_by_#{@current_order}")
|
||||||
|
else
|
||||||
|
@resources.page(params[:page]).for_render.send("sort_by_#{@current_order}")
|
||||||
|
end
|
||||||
|
|
||||||
index_customization if index_customization.present?
|
index_customization if index_customization.present?
|
||||||
|
|
||||||
@tag_cloud = tag_cloud
|
@tag_cloud = tag_cloud
|
||||||
@banners = Banner.with_active
|
@banners = Banner.with_active
|
||||||
|
|
||||||
set_resource_votes(@resources)
|
set_resource_votes(@resources)
|
||||||
|
|
||||||
set_resources_instance
|
set_resources_instance
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class DebatesController < ApplicationController
|
|||||||
|
|
||||||
invisible_captcha only: [:create, :update], honeypot: :subtitle
|
invisible_captcha only: [:create, :update], honeypot: :subtitle
|
||||||
|
|
||||||
has_orders %w{hot_score confidence_score created_at relevance}, only: :index
|
has_orders ->(c) { Debate.debates_orders(c.current_user) }, only: :index
|
||||||
has_orders %w{most_voted newest oldest}, only: :show
|
has_orders %w{most_voted newest oldest}, only: :show
|
||||||
|
|
||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class ProposalsController < ApplicationController
|
|||||||
|
|
||||||
invisible_captcha only: [:create, :update], honeypot: :subtitle
|
invisible_captcha only: [:create, :update], honeypot: :subtitle
|
||||||
|
|
||||||
has_orders %w{hot_score confidence_score created_at relevance archival_date}, only: :index
|
has_orders ->(c) { Proposal.proposals_orders(c.current_user) }, only: :index
|
||||||
has_orders %w{most_voted newest oldest}, only: :show
|
has_orders %w{most_voted newest oldest}, only: :show
|
||||||
|
|
||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
class WelcomeController < ApplicationController
|
class WelcomeController < ApplicationController
|
||||||
skip_authorization_check
|
skip_authorization_check
|
||||||
|
before_action :set_user_recommendations, only: :index, if: :current_user
|
||||||
|
|
||||||
layout "devise", only: [:welcome, :verification]
|
layout "devise", only: [:welcome, :verification]
|
||||||
|
|
||||||
@@ -13,4 +14,11 @@ class WelcomeController < ApplicationController
|
|||||||
redirect_to verification_path if signed_in?
|
redirect_to verification_path if signed_in?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_user_recommendations
|
||||||
|
@recommended_debates = Debate.recommended(current_user).limit(3)
|
||||||
|
@recommended_proposals = Proposal.recommended(current_user).limit(3)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -37,14 +37,27 @@ 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 :sort_by_recommended, -> { order(cached_votes_total: :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")}
|
scope :featured, -> { where("featured_at is not null")}
|
||||||
scope :public_for_api, -> { all }
|
scope :public_for_api, -> { all }
|
||||||
|
|
||||||
# Ahoy setup
|
# Ahoy setup
|
||||||
visitable # Ahoy will automatically assign visit_id on create
|
visitable # Ahoy will automatically assign visit_id on create
|
||||||
|
|
||||||
attr_accessor :link_required
|
attr_accessor :link_required
|
||||||
|
|
||||||
|
def self.recommended(user)
|
||||||
|
debates_list = where("author_id != ?", user.id)
|
||||||
|
#same as "with_tagged(user.interests, any: true)"
|
||||||
|
debates_list_with_tagged = debates_list.joins(:tags).where('taggings.taggable_type = ?', self.name).where('tags.name IN (?)', user.interests)
|
||||||
|
if debates_list_with_tagged.any?
|
||||||
|
debates_list = debates_list_with_tagged
|
||||||
|
end
|
||||||
|
|
||||||
|
debates_list
|
||||||
|
end
|
||||||
|
|
||||||
def searchable_values
|
def searchable_values
|
||||||
{ title => 'A',
|
{ title => 'A',
|
||||||
author.username => 'B',
|
author.username => 'B',
|
||||||
@@ -135,4 +148,9 @@ class Debate < ActiveRecord::Base
|
|||||||
featured_at.present?
|
featured_at.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.debates_orders(user)
|
||||||
|
orders = %w{hot_score confidence_score created_at relevance}
|
||||||
|
orders << "recommended" if user.present?
|
||||||
|
orders
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ class Proposal < ActiveRecord::Base
|
|||||||
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 :sort_by_archival_date, -> { archived.sort_by_confidence_score }
|
scope :sort_by_archival_date, -> { archived.sort_by_confidence_score }
|
||||||
|
scope :sort_by_recommended, -> { order(cached_votes_up: :desc) }
|
||||||
scope :archived, -> { where("proposals.created_at <= ?", Setting["months_to_archive_proposals"].to_i.months.ago) }
|
scope :archived, -> { where("proposals.created_at <= ?", Setting["months_to_archive_proposals"].to_i.months.ago) }
|
||||||
scope :not_archived, -> { where("proposals.created_at > ?", Setting["months_to_archive_proposals"].to_i.months.ago) }
|
scope :not_archived, -> { where("proposals.created_at > ?", Setting["months_to_archive_proposals"].to_i.months.ago) }
|
||||||
scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)}
|
scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)}
|
||||||
@@ -56,6 +57,18 @@ class Proposal < ActiveRecord::Base
|
|||||||
scope :successful, -> { where("cached_votes_up >= ?", Proposal.votes_needed_for_success) }
|
scope :successful, -> { where("cached_votes_up >= ?", Proposal.votes_needed_for_success) }
|
||||||
scope :public_for_api, -> { all }
|
scope :public_for_api, -> { all }
|
||||||
|
|
||||||
|
def self.recommended(user)
|
||||||
|
proposals_list = where("author_id != ?", user.id)
|
||||||
|
proposals_list_with_tagged = proposals_list.joins(:tags).where('taggings.taggable_type = ?', self.name)
|
||||||
|
.where('tags.name IN (?)', user.interests)
|
||||||
|
if proposals_list_with_tagged.any?
|
||||||
|
followed_proposals_ids = Proposal.followed_by_user(user).pluck(:id)
|
||||||
|
proposals_list = proposals_list_with_tagged.where("proposals.id NOT IN (?)", followed_proposals_ids)
|
||||||
|
end
|
||||||
|
|
||||||
|
proposals_list
|
||||||
|
end
|
||||||
|
|
||||||
def to_param
|
def to_param
|
||||||
"#{id}-#{title}".parameterize
|
"#{id}-#{title}".parameterize
|
||||||
end
|
end
|
||||||
@@ -175,6 +188,12 @@ class Proposal < ActiveRecord::Base
|
|||||||
(voters + followers).uniq
|
(voters + followers).uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.proposals_orders(user)
|
||||||
|
orders = %w{hot_score confidence_score created_at relevance archival_date}
|
||||||
|
orders << "recommended" if user.present?
|
||||||
|
orders
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def set_responsible_name
|
def set_responsible_name
|
||||||
|
|||||||
@@ -313,29 +313,6 @@ class User < ActiveRecord::Base
|
|||||||
follows.map{|follow| follow.followable.tags.map(&:name)}.flatten.compact.uniq
|
follows.map{|follow| follow.followable.tags.map(&:name)}.flatten.compact.uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
def recommended_debates
|
|
||||||
debates_list = Debate.where("author_id != ?", self)
|
|
||||||
debates_list_with_tagged = debates_list.tagged_with(interests, any: true)
|
|
||||||
|
|
||||||
if interests.any? && debates_list_with_tagged.any?
|
|
||||||
debates_list = debates_list_with_tagged
|
|
||||||
end
|
|
||||||
|
|
||||||
debates_list.order("cached_votes_total DESC").limit(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
def recommended_proposals
|
|
||||||
proposals_list = Proposal.where("author_id != ?", id)
|
|
||||||
proposals_list_with_tagged = proposals_list.tagged_with(interests, any: true)
|
|
||||||
|
|
||||||
if interests.any? && proposals_list_with_tagged.any?
|
|
||||||
followed_proposals_ids = Proposal.followed_by_user(self).pluck(:id)
|
|
||||||
proposals_list = proposals_list_with_tagged.where("id NOT IN (?)", followed_proposals_ids)
|
|
||||||
end
|
|
||||||
|
|
||||||
proposals_list.order("cached_votes_up DESC").limit(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def clean_document_number
|
def clean_document_number
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
image_version: nil,
|
image_version: nil,
|
||||||
image_default: "https://dummyimage.com/600x400/000/fff",
|
image_default: "https://dummyimage.com/600x400/000/fff",
|
||||||
carousel_size: carousel_size %>
|
carousel_size: carousel_size %>
|
||||||
|
<%= link_to "todos los debates recomendados", debates_path(order: "recommended") %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if recommended_proposals.any? %>
|
<% if recommended_proposals.any? %>
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
image_version: nil,
|
image_version: nil,
|
||||||
image_default: "https://dummyimage.com/600x400/000/fff",
|
image_default: "https://dummyimage.com/600x400/000/fff",
|
||||||
carousel_size: carousel_size %>
|
carousel_size: carousel_size %>
|
||||||
|
<%= link_to "todos las propuestas recomendados", proposals_path(order: "recommended") %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,20 +23,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% if current_user.present? && feature?(:recommendeds) %>
|
<% if feature?("user.recommendations") && (@recommended_debates.present? || @recommended_proposals.present?) %>
|
||||||
|
<%= render "recommended",
|
||||||
<% recommended_debates = current_user.recommended_debates %>
|
recommended_debates: @recommended_debates,
|
||||||
<% recommended_proposals = current_user.recommended_proposals %>
|
recommended_proposals: @recommended_proposals %>
|
||||||
|
|
||||||
<% if display_recommendeds(recommended_debates, recommended_proposals) %>
|
|
||||||
<%= render "recommended", recommended_debates: recommended_debates,
|
|
||||||
recommended_proposals: recommended_proposals %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<% cache [locale_and_user_status, @featured_debates, @featured_proposals, 'featured'] do %>
|
<% cache [locale_and_user_status, @featured_debates, @featured_proposals, 'featured'] do %>
|
||||||
<main>
|
<main>
|
||||||
<div class="highlight small-12 column text-center">
|
<div class="highlight small-12 column text-center">
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ en:
|
|||||||
spending_proposal_features:
|
spending_proposal_features:
|
||||||
voting_allowed: Voting on investment projects
|
voting_allowed: Voting on investment projects
|
||||||
legislation: Legislation
|
legislation: Legislation
|
||||||
recommendeds: Recommendeds
|
user:
|
||||||
|
recommendations: Recommendeds
|
||||||
mailer_from_name: Origin email name
|
mailer_from_name: Origin email name
|
||||||
mailer_from_address: Origin email address
|
mailer_from_address: Origin email address
|
||||||
meta_description: "Site description (SEO)"
|
meta_description: "Site description (SEO)"
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ es:
|
|||||||
spending_proposal_features:
|
spending_proposal_features:
|
||||||
voting_allowed: Votaciones sobre propuestas de inversión
|
voting_allowed: Votaciones sobre propuestas de inversión
|
||||||
legislation: Legislación
|
legislation: Legislación
|
||||||
recommendeds: Recomendaciones
|
user:
|
||||||
|
recommendations: Recomendaciones
|
||||||
mailer_from_name: Nombre email remitente
|
mailer_from_name: Nombre email remitente
|
||||||
mailer_from_address: Dirección email remitente
|
mailer_from_address: Dirección email remitente
|
||||||
meta_description: "Descripción del sitio (SEO)"
|
meta_description: "Descripción del sitio (SEO)"
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ Setting.create(key: 'feature.facebook_login', value: "true")
|
|||||||
Setting.create(key: 'feature.google_login', value: "true")
|
Setting.create(key: 'feature.google_login', value: "true")
|
||||||
Setting.create(key: 'feature.signature_sheets', value: "true")
|
Setting.create(key: 'feature.signature_sheets', value: "true")
|
||||||
Setting.create(key: 'feature.legislation', value: "true")
|
Setting.create(key: 'feature.legislation', value: "true")
|
||||||
Setting.create(key: 'feature.recommendeds', value: "true")
|
Setting.create(key: 'feature.user.recommendations', value: "true")
|
||||||
Setting.create(key: 'per_page_code_head', value: "")
|
Setting.create(key: 'per_page_code_head', value: "")
|
||||||
Setting.create(key: 'per_page_code_body', value: "")
|
Setting.create(key: 'per_page_code_body', value: "")
|
||||||
Setting.create(key: 'comments_body_max_length', value: '1000')
|
Setting.create(key: 'comments_body_max_length', value: '1000')
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ Setting['feature.public_stats'] = true
|
|||||||
Setting['feature.budgets'] = true
|
Setting['feature.budgets'] = true
|
||||||
Setting['feature.signature_sheets'] = true
|
Setting['feature.signature_sheets'] = true
|
||||||
Setting['feature.legislation'] = true
|
Setting['feature.legislation'] = true
|
||||||
Setting['feature.recommendeds'] = nil
|
Setting['feature.user.recommendations'] = nil
|
||||||
|
|
||||||
# Spending proposals feature flags
|
# Spending proposals feature flags
|
||||||
Setting['feature.spending_proposal_features.voting_allowed'] = nil
|
Setting['feature.spending_proposal_features.voting_allowed'] = nil
|
||||||
|
|||||||
@@ -28,6 +28,14 @@ feature "Home" do
|
|||||||
|
|
||||||
feature "Recommended" do
|
feature "Recommended" do
|
||||||
|
|
||||||
|
background do
|
||||||
|
Setting['feature.user.recommendations'] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
after do
|
||||||
|
Setting['feature.user.recommendations'] = nil
|
||||||
|
end
|
||||||
|
|
||||||
scenario 'Display recommended section' do
|
scenario 'Display recommended section' do
|
||||||
debate = create(:debate)
|
debate = create(:debate)
|
||||||
|
|
||||||
@@ -36,6 +44,23 @@ feature "Home" do
|
|||||||
expect(page).to have_content "Recommendations that may interest you"
|
expect(page).to have_content "Recommendations that may interest you"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario 'Display recommended section when feature flag recommended is active' do
|
||||||
|
debate = create(:debate)
|
||||||
|
|
||||||
|
visit root_path
|
||||||
|
|
||||||
|
expect(page).to have_content "Recommendations that may interest you"
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'Not display recommended section when feature flag recommended is not active' do
|
||||||
|
debate = create(:debate)
|
||||||
|
Setting['feature.user.recommendations'] = false
|
||||||
|
|
||||||
|
visit root_path
|
||||||
|
|
||||||
|
expect(page).not_to have_content "Recommendations that may interest you"
|
||||||
|
end
|
||||||
|
|
||||||
scenario 'Display debates' do
|
scenario 'Display debates' do
|
||||||
debate = create(:debate)
|
debate = create(:debate)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user