From de8448078852976bfc8a674f53053cab0e6c3c56 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Fri, 22 Apr 2016 15:01:55 +0200 Subject: [PATCH 1/6] adds admin summary page for spending proposals --- .../admin/spending_proposals_controller.rb | 4 ++++ app/helpers/spending_proposals_helper.rb | 9 +++++++++ app/models/abilities/administrator.rb | 2 +- app/models/geozone.rb | 2 ++ app/models/spending_proposal.rb | 4 ++++ app/views/admin/spending_proposals/index.html.erb | 2 ++ .../admin/spending_proposals/summary.html.erb | 15 +++++++++++++++ config/routes.rb | 2 ++ 8 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 app/views/admin/spending_proposals/summary.html.erb diff --git a/app/controllers/admin/spending_proposals_controller.rb b/app/controllers/admin/spending_proposals_controller.rb index e7d1cc45c..bd139dc9a 100644 --- a/app/controllers/admin/spending_proposals_controller.rb +++ b/app/controllers/admin/spending_proposals_controller.rb @@ -28,6 +28,10 @@ class Admin::SpendingProposalsController < Admin::BaseController end end + def summary + @spending_proposals = SpendingProposal.for_summary.group(:geozone).sum(:price) + end + private def spending_proposal_params diff --git a/app/helpers/spending_proposals_helper.rb b/app/helpers/spending_proposals_helper.rb index ba68ad42a..030b53f8f 100644 --- a/app/helpers/spending_proposals_helper.rb +++ b/app/helpers/spending_proposals_helper.rb @@ -13,4 +13,13 @@ module SpendingProposalsHelper spending_proposal_path(spending_proposal, options) end end + + def spending_proposal_count_for_geozone(geozone) + if geozone.present? + geozone.spending_proposals.for_summary.count + else + SpendingProposal.where(geozone: nil).for_summary.count + end + end + end \ No newline at end of file diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index 1b440795f..ee5e963f2 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -37,7 +37,7 @@ module Abilities can :manage, Annotation - can [:read, :update, :destroy], SpendingProposal + can [:read, :update, :destroy, :summary], SpendingProposal end end end diff --git a/app/models/geozone.rb b/app/models/geozone.rb index ee612f355..787e2b7e2 100644 --- a/app/models/geozone.rb +++ b/app/models/geozone.rb @@ -1,7 +1,9 @@ class Geozone < ActiveRecord::Base + has_many :spending_proposals validates :name, presence: true def self.names Geozone.pluck(:name) end + end diff --git a/app/models/spending_proposal.rb b/app/models/spending_proposal.rb index d8ae2acf0..51ae06bf8 100644 --- a/app/models/spending_proposal.rb +++ b/app/models/spending_proposal.rb @@ -134,4 +134,8 @@ class SpendingProposal < ActiveRecord::Base self.responsible_name = author.try(:document_number) if author.try(:document_number).present? end + def self.for_summary + valuation_finished.feasible + end + end diff --git a/app/views/admin/spending_proposals/index.html.erb b/app/views/admin/spending_proposals/index.html.erb index 1ad804c51..86dad6bbd 100644 --- a/app/views/admin/spending_proposals/index.html.erb +++ b/app/views/admin/spending_proposals/index.html.erb @@ -36,6 +36,8 @@ <%= render 'shared/filter_subnav', i18n_namespace: "admin.spending_proposals.index" %> +<%= link_to t("admin.spending_proposals.index.summary_link"), + summary_admin_spending_proposals_path %>

<%= page_entries_info @spending_proposals %>

diff --git a/app/views/admin/spending_proposals/summary.html.erb b/app/views/admin/spending_proposals/summary.html.erb new file mode 100644 index 000000000..825b30983 --- /dev/null +++ b/app/views/admin/spending_proposals/summary.html.erb @@ -0,0 +1,15 @@ +

<%= t("admin.spending_proposals.summary.title") %>

