Skip to content

Commit

Permalink
Merge pull request #238 from AyuntamientoMadrid/stats
Browse files Browse the repository at this point in the history
Improves performance of stats dashboard
  • Loading branch information
kikito committed May 18, 2016
2 parents d26c55b + b5f4e61 commit 5c99d23
Show file tree
Hide file tree
Showing 13 changed files with 121 additions and 76 deletions.
12 changes: 4 additions & 8 deletions app/controllers/admin/api/stats_controller.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
class Admin::Api::StatsController < Admin::Api::BaseController

def show
unless params[:events].present? ||
params[:visits].present? ||
unless params[:event].present? ||
params[:visits].present? ||
params[:spending_proposals].present?
return render json: {}, status: :bad_request
end

ds = Ahoy::DataSource.new

if params[:events].present?
event_types = params[:events].split ','
event_types.each do |event|
ds.add event.titleize, Ahoy::Event.where(name: event).group_by_day(:time).count
end
if params[:event].present?
ds.add params[:event].titleize, Ahoy::Event.where(name: params[:event]).group_by_day(:time).count
end

if params[:visits].present?
Expand All @@ -23,7 +20,6 @@ def show
if params[:spending_proposals].present?
ds.add "Spending proposals", SpendingProposal.group_by_day(:created_at).count
end

render json: ds.build
end
end
13 changes: 12 additions & 1 deletion app/controllers/admin/stats_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class Admin::StatsController < Admin::BaseController

def show
@event_types = Ahoy::Event.group(:name).count
@event_types = Ahoy::Event.pluck(:name).uniq.sort

@visits = Visit.count
@debates = Debate.with_hidden.count
Expand All @@ -27,4 +27,15 @@ def show
@spending_proposals = SpendingProposal.count
@ballots_with_votes = Ballot.where("ballot_lines_count > ?", 0).count
end

def graph
@name = params[:id]
@event = params[:event]

if params[:event]
@count = Ahoy::Event.where(name: params[:event]).count
else
@count = params[:count]
end
end
end
28 changes: 19 additions & 9 deletions app/helpers/stats_helper.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
module StatsHelper

def events_chart_tag(events, opt={})
def event_chart_tag(events, opt={})
events = events.join(',') if events.is_a? Array
opt[:data] ||= {}
opt[:data][:graph] = admin_api_stats_path(events: events)
content_tag :div, "", opt
end

def visits_chart_tag(opt={})
events = events.join(',') if events.is_a? Array
def chart_tag(opt={})
opt[:data] ||= {}
opt[:data][:graph] = admin_api_stats_path(visits: true)
opt[:data][:graph] = admin_api_stats_path(chart_data(opt))
content_tag :div, "", opt
end

def spending_proposals_chart_tag(opt={})
events = events.join(',') if events.is_a? Array
opt[:data] ||= {}
opt[:data][:graph] = admin_api_stats_path(spending_proposals: true)
content_tag :div, "", opt
def chart_data(opt={})
data = nil
if opt[:id].present?
data = {opt[:id] => true}
elsif opt[:event].present?
data = {event: opt[:event]}
end
data
end

def graph_link_text(event)
text = t("admin.stats.graph.#{event}")
if text.to_s.match(/translation missing/)
text = event
end
text
end
end
6 changes: 6 additions & 0 deletions app/views/admin/stats/_graph.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<%= render '/shared/back_link' %>

<div id="graph" class="small-12 column">
<h2><%= t "admin.stats.graph.#{name || event}" %> (<%= count %>)</h2>
<%= chart_tag id: name, event: event %>
</div>
5 changes: 5 additions & 0 deletions app/views/admin/stats/graph.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<% content_for :head do %>
<%= javascript_include_tag "stat_graphs", 'data-turbolinks-track' => true %>
<% end %>
<%= render 'graph', name: @name, event: @event, count: @count %>
30 changes: 11 additions & 19 deletions app/views/admin/stats/show.html.erb
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
<% content_for :head do %>
<%= javascript_include_tag "stat_graphs", 'data-turbolinks-track' => true %>
<% end %>
<div class="stats expanded">
<div id="stats" class="stats expanded">
<div class="row">
<div class="small-12 column">
<h1><%= t "admin.stats.show.stats_title" %></h1>

<div class="row stats-numbers">
<div class="small-12 medium-3 column">
<p class="featured">
<%= t "admin.stats.show.summary.visits" %><br>
<%= link_to t("admin.stats.show.summary.visits"),
graph_admin_stats_path(id: 'visits', count: @visits) %><br>
<span class="number"><%= number_with_delimiter(@visits) %></span>
</p>
<p class="featured">
<%= t "admin.stats.show.summary.ballot_line_votes" %><br>
<span class="number"><%= number_with_delimiter(@ballot_lines) %></span>
</p>
<p class="featured">
<%= t "admin.stats.show.summary.spending_proposals" %><br>
<%= link_to t("admin.stats.show.summary.spending_proposals"),
graph_admin_stats_path(id: 'spending_proposals',
count: @spending_proposals) %><br>
<span class="number"><%= number_with_delimiter(@spending_proposals) %></span>
</p>
<p>
Expand Down Expand Up @@ -111,22 +111,14 @@
</div>

<div class="small-12 column">
<h2><%= t "admin.stats.show.visits_title" %></h2>
<%= visits_chart_tag id: "visits" %>
</div>

