Partial to render the polls stats and model methods to get the information from DB
This commit is contained in:
@@ -1,20 +0,0 @@
|
||||
class Polls::StatsController < ApplicationController
|
||||
|
||||
before_action :load_poll
|
||||
load_and_authorize_resource :poll
|
||||
|
||||
def show
|
||||
authorize! :read_stats, @poll
|
||||
@stats = load_stats
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def load_stats
|
||||
Poll::Stats.new(@poll).generate
|
||||
end
|
||||
|
||||
def load_poll
|
||||
@poll = Poll.find_by(id: params[:id])
|
||||
end
|
||||
end
|
||||
@@ -25,6 +25,8 @@ class PollsController < ApplicationController
|
||||
|
||||
@commentable = @poll
|
||||
@comment_tree = CommentTree.new(@commentable, params[:page], @current_order)
|
||||
|
||||
@stats = Poll::Stats.new(@poll).generate
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -6,26 +6,115 @@ class Poll
|
||||
end
|
||||
|
||||
def generate
|
||||
stats = %w[total_participants total_participants_web total_participants_booth]
|
||||
stats = %w[total_participants total_participants_web total_web_valid total_web_white total_web_null
|
||||
total_participants_booth total_booth_valid total_booth_white total_booth_null
|
||||
total_valid_votes total_white_votes total_null_votes valid_percentage_web valid_percentage_booth
|
||||
total_valid_percentage white_percentage_web white_percentage_booth total_white_percentage
|
||||
null_percentage_web null_percentage_booth total_null_percentage total_participants_web_percentage
|
||||
total_participants_booth_percentage]
|
||||
stats.map { |stat_name| [stat_name.to_sym, send(stat_name)] }.to_h
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def total_participants
|
||||
stats_cache('total_participants') { voters.uniq.count }
|
||||
total_participants_web + total_participants_booth
|
||||
end
|
||||
|
||||
def total_participants_web
|
||||
stats_cache('total_participants_web') { voters.where(origin: 'web').count }
|
||||
total_web_valid + total_web_white + total_web_null
|
||||
end
|
||||
|
||||
def total_participants_web_percentage
|
||||
total_participants_web * 100 / total_participants
|
||||
end
|
||||
|
||||
def total_participants_booth
|
||||
stats_cache('total_participants_booth') { voters.where(origin: 'booth').count }
|
||||
voters.where(origin: 'booth').count
|
||||
end
|
||||
|
||||
def total_participants_booth_percentage
|
||||
(total_participants) == 0 ? 0 : total_participants_booth * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_web_valid
|
||||
voters.where(origin: 'web').count
|
||||
end
|
||||
|
||||
def valid_percentage_web
|
||||
(total_valid_votes) == 0 ? 0 : total_web_valid * 100 / total_valid_votes.to_f
|
||||
end
|
||||
|
||||
def total_web_white
|
||||
0
|
||||
end
|
||||
|
||||
def white_percentage_web
|
||||
0
|
||||
end
|
||||
|
||||
def total_web_null
|
||||
0
|
||||
end
|
||||
|
||||
def null_percentage_web
|
||||
0
|
||||
end
|
||||
|
||||
def total_booth_valid
|
||||
recounts.sum(:total_amount)
|
||||
end
|
||||
|
||||
def valid_percentage_booth
|
||||
(total_valid_votes) == 0 ? 0 : total_booth_valid * 100 / total_valid_votes.to_f
|
||||
end
|
||||
|
||||
def total_booth_white
|
||||
recounts.sum(:white_amount)
|
||||
end
|
||||
|
||||
def white_percentage_booth
|
||||
(total_white_votes) == 0 ? 0 : total_booth_white * 100 / total_white_votes.to_f
|
||||
end
|
||||
|
||||
def total_booth_null
|
||||
recounts.sum(:null_amount)
|
||||
end
|
||||
|
||||
def null_percentage_booth
|
||||
(total_null_votes == 0) ? 0 : total_booth_null * 100 / total_null_votes.to_f
|
||||
end
|
||||
|
||||
def total_valid_votes
|
||||
total_web_valid + total_booth_valid
|
||||
end
|
||||
|
||||
def total_valid_percentage
|
||||
(total_participants) == 0 ? 0 : total_valid_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_white_votes
|
||||
total_web_white + total_booth_white
|
||||
end
|
||||
|
||||
def total_white_percentage
|
||||
(total_participants) == 0 ? 0 : total_white_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def total_null_votes
|
||||
total_web_null + total_booth_null
|
||||
end
|
||||
|
||||
def total_null_percentage
|
||||
(total_participants) == 0 ? 0 : total_null_votes * 100 / total_participants.to_f
|
||||
end
|
||||
|
||||
def voters
|
||||
stats_cache('voters') { @poll.voters }
|
||||
@poll.voters
|
||||
end
|
||||
|
||||
def recounts
|
||||
@poll.recounts
|
||||
end
|
||||
|
||||
def stats_cache(key, &block)
|
||||
|
||||
20
app/views/polls/_results_subnavigation.html.erb
Normal file
20
app/views/polls/_results_subnavigation.html.erb
Normal file
@@ -0,0 +1,20 @@
|
||||
<div class="row">
|
||||
<div class="small-12 column">
|
||||
<ul class="tabs" data-tabs id="polls-tabs">
|
||||
<li class="tabs-title is-active">
|
||||
<%= link_to "#tab-stats" do %>
|
||||
<h3>
|
||||
<%= "Estadísticas" %> <!-- t("polls.show.comments_tab") -->
|
||||
</h3>
|
||||
<% end %>
|
||||
</li>
|
||||
<li class="tabs-title">
|
||||
<%= link_to "#tab-information" do %>
|
||||
<h3>
|
||||
<%= "Información" %>
|
||||
</h3>
|
||||
<% end %>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
111
app/views/polls/_show.html.erb
Normal file
111
app/views/polls/_show.html.erb
Normal file
@@ -0,0 +1,111 @@
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<%= render "callout" %>
|
||||
|
||||
<% if @poll.voted_in_booth?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_booth") %>
|
||||
</div>
|
||||
<% else %>
|
||||
|
||||
<% if current_user && !@poll.votable_by?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_web") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% @questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question, token: @token %>
|
||||
<% end %>
|
||||
|
||||
<% if poll_voter_token(@poll, current_user).empty? %>
|
||||
<div class="callout token-message js-token-message" style="display: none">
|
||||
<%= t('poll_questions.show.voted_token') %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= link_to t("polls.show.participate_in_other_polls"), polls_path, class: "button hollow" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info">
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3><%= t("polls.show.more_info_title") %></h3>
|
||||
<%= safe_html_with_links simple_format(@poll.description) %>
|
||||
</div>
|
||||
|
||||
<% if false %>
|
||||
<aside class="small-12 medium-3 column">
|
||||
<div class="sidebar-divider"></div>
|
||||
<h2><%= t("polls.show.documents") %></h2>
|
||||
</aside>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info-answers">
|
||||
<div class="row padding">
|
||||
|
||||
<% @poll_questions_answers.each do |answer| %>
|
||||
<div class="small-12 medium-6 column end" id="answer_<%= answer.id %>"
|
||||
data-toggler="medium-6 answer-divider">
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<h3><%= answer.title %></h3>
|
||||
<% end %>
|
||||
|
||||
<% if answer.images.any? %>
|
||||
<%= render "gallery", answer: answer %>
|
||||
<% end %>
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<div class="margin-top">
|
||||
<div id="answer_description_<%= answer.id %>" class="answer-description short" data-toggler="short">
|
||||
<%= safe_html_with_links simple_format(answer.description) %>
|
||||
</div>
|
||||
<div class="margin">
|
||||
<a id="read_more_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide">
|
||||
<%= t("polls.show.read_more", answer: answer.title) %>
|
||||
</a>
|
||||
<a id="read_less_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide"
|
||||
class="hide">
|
||||
<%= t("polls.show.read_less", answer: answer.title) %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.documents.present? %>
|
||||
<div class="document-link">
|
||||
<p>
|
||||
<span class="icon-document"></span>
|
||||
<strong><%= t("polls.show.documents") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.documents.each do |document| %>
|
||||
<%= link_to document.title,
|
||||
document.attachment.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="proposals-tabs" role="tablist">
|
||||
<%= render "filter_subnav" %>
|
||||
|
||||
<div class="tabs-panel is-active" id="tab-comments">
|
||||
<%= render "comments" %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,118 +28,16 @@
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= link_to "Estadísticas", custom_poll_stats_path(@poll.id) %>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="polls-tabs" role="tablist">
|
||||
<%= render "results_subnavigation" %>
|
||||
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<%= render "callout" %>
|
||||
|
||||
<% if @poll.voted_in_booth?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_booth") %>
|
||||
</div>
|
||||
<% else %>
|
||||
|
||||
<% if current_user && !@poll.votable_by?(current_user) %>
|
||||
<div class="callout warning">
|
||||
<%= t("polls.show.already_voted_in_web") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<% @questions.each do |question| %>
|
||||
<%= render 'polls/questions/question', question: question, token: @token %>
|
||||
<% end %>
|
||||
|
||||
<% if poll_voter_token(@poll, current_user).empty? %>
|
||||
<div class="callout token-message js-token-message" style="display: none">
|
||||
<%= t('poll_questions.show.voted_token') %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= link_to t("polls.show.participate_in_other_polls"), polls_path, class: "button hollow" %>
|
||||
<div id="tab-stats" class="tabs-panel is-active">
|
||||
<%= render "polls/stats/show" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info">
|
||||
<div class="row margin">
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3><%= t("polls.show.more_info_title") %></h3>
|
||||
<%= safe_html_with_links simple_format(@poll.description) %>
|
||||
</div>
|
||||
|
||||
<% if false %>
|
||||
<aside class="small-12 medium-3 column">
|
||||
<div class="sidebar-divider"></div>
|
||||
<h2><%= t("polls.show.documents") %></h2>
|
||||
</aside>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="expanded poll-more-info-answers">
|
||||
<div class="row padding">
|
||||
|
||||
<% @poll_questions_answers.each do |answer| %>
|
||||
<div class="small-12 medium-6 column end" id="answer_<%= answer.id %>"
|
||||
data-toggler="medium-6 answer-divider">
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<h3><%= answer.title %></h3>
|
||||
<% end %>
|
||||
|
||||
<% if answer.images.any? %>
|
||||
<%= render "gallery", answer: answer %>
|
||||
<% end %>
|
||||
|
||||
<% if answer.description.present? %>
|
||||
<div class="margin-top">
|
||||
<div id="answer_description_<%= answer.id %>" class="answer-description short" data-toggler="short">
|
||||
<%= safe_html_with_links simple_format(answer.description) %>
|
||||
</div>
|
||||
<div class="margin">
|
||||
<a id="read_more_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide">
|
||||
<%= t("polls.show.read_more", answer: answer.title) %>
|
||||
</a>
|
||||
<a id="read_less_<%= answer.id %>"
|
||||
data-toggle="answer_description_<%= answer.id %> read_more_<%= answer.id %> read_less_<%= answer.id %>"
|
||||
data-toggler="hide"
|
||||
class="hide">
|
||||
<%= t("polls.show.read_less", answer: answer.title) %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% if answer.documents.present? %>
|
||||
<div class="document-link">
|
||||
<p>
|
||||
<span class="icon-document"></span>
|
||||
<strong><%= t("polls.show.documents") %></strong>
|
||||
</p>
|
||||
|
||||
<% answer.documents.each do |document| %>
|
||||
<%= link_to document.title,
|
||||
document.attachment.url,
|
||||
target: "_blank",
|
||||
rel: "nofollow" %><br>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<div id="tab-information" class="tabs-panel">
|
||||
<%= render "show" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tabs-content" data-tabs-content="proposals-tabs" role="tablist">
|
||||
<%= render "filter_subnav" %>
|
||||
|
||||
<div class="tabs-panel is-active" id="tab-comments">
|
||||
<%= render "comments" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
85
app/views/polls/stats/_show.html.erb
Normal file
85
app/views/polls/stats/_show.html.erb
Normal file
@@ -0,0 +1,85 @@
|
||||
<div class="row">
|
||||
<div class="small-12 medium-3 column sidebar">
|
||||
<p><%= t("polls.show.stats.title") %></p>
|
||||
<ul class="menu vertical margin-top">
|
||||
<li><a href="#total"><%= t("polls.show.stats.total_participation") %></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="small-12 medium-9 column">
|
||||
<h3 id="total"><%= t("polls.show.stats.total_participation") %></h3>
|
||||
|
||||
<p class="stat-number margin-top">
|
||||
<%= t("polls.show.stats.total_votes") %><br>
|
||||
<span><%= @stats[:total_participants] %></span>
|
||||
</p>
|
||||
<table class="polls-total-stats">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col"><%= t("polls.show.stats.votes") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.web") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.booth") %></th>
|
||||
<th scope="col"><%= t("polls.show.stats.total") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.valid") %></th>
|
||||
<td><%= @stats[:total_web_valid] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:valid_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_valid] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:valid_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_valid_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_valid_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.white") %></th>
|
||||
<td><%= @stats[:total_web_white] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:white_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_white] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:white_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_white_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_white_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.null_votes") %></th>
|
||||
<td><%= @stats[:total_web_null] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:null_percentage_web],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_booth_null] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:null_percentage_booth],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_null_votes] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_null_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><%= t("polls.show.stats.total") %></th>
|
||||
<td><%= @stats[:total_participants_web] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_participants_web_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_participants_booth] %> <small><em>
|
||||
(<%= number_to_percentage(@stats[:total_participants_booth_percentage],
|
||||
strip_insignificant_zeros: true,
|
||||
precision: 2) %>)</em></small></td>
|
||||
<td><%= @stats[:total_participants_web] + @stats[:total_participants_booth] %></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,53 +0,0 @@
|
||||
<% cache [@stats] do %>
|
||||
<% provide :title do %>
|
||||
<%= t("polls.stats.page_title", poll: @poll.name) %>
|
||||
<% end %>
|
||||
<% provide :social_media_meta_tags do %>
|
||||
<%= render "shared/social_media_meta_tags",
|
||||
social_url: poll_url(@poll),
|
||||
social_title: @poll.name,
|
||||
social_description: @poll.description %>
|
||||
<% end %>
|
||||
|
||||
<div class="budgets-stats">
|
||||
<div class="expanded no-margin-top padding header">
|
||||
<div class="row">
|
||||
<div class="small-12 column text-center">
|
||||
<%= back_link_to polls_path %>
|
||||
<h1 class="title"><%= t("polls.stats.title") %><br><%= @poll.name %></h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aquí se empiezan a mostrar los datos -->
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<div class="callout">
|
||||
<span class="uppercase"><%= t("polls.stats.total_participants") %></span>
|
||||
<p id="total_participants" class="big-number-stat budget">
|
||||
<%= @stats[:total_participants] %>
|
||||
</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Web</td>
|
||||
<td>Booth</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><%= @stats[:total_participants_web] %></td>
|
||||
<td><%= @stats[:total_participants_booth] %></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<span class="uppercase"><%= t("polls.stats.total_votes") %></span>
|
||||
<p class="big-number-stat budget">
|
||||
<%= @stats[:total_votes] %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
@@ -497,6 +497,17 @@ en:
|
||||
read_more: "Read more about %{answer}"
|
||||
read_less: "Read less about %{answer}"
|
||||
participate_in_other_polls: Participate in other polls
|
||||
stats:
|
||||
title: "Participation data"
|
||||
total_participation: "Total participation"
|
||||
total_votes: "Total amount of given votes"
|
||||
votes: "VOTES"
|
||||
web: "WEB"
|
||||
booth: "BOOTH"
|
||||
total: "TOTAL"
|
||||
valid: "Valid"
|
||||
white: "White votes"
|
||||
null_votes: "Invalid"
|
||||
poll_questions:
|
||||
create_question: "Create question"
|
||||
default_valid_answers: "Yes, No"
|
||||
|
||||
@@ -497,6 +497,17 @@ es:
|
||||
read_more: "Leer más sobre %{answer}"
|
||||
read_less: "Leer menos sobre %{answer}"
|
||||
participate_in_other_polls: Participar en otras votaciones
|
||||
stats:
|
||||
title: "Datos de participación"
|
||||
total_participation: "Participación total"
|
||||
total_votes: "Nº total de votos emitidos"
|
||||
votes: "VOTOS"
|
||||
web: "WEB"
|
||||
booth: "URNAS"
|
||||
total: "TOTAL"
|
||||
valid: "Válidos"
|
||||
white: "En blanco"
|
||||
null_votes: "Nulos"
|
||||
poll_questions:
|
||||
create_question: "Crear pregunta para votación"
|
||||
default_valid_answers: "Sí, No"
|
||||
|
||||
Reference in New Issue
Block a user