+ + + + + + + <% @spending_proposals.each do |geozone, price| %> + + + + + + <% end %> +
<%= t("admin.spending_proposals.summary.geozone_name") %><%= t("admin.spending_proposals.summary.count_for_geozone") %><%= t("admin.spending_proposals.summary.cost_for_geozone") %>
<%= geozone.present? ? geozone.name : t("geozones.none") %><%= spending_proposal_count_for_geozone(geozone) %><%= number_to_currency(price) %>
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index dd4281788..43b8b5219 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -135,6 +135,8 @@ Rails.application.routes.draw do patch :assign_admin patch :assign_valuators end + + get :summary, on: :collection end resources :comments, only: :index do From 44528c4a32512e74175b192f7af13d8cd2975e65 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Fri, 22 Apr 2016 15:02:09 +0200 Subject: [PATCH 2/6] adds translations --- config/locales/admin.en.yml | 6 ++++++ config/locales/admin.es.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index 96023f69c..484ba7bfb 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -167,6 +167,7 @@ en: assigned_admin: Assigned administrator no_admin_assigned: No admin assigned no_valuators_assigned: No valuators assigned + summary_link: "Summary" show: assigned_admin: Assigned administrator assigned_valuators: Assigned valuators @@ -190,6 +191,11 @@ en: tags: Tags tags_placeholder: "Write the tags you want separated by commas (,)" undefined: Undefined + summary: + title: Summary for feasible and finished investment projects + geozone_name: Scope + count_for_geozone: Count + cost_for_geozone: Cost stats: show: stats_title: Stats diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index 345a3716c..9ebddcf14 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -167,6 +167,7 @@ es: assigned_admin: Administrador asignado no_admin_assigned: Sin admin asignado no_valuators_assigned: Sin evaluador + summary_link: "Resumen" show: assigned_admin: Administrador asignado assigned_valuators: Evaluadores asignados @@ -190,6 +191,11 @@ es: tags: Etiquetas tags_placeholder: "Escribe las etiquetas que desees separadas por comas (,)" undefined: Sin definir + summary: + title: Resumen de propuestas viables y finalizadas + geozone_name: Ámbito de ciudad + count_for_geozone: Número de propuestas + cost_for_geozone: Coste total stats: show: stats_title: Estadísticas From 6a4177ed59865fa425ec66020ec028950a695bd1 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Fri, 22 Apr 2016 15:02:32 +0200 Subject: [PATCH 3/6] updates dev seeds --- db/dev_seeds.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/db/dev_seeds.rb b/db/dev_seeds.rb index e4365d244..a1cbbabe2 100644 --- a/db/dev_seeds.rb +++ b/db/dev_seeds.rb @@ -261,17 +261,24 @@ puts "Creating Spending Proposals" tags = Faker::Lorem.words(10) -(1..30).each do |i| +(1..60).each do |i| geozone = Geozone.reorder("RANDOM()").first author = User.reorder("RANDOM()").first description = "

#{Faker::Lorem.paragraphs.join('

')}

" + feasible_explanation = "

#{Faker::Lorem.paragraphs.join('

')}