<div class="small-12 column">
<% @event_types.each do |event, count| %>
<h2><%= event.titleize %> (<%= count %>)</h2>
<%= events_chart_tag event %>
<% @event_types.each do |event| %>
<h3>
<%= link_to graph_link_text(event),
graph_admin_stats_path(event: event) %>
</h3>
<% end %>
</div>

<div class="small-12 column">
<h2><%= t "admin.stats.show.spending_proposals_title" %></h2>
<%= spending_proposals_chart_tag id: "spending_proposals" %>
</div>

</div>
</div>
</div>
4 changes: 4 additions & 0 deletions config/initializers/ahoy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@ def track_event(name, properties, options)
event.ip = request.ip
end
end

def exclude?
false
end
end
8 changes: 6 additions & 2 deletions config/locales/admin.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,12 @@ en:
verified_users_who_didnt_vote_proposals: Verified users who didn't votes proposals
visits: Visits
votes: Total votes
spending_proposals_title: Spending Proposals
visits_title: Visits
graph:
debate_created: Debates
spending_proposals: Investment projects
visit: Visits
level_2_user: Level 2 users
proposal_created: Citizen proposals
tags:
create: Create Topic
destroy: Destroy Topic
Expand Down
8 changes: 6 additions & 2 deletions config/locales/admin.es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,12 @@ es:
verified_users_who_didnt_vote_proposals: Usuarios verificados que no han votado propuestas
visits: Visitas
votes: Votos
spending_proposals_title: Propuestas de inversión
visits_title: Visitas
graph:
debate_created: Debates
spending_proposals: Propuestas de inversión
visit: Visitas
level_2_user: Usuarios nivel 2
proposal_created: Propuestas Ciudadanas
tags:
create: Crear Tema
destroy: Eliminar Tema
Expand Down
4 changes: 3 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,9 @@
resources :newsletters, only: :index do
get :users, on: :collection
end
resource :stats, only: :show
resource :stats, only: :show do
get :graph, on: :member
end

namespace :api do
resource :stats, only: :show
Expand Down
34 changes: 1 addition & 33 deletions spec/controllers/admin/api/stats_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,23 +31,13 @@

it 'should return single events formated for working with c3.js' do
sign_in user
get :show, events: 'foo'
get :show, event: 'foo'

expect(response).to be_ok

data = JSON.parse(response.body)
expect(data).to eq "x"=>["2015-01-01", "2015-01-02"], "Foo"=>[2, 1]
end

it 'should return combined comma separated events formated for working with c3.js' do
sign_in user
get :show, events: 'foo,bar'

expect(response).to be_ok

data = JSON.parse(response.body)
expect(data).to eq "x"=>["2015-01-01", "2015-01-02", "2015-01-03"], "Foo"=>[2, 1, 0], "Bar"=>[1, 0, 2]
end
end

context 'visits present' do
Expand All @@ -69,27 +59,5 @@
end
end

context 'visits and events present' do
it 'should return combined events and visits formated for working with c3.js' do
time_1 = DateTime.parse("2015-01-01")
time_2 = DateTime.parse("2015-01-02")

create :ahoy_event, name: 'foo', time: time_1
create :ahoy_event, name: 'foo', time: time_2
create :ahoy_event, name: 'foo', time: time_2

create :visit, started_at: time_1
create :visit, started_at: time_1
create :visit, started_at: time_2

sign_in user
get :show, events: 'foo', visits: true

expect(response).to be_ok

data = JSON.parse(response.body)
expect(data).to eq "x"=>["2015-01-01", "2015-01-02"], "Foo"=>[1, 2], "Visits"=>[2, 1]
end
end
end
end
37 changes: 36 additions & 1 deletion spec/features/admin/stats_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@

visit admin_stats_path

expect(page).to have_content "Level 2 User (1)"
expect(page).to have_content "Level two users 1"
end

context "Ballot" do
Expand All @@ -97,4 +97,39 @@

end

context "graphs" do

scenario "custom graphs", :js do
spending_proposal = create(:spending_proposal)

visit admin_stats_path

within("#stats") do
click_link "Investment projects"
end

expect(page).to have_content "Investment projects (1)"
within("#graph") do
expect(page).to have_content spending_proposal.created_at.strftime("%Y-%m-%d")
end
end

scenario "event graphs", :js do
campaign = create(:campaign)

visit root_path(track_id: campaign.track_id)
visit admin_stats_path

within("#stats") do
click_link campaign.name
end

expect(page).to have_content "#{campaign.name} (1)"
within("#graph") do
event_created_at = Ahoy::Event.where(name: campaign.name).first.time
expect(page).to have_content event_created_at.strftime("%Y-%m-%d")
end
end
end

end
8 changes: 8 additions & 0 deletions spec/features/campaigns_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@
5.times { visit root_url(track_id: @campaign2.track_id) }

visit admin_stats_path
click_link @campaign1.name

expect(page).to have_content "#{@campaign1.name} (3)"

click_link "Go back"
click_link @campaign2.name

expect(page).to have_content "#{@campaign2.name} (5)"
end

Expand All @@ -25,8 +30,11 @@
visit root_url(track_id: "999")

visit admin_stats_path
click_link @campaign1.name

expect(page).to have_content "#{@campaign1.name} (1)"

click_link "Go back"
expect(page).to_not have_content "#{@campaign2.name}"
end

Expand Down

0 comments on commit 5c99d23

Please sign in to comment.