Merge pull request #910 from consul/district-summary

District summary
This commit is contained in:
Enrique García
2016-02-19 19:06:33 +01:00
7 changed files with 85 additions and 20 deletions

View File

@@ -1,3 +1,7 @@
class Geozone < ActiveRecord::Base class Geozone < ActiveRecord::Base
validates :name, presence: true validates :name, presence: true
def self.names
Geozone.pluck(:name)
end
end end

View File

@@ -71,9 +71,12 @@ class Proposal < ActiveRecord::Base
def self.for_summary def self.for_summary
summary = {} summary = {}
categories = ActsAsTaggableOn::Tag.category_names categories = ActsAsTaggableOn::Tag.category_names.sort
categories.each do |category| geozones = Geozone.names.sort
summary[category] = search(category).last_week.sort_by_confidence_score.limit(3)
groups = categories + geozones
groups.each do |group|
summary[group] = search(group).last_week.sort_by_confidence_score.limit(3)
end end
summary summary
end end

View File

@@ -16,7 +16,7 @@ class TagCloud
end end
def category_names def category_names
ActsAsTaggableOn::Tag.category_names ActsAsTaggableOn::Tag.category_names.map(&:downcase)
end end
def geozone_names def geozone_names

View File

@@ -9,7 +9,7 @@
<% @proposals.each do |group_name, proposals| %> <% @proposals.each do |group_name, proposals| %>
<div id="<%= group_name.parameterize %>"> <div id="<%= group_name.parameterize %>">
<h2 class="margin-top"><%= group_name.capitalize %></h2> <h2 class="margin-top"><%= group_name %></h2>
<% proposals[0..2].each do |proposal| %> <% proposals[0..2].each do |proposal| %>
<div class="proposal clear"> <div class="proposal clear">

View File

@@ -35,7 +35,7 @@ module ActsAsTaggableOn
end end
def self.category_names def self.category_names
Tag.where("kind = 'category'").map {|tag| tag.name.downcase } Tag.where("kind = 'category'").pluck(:name)
end end
private private

View File

@@ -1166,11 +1166,11 @@ feature 'Proposals' do
context "Summary" do context "Summary" do
scenario "Displays proposals grouped by category" do scenario "Displays proposals grouped by category" do
create(:tag, kind: 'category', name: 'culture') create(:tag, kind: 'category', name: 'Culture')
create(:tag, kind: 'category', name: 'social services') create(:tag, kind: 'category', name: 'Social Services')
3.times { create(:proposal, tag_list: 'culture') } 3.times { create(:proposal, tag_list: 'Culture') }
3.times { create(:proposal, tag_list: 'social services') } 3.times { create(:proposal, tag_list: 'Social Services') }
create(:proposal, tag_list: 'Random') create(:proposal, tag_list: 'Random')
@@ -1183,7 +1183,28 @@ feature 'Proposals' do
end end
within("#social-services") do within("#social-services") do
expect(page).to have_content("Social services") expect(page).to have_content("Social Services")
expect(page).to have_css(".proposal", count: 3)
end
end
scenario "Displays proposals grouped by district" do
california = create(:geozone, name: 'California')
new_york = create(:geozone, name: 'New York')
3.times { create(:proposal, geozone: california) }
3.times { create(:proposal, geozone: new_york) }
visit proposals_path
click_link "The most supported proposals by category"
within("#california") do
expect(page).to have_content("California")
expect(page).to have_css(".proposal", count: 3)
end
within("#new-york") do
expect(page).to have_content("New York")
expect(page).to have_css(".proposal", count: 3) expect(page).to have_css(".proposal", count: 3)
end end
end end

View File

@@ -643,6 +643,9 @@ describe Proposal do
end end
describe "for_summary" do describe "for_summary" do
context "categories" do
it "should return proposals tagged with a category" do it "should return proposals tagged with a category" do
create(:tag, kind: 'category', name: 'culture') create(:tag, kind: 'category', name: 'culture')
proposal = create(:proposal, tag_list: 'culture') proposal = create(:proposal, tag_list: 'culture')
@@ -656,6 +659,24 @@ describe Proposal do
expect(Proposal.for_summary.values.flatten).to_not include(proposal) expect(Proposal.for_summary.values.flatten).to_not include(proposal)
end end
end
context "districts" do
it "should return proposals with a geozone" do
california = create(:geozone, name: 'california')
proposal = create(:proposal, geozone: california)
expect(Proposal.for_summary.values.flatten).to include(proposal)
end
it "should not return proposals without a geozone" do
create(:geozone, name: 'california')
proposal = create(:proposal)
expect(Proposal.for_summary.values.flatten).to_not include(proposal)
end
end
it "should return proposals created this week" do it "should return proposals created this week" do
create(:tag, kind: 'category', name: 'culture') create(:tag, kind: 'category', name: 'culture')
@@ -669,7 +690,7 @@ describe Proposal do
expect(Proposal.for_summary.values.flatten).to_not include(proposal) expect(Proposal.for_summary.values.flatten).to_not include(proposal)
end end
it "should order by votes" do it "should order proposals by votes" do
create(:tag, kind: 'category', name: 'culture') create(:tag, kind: 'category', name: 'culture')
create(:proposal, tag_list: 'culture').update_column(:confidence_score, 2) create(:proposal, tag_list: 'culture').update_column(:confidence_score, 2)
create(:proposal, tag_list: 'culture').update_column(:confidence_score, 10) create(:proposal, tag_list: 'culture').update_column(:confidence_score, 10)
@@ -682,6 +703,22 @@ describe Proposal do
expect(results.third.confidence_score).to be(2) expect(results.third.confidence_score).to be(2)
end end
it "should order groups alphabetically" do
create(:tag, kind: 'category', name: 'health')
create(:tag, kind: 'category', name: 'culture')
create(:tag, kind: 'category', name: 'social services')
health_proposal = create(:proposal, tag_list: 'health')
culture_proposal = create(:proposal, tag_list: 'culture')
social_proposal = create(:proposal, tag_list: 'social services')
results = Proposal.for_summary.values.flatten
expect(results.first).to eq(culture_proposal)
expect(results.second).to eq(health_proposal)
expect(results.third).to eq(social_proposal)
end
it "should return proposals grouped by tag" do it "should return proposals grouped by tag" do
create(:tag, kind: 'category', name: 'culture') create(:tag, kind: 'category', name: 'culture')
create(:tag, kind: 'category', name: 'health') create(:tag, kind: 'category', name: 'health')