diff --git a/app/controllers/admin/widget/feed.rb b/app/controllers/admin/widget/feed.rb
new file mode 100644
index 000000000..aa3c63664
--- /dev/null
+++ b/app/controllers/admin/widget/feed.rb
@@ -0,0 +1,4 @@
+class Widget
+ class Feed < ActiveRecord::Base
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index bce56650b..1ac4fd51a 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -6,6 +6,7 @@ class WelcomeController < ApplicationController
def index
@header = Widget::Card.header.first
+ @feeds = Widget::Feed.active
@cards = Widget::Card.body
end
diff --git a/app/models/widget/feed.rb b/app/models/widget/feed.rb
new file mode 100644
index 000000000..b26097686
--- /dev/null
+++ b/app/models/widget/feed.rb
@@ -0,0 +1,46 @@
+class Widget
+ class Feed
+ include ActiveModel::Model
+
+ KINDS = %w(proposals debates processes)
+
+ attr_accessor :kind
+
+ def initialize(attributes={})
+ super
+ @kind = attributes[:kind]
+ end
+
+ def active?(kind)
+ Setting["feature.homepage.widgets.feeds.#{kind}"].present?
+ end
+
+ def self.active
+ KINDS.collect do |kind|
+ feed = new(kind: kind)
+ feed if feed.active?(kind)
+ end.compact
+ end
+
+ def items
+ send(kind)
+ end
+
+ def proposals
+ Proposal.sort_by_hot_score.limit(limit)
+ end
+
+ def debates
+ Debate.sort_by_hot_score.limit(limit)
+ end
+
+ def processes
+ Legislation::Process.open.limit(limit)
+ end
+
+ def limit
+ 3
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/app/views/welcome/_feeds.html.erb b/app/views/welcome/_feeds.html.erb
new file mode 100644
index 000000000..0f735d5d4
--- /dev/null
+++ b/app/views/welcome/_feeds.html.erb
@@ -0,0 +1,16 @@
+
Feeds
+
+<% @feeds.each do |feed| %>
+
+
+ Most active <%= feed.kind %>
+
+
+ <% feed.items.each do |item| %>
+
+ <%= item.title %>
+
+
+ <% end %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb
index 28e29b786..a0ef26543 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -24,6 +24,7 @@
<%= render "header", header: @header %>
+<%= render "feeds" %>
<%= render "cards" %>
<% if feature?("user.recommendations") && (@recommended_debates.present? || @recommended_proposals.present?) %>
diff --git a/db/dev_seeds/settings.rb b/db/dev_seeds/settings.rb
index 67a110184..6c5d8862d 100644
--- a/db/dev_seeds/settings.rb
+++ b/db/dev_seeds/settings.rb
@@ -63,4 +63,8 @@ section "Creating Settings" do
Setting.create(key: 'map_longitude', value: -3.7)
Setting.create(key: 'map_zoom', value: 10)
Setting.create(key: 'related_content_score_threshold', value: -0.3)
+
+ Setting['feature.homepage.widgets.feeds.proposals'] = true
+ Setting['feature.homepage.widgets.feeds.debates'] = true
+ Setting['feature.homepage.widgets.feeds.processes'] = true
end
diff --git a/db/migrate/20180519132610_create_widget_feeds.rb b/db/migrate/20180519132610_create_widget_feeds.rb
new file mode 100644
index 000000000..d6bb42cb1
--- /dev/null
+++ b/db/migrate/20180519132610_create_widget_feeds.rb
@@ -0,0 +1,6 @@
+class CreateWidgetFeeds < ActiveRecord::Migration
+ def change
+ create_table :widget_feeds do |t|
+ end
+ end
+end
diff --git a/db/migrate/20180519132715_create_feeds.rb b/db/migrate/20180519132715_create_feeds.rb
new file mode 100644
index 000000000..c096a5914
--- /dev/null
+++ b/db/migrate/20180519132715_create_feeds.rb
@@ -0,0 +1,6 @@
+class CreateFeeds < ActiveRecord::Migration
+ def change
+ create_table :feeds do |t|
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index c90edc5fc..1c4a93747 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -378,6 +378,9 @@ ActiveRecord::Schema.define(version: 20180519132715) do
add_index "failed_census_calls", ["user_id"], name: "index_failed_census_calls_on_user_id", using: :btree
+ create_table "feeds", force: :cascade do |t|
+ end
+
create_table "flags", force: :cascade do |t|
t.integer "user_id"
t.string "flaggable_type"
@@ -1236,6 +1239,9 @@ ActiveRecord::Schema.define(version: 20180519132715) do
t.datetime "updated_at", null: false
end
+ create_table "widget_feeds", force: :cascade do |t|
+ end
+
add_foreign_key "administrators", "users"
add_foreign_key "annotations", "legacy_legislations"
add_foreign_key "annotations", "users"
diff --git a/db/seeds.rb b/db/seeds.rb
index fb361c53b..868dec2ad 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -125,3 +125,8 @@ Setting['map_zoom'] = 10
Setting['related_content_score_threshold'] = -0.3
Setting["feature.user.skip_verification"] = 'true'
+
+Setting['feature.homepage.widgets.feeds.proposals'] = true
+Setting['feature.homepage.widgets.feeds.debates'] = true
+Setting['feature.homepage.widgets.feeds.processes'] = true
+
diff --git a/spec/factories.rb b/spec/factories.rb
index 448fa8c7f..6910e0f47 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -818,6 +818,11 @@ FactoryBot.define do
published false
end
+ trait :open do
+ start_date 1.week.ago
+ end_date 1.week.from_now
+ end
+
end
factory :legislation_draft_version, class: 'Legislation::DraftVersion' do
@@ -980,4 +985,7 @@ LOREM_IPSUM
end
end
+ factory :widget_feed, class: 'Widget::Feed' do
+ end
+
end
diff --git a/spec/features/admin/homepage/homepage_spec.rb b/spec/features/admin/homepage/homepage_spec.rb
index 4bb1cb31f..2dda511fd 100644
--- a/spec/features/admin/homepage/homepage_spec.rb
+++ b/spec/features/admin/homepage/homepage_spec.rb
@@ -6,10 +6,72 @@ feature 'Homepage' do
admin = create(:administrator).user
login_as(admin)
+ Setting['feature.homepage.widgets.feeds.proposals'] = false
+ Setting['feature.homepage.widgets.feeds.debates'] = false
+ Setting['feature.homepage.widgets.feeds.processes'] = false
+ Setting['feature.user.recommendations'] = false
end
+
+ let(:proposals_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.proposals').first }
+ let(:debates_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.debates').first }
+ let(:processes_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.processes').first }
scenario "Header" do
end
+ context "Feeds" do
+
+ scenario "Proposals" do
+ 5.times { create(:proposal) }
+
+ visit admin_homepage_path
+ within("#setting_#{proposals_setting.id}") do
+ click_button "Enable"
+ end
+
+ expect(page).to have_content "Value updated"
+
+ visit root_path
+
+ expect(page).to have_content "Most active proposals"
+ expect(page).to have_css(".proposal", count: 3)
+ end
+
+ scenario "Debates" do
+ 5.times { create(:debate) }
+
+ visit admin_homepage_path
+ within("#setting_#{debates_setting.id}") do
+ click_button "Enable"
+ end
+
+ expect(page).to have_content "Value updated"
+
+ visit root_path
+
+ expect(page).to have_content "Most active debates"
+ expect(page).to have_css(".debate", count: 3)
+ end
+
+ scenario "Processes" do
+ 5.times { create(:legislation_process) }
+
+ visit admin_homepage_path
+ within("#setting_#{processes_setting.id}") do
+ click_button "Enable"
+ end
+
+ expect(page).to have_content "Value updated"
+
+ visit root_path
+
+ expect(page).to have_content "Most active processes"
+ expect(page).to have_css(".legislation_process", count: 3)
+ end
+
+ xscenario "Deactivate"
+
+ end
+
scenario "Cards" do
card1 = create(:widget_card, title: "Card text",
description: "Card description",
diff --git a/spec/models/widget/feed_spec.rb b/spec/models/widget/feed_spec.rb
new file mode 100644
index 000000000..2411312b9
--- /dev/null
+++ b/spec/models/widget/feed_spec.rb
@@ -0,0 +1,77 @@
+require 'rails_helper'
+
+describe Widget::Feed do
+
+ let(:feed) { build(:widget_feed) }
+
+ context "validations" do
+ it "is valid" do
+ expect(feed).to be_valid
+ end
+ end
+
+ context "kinds" do
+
+ describe "#proposals" do
+
+ it "returns the most active proposals" do
+ best_proposal = create(:proposal, title: 'Best proposal')
+ best_proposal.update_column(:hot_score, 10)
+
+ worst_proposal = create(:proposal, title: 'Worst proposal')
+ worst_proposal.update_column(:hot_score, 2)
+
+ even_worst_proposal = create(:proposal, title: 'Worst proposal')
+ even_worst_proposal.update_column(:hot_score, 1)
+
+ medium_proposal = create(:proposal, title: 'Medium proposal')
+ medium_proposal.update_column(:hot_score, 5)
+
+ feed = build(:widget_feed, kind: "proposals")
+
+ expect(feed.proposals).to eq([best_proposal, medium_proposal, worst_proposal])
+ end
+
+ end
+
+ describe "#debates" do
+
+ it "returns the most active debates" do
+ best_debate = create(:debate, title: 'Best debate')
+ best_debate.update_column(:hot_score, 10)
+
+ worst_debate = create(:debate, title: 'Worst debate')
+ worst_debate.update_column(:hot_score, 2)
+
+ even_worst_debate = create(:debate, title: 'Worst debate')
+ even_worst_debate.update_column(:hot_score, 1)
+
+ medium_debate = create(:debate, title: 'Medium debate')
+ medium_debate.update_column(:hot_score, 5)
+
+ feed = build(:widget_feed, kind: "debates")
+
+ expect(feed.debates).to eq([best_debate, medium_debate, worst_debate])
+ end
+
+ end
+
+ describe "#processes" do
+
+ it "returns open processes" do
+ open_process1 = create(:legislation_process, :open, title: "Open process 1")
+ open_process2 = create(:legislation_process, :open, title: "Open process 2")
+ open_process3 = create(:legislation_process, :open, title: "Open process 3")
+ open_process4 = create(:legislation_process, :open, title: "Open process 4")
+ past_process = create(:legislation_process, :past, title: "Past process")
+
+ feed = build(:widget_feed, kind: "processes")
+
+ expect(feed.processes).to eq([open_process4, open_process3, open_process2])
+ end
+
+ end
+
+ end
+
+end
\ No newline at end of file