" + valuation_finished = [true, false].sample + feasible = [true, false].sample spending_proposal = SpendingProposal.create!(author: author, title: Faker::Lorem.sentence(3).truncate(60), external_url: Faker::Internet.url, description: description, created_at: rand((Time.now - 1.week) .. Time.now), geozone: [geozone, nil].sample, + feasible: feasible, + feasible_explanation: feasible_explanation, + valuation_finished: valuation_finished, tag_list: tags.sample(3).join(','), + price: rand(1000000), terms_of_service: "1") puts " #{spending_proposal.title}" end From bdc815e05c0e3a07dd87abe72f19ec254103585d Mon Sep 17 00:00:00 2001 From: rgarcia Date: Fri, 22 Apr 2016 15:02:56 +0200 Subject: [PATCH 4/6] adds specs --- .../features/admin/spending_proposals_spec.rb | 43 +++++++++++++++++++ spec/models/spending_proposal_spec.rb | 23 ++++++++++ 2 files changed, 66 insertions(+) diff --git a/spec/features/admin/spending_proposals_spec.rb b/spec/features/admin/spending_proposals_spec.rb index 144ff9b31..a28feded4 100644 --- a/spec/features/admin/spending_proposals_spec.rb +++ b/spec/features/admin/spending_proposals_spec.rb @@ -425,4 +425,47 @@ feature 'Admin spending proposals' do end + context 'Summary' do + + scenario "Diplays summary for every geozone" do + california = create(:geozone) + new_york = create(:geozone) + washington = create(:geozone) + + proposal1 = create(:spending_proposal, title: "Build a highway", price: '10000000', geozone: nil, feasible: true, valuation_finished: true) + proposal1 = create(:spending_proposal, title: "Build a university", price: '5000000', geozone: nil, feasible: true, valuation_finished: true) + proposal3 = create(:spending_proposal, title: "Build a hospital", price: '1000000', geozone: california, feasible: true, valuation_finished: true) + proposal4 = create(:spending_proposal, title: "Build a school", price: '500000', geozone: california, feasible: true, valuation_finished: true) + proposal5 = create(:spending_proposal, title: "Plant more trees", price: '30000', geozone: new_york, feasible: true, valuation_finished: true) + proposal6 = create(:spending_proposal, title: "Destroy the seas", price: '999999', geozone: washington, feasible: false, valuation_finished: true) + + visit admin_spending_proposals_path + + click_link "Summary" + + expect(page).to have_content "Summary for feasible and finished investment projects" + + within("#geozone_all_city") do + expect(page).to have_css(".name", text: "All city") + expect(page).to have_css(".proposals-count", text: 2) + expect(page).to have_css(".total-price", text: "$15,000,000") + end + + within("#geozone_#{california.id}") do + expect(page).to have_css(".name", text: california.name) + expect(page).to have_css(".proposals-count", text: 2) + expect(page).to have_css(".total-price", text: "$1,500,000") + end + + within("#geozone_#{new_york.id}") do + expect(page).to have_css(".name", text: new_york.name) + expect(page).to have_css(".proposals-count", text: 1) + expect(page).to have_css(".total-price", text: '$30,000') + end + + expect(page).to_not have_content washington.name + end + + end + end diff --git a/spec/models/spending_proposal_spec.rb b/spec/models/spending_proposal_spec.rb index 5bff7cadd..433e1d9a1 100644 --- a/spec/models/spending_proposal_spec.rb +++ b/spec/models/spending_proposal_spec.rb @@ -330,5 +330,28 @@ describe SpendingProposal do end end + describe "#for_summary" do + it "returns only feasible and valuation finished proposals" do + sp1 = create(:spending_proposal, feasible: true, valuation_finished: true) + sp2 = create(:spending_proposal, feasible: true, valuation_finished: true) + sp3 = create(:spending_proposal, feasible: false, valuation_finished: false) + + expect(SpendingProposal.for_summary).to include(sp1) + expect(SpendingProposal.for_summary).to include(sp2) + expect(SpendingProposal.for_summary).to_not include(sp3) + end + + it "does not return unfeasible proposals" do + sp = create(:spending_proposal, feasible: false, valuation_finished: true) + + expect(SpendingProposal.for_summary).to_not include(sp) + end + + it "does not return proposals pending valuation" do + sp = create(:spending_proposal, feasible: true, valuation_finished: false) + + expect(SpendingProposal.for_summary).to_not include(sp) + end + end end From 13f65b6b71569efb2027e52b0f9233dcb9c66087 Mon Sep 17 00:00:00 2001 From: rgarcia Date: Fri, 22 Apr 2016 15:03:07 +0200 Subject: [PATCH 5/6] cleans up --- app/views/shared/_filter_subnav.html.erb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/views/shared/_filter_subnav.html.erb b/app/views/shared/_filter_subnav.html.erb index aec1daa30..51a745b09 100644 --- a/app/views/shared/_filter_subnav.html.erb +++ b/app/views/shared/_filter_subnav.html.erb @@ -1,8 +1,3 @@ -<% # Params: - # - # i18n_namespace: for example "moderation.debates.index" -%> -