add budget investment stats

This commit is contained in:
rgarcia
2017-03-13 20:43:24 +01:00
committed by Javi Martín
parent 135984d535
commit 11437a1d40
9 changed files with 163 additions and 1 deletions

View File

@@ -4,7 +4,8 @@ class Admin::Api::StatsController < Admin::Api::BaseController
unless params[:event].present? ||
params[:visits].present? ||
params[:spending_proposals].present? ||
params[:budget_investments].present?
params[:budget_investments].present? ||
params[:user_supported_budgets].present?
return render json: {}, status: :bad_request
end
@@ -26,6 +27,9 @@ class Admin::Api::StatsController < Admin::Api::BaseController
ds.add "Budget Investments", Budget::Investment.group_by_day(:created_at).count
end
if params[:user_supported_budgets].present?
ds.add "User supported budgets", Vote.where(votable_type: "Budget::Investment").group_by_day(:updated_at).count
end
render json: ds.build
end
end

View File

@@ -52,9 +52,29 @@ class Admin::StatsController < Admin::BaseController
@users_who_have_sent_message = DirectMessage.select(:sender_id).distinct.count
end
def budget_investments
votes = Vote.for_budget_investments(Budget::Investment.all)
@vote_count = votes.count
@participant_count = votes.select(:voter_id).distinct.count
@voters_in_heading = {}
budget = Budget.last
budget.headings.each do |heading|
@voters_in_heading[heading] = voters_in_heading(heading)
end
end
def polls
@polls = ::Poll.current
@participants = ::Poll::Voter.where(poll: @polls)
end
private
def voters_in_heading(heading)
Vote.where(votable_type: "Budget::Investment").
includes(:budget_investment).
where(budget_investments: { heading_id: heading.id }).
select("votes.voter_id").distinct.count
end
end

View File

@@ -0,0 +1,45 @@
<% content_for :head do %>
<%= javascript_include_tag "stat_graphs", "data-turbolinks-track" => true %>
<% end %>
<div class="stats">
<div class="row stats-numbers">
<div class="small-12 medium-3 column">
<p class="featured">
<%= t("admin.stats.budget_investments.vote_count") %>
<br>
<span id="total_votes_count" class="number">
<%= @vote_count %>
</span>
</p>
</div>
<div class="small-12 medium-6 column end">
<p>
<%= t("admin.stats.budget_investments.participant_count") %>
<br>
<span id="total_participants_count" class="number">
<%= @participant_count %>
</span>
</p>
</div>
</div>
</div>
<%= render "graph", name: "user_supported_budgets", event: "", count: @participant_count %>
<table class="investment-projects-summary">
<th><%= t("admin.stats.budget_investments.groups") %></th>
<th><%= t("admin.stats.budget_investments.users") %></th>
<% @voters_in_heading.each do |heading, count| %>
<tr id="<%= dom_id(heading) %>">
<td class="name">
<%= heading.name %>
</td>
<td class="name">
<%= number_with_delimiter count %>
</td>
</tr>
<% end %>
</table>

View File

@@ -6,6 +6,8 @@
<div class="float-right clear">
<%= link_to t("admin.stats.show.polls"),
polls_admin_stats_path, class: "button hollow" %>
<%= link_to t("admin.stats.show.participatory_budgets"),
budget_investments_admin_stats_path, class: "button hollow" %>
<%= link_to t("admin.stats.show.direct_messages"),
direct_messages_admin_stats_path, class: "button hollow" %>
<%= link_to t("admin.stats.show.proposal_notifications"),

View File

@@ -2,6 +2,7 @@ ActsAsVotable::Vote.class_eval do
include Graphqlable
belongs_to :signature
belongs_to :budget_investment, foreign_key: "votable_id", class_name: "Budget::Investment"
scope :public_for_api, -> do
where(%{(votes.votable_type = 'Debate' and votes.votable_id in (?)) or

View File

@@ -1452,6 +1452,7 @@ en:
visits: Visits
votes: Total votes
budgets_title: Participatory budgeting
participatory_budgets: Participatory Budgets
direct_messages: Direct messages
proposal_notifications: Proposal notifications
incomplete_verifications: Incomplete verifications
@@ -1462,6 +1463,11 @@ en:
visit: Visits
level_2_user: Level 2 users
proposal_created: Citizen proposals
budget_investments:
groups: Group
users: Users
vote_count: Votes
participant_count: Participants
direct_messages:
title: Direct messages
total: Total

View File

@@ -1451,6 +1451,7 @@ es:
visits: Visitas
votes: Votos
budgets_title: Presupuestos participativos
participatory_budgets: Presupuestos Participativos
direct_messages: Mensajes directos
proposal_notifications: Notificaciones de propuestas
incomplete_verifications: Verificaciones incompletas
@@ -1461,6 +1462,11 @@ es:
visit: Visitas
level_2_user: Usuarios nivel 2
proposal_created: Propuestas Ciudadanas
budget_investments:
groups: Grupo
users: Usuarios
vote_count: Votos
participant_count: Participantes
direct_messages:
title: Mensajes directos
total: Total

View File

@@ -195,6 +195,7 @@ namespace :admin do
resource :stats, only: :show do
get :graph, on: :member
get :budget_investments, on: :collection
get :proposal_notifications, on: :collection
get :direct_messages, on: :collection
get :polls, on: :collection

View File

@@ -102,6 +102,83 @@ feature "Stats" do
end
describe "Budget investments" do
background do
budget = create(:budget)
group_all_city = create(:budget_group, budget: budget)
heading_all_city = create(:budget_heading, group: group_all_city)
end
scenario "Number of supports in investment projects" do
investment1 = create(:budget_investment)
investment2 = create(:budget_investment)
1.times { create(:vote, votable: investment1) }
2.times { create(:vote, votable: investment2) }
visit admin_stats_path
click_link "Participatory Budgets"
expect(page).to have_content "Votes 3"
end
scenario "Number of users that have voted a investment project" do
user1 = create(:user, :level_two)
user2 = create(:user, :level_two)
user3 = create(:user, :level_two)
investment1 = create(:budget_investment)
investment2 = create(:budget_investment)
create(:vote, votable: investment1, voter: user1)
create(:vote, votable: investment1, voter: user2)
create(:vote, votable: investment2, voter: user1)
visit admin_stats_path
click_link "Participatory Budgets"
expect(page).to have_content "Participants 2"
end
scenario "Number of users that have voted a investment project per geozone" do
budget = create(:budget)
group_all_city = create(:budget_group, budget: budget)
group_districts = create(:budget_group, budget: budget)
all_city = create(:budget_heading, group: group_all_city)
carabanchel = create(:budget_heading, group: group_districts)
barajas = create(:budget_heading, group: group_districts)
all_city_investment = create(:budget_investment, heading: all_city)
carabanchel_investment = create(:budget_investment, heading: carabanchel)
carabanchel_investment = create(:budget_investment, heading: carabanchel)
Budget::Investment.all.each do |investment|
create(:vote, votable: investment)
end
visit admin_stats_path
click_link "Participatory Budgets"
within("#budget_heading_#{all_city.id}") do
expect(page).to have_content all_city.name
expect(page).to have_content 1
end
within("#budget_heading_#{carabanchel.id}") do
expect(page).to have_content carabanchel.name
expect(page).to have_content 2
end
within("#budget_heading_#{barajas.id}") do
expect(page).to have_content barajas.name
expect(page).to have_content 0
end
end
end
context "graphs" do
scenario "event graphs", :js do
campaign = create(:campaign)