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