Skip to content
Snippets Groups Projects
Commit 01c3bfc0 authored by Teal's avatar Teal
Browse files

stats!

parent 1c54dcf5
No related branches found
No related tags found
No related merge requests found
...@@ -78,3 +78,11 @@ select { ...@@ -78,3 +78,11 @@ select {
@apply block; @apply block;
} }
} }
.conference-stats {
ul {
@apply list-disc list-inside;
li {
@apply ml-6;
}
}
}
\ No newline at end of file
...@@ -19,4 +19,25 @@ class ConferencesController < ApplicationController ...@@ -19,4 +19,25 @@ class ConferencesController < ApplicationController
def update def update
end end
def stats
@conference = Conference.find_by(slug: params[:slug])
@relevant_stages = @conference.relevant_stages
@relevant_sessions = @conference.sessions.includes(:stage, :assignments, :speakers, assignments: :user).where(stage: @conference.relevant_stages).order(:starts_at)
@assignees = @relevant_sessions.map(&:assignments).flatten.map(&:user).uniq
@language_stats = @relevant_sessions.group_by { |s| s.language }.transform_values(&:count)
@speakers = @relevant_sessions.map(&:speakers)
@unique_speakers = @speakers.flatten.uniq.count
@speakers_per_session = @speakers.map(&:count).sum.to_f / @speakers.size.to_f
@day_stats = @relevant_sessions.group_by { |s| s.starts_at.to_date }.transform_values do |se|
{
starts_at: se.first.starts_at,
ends_at: se.last.ends_at,
sessions_count: se.count,
wall_clock_time_min: (se.last.ends_at - se.first.starts_at) / 60.0,
scheduled_time_min: se.map { |x| (x.ends_at - x.starts_at) / 60.0 }.sum
}
end
@total_stats = @day_stats.values.inject { |m, x| m.merge(x) { |k, o, n| o + n } }.slice(:sessions_count, :wall_clock_time_min, :scheduled_time_min)
end
end end
<div>
<h1>Statistics for <%= @conference.name %></h1>
<div class="conference-stats">
<ul>
<li><%= @assignees.count %> interpreters
<ul>
<% @assignees.each do |u| %>
<li><%= u.name %></li>
<% end %>
</ul>
</li>
<li><%= @relevant_stages.count %> stages</li>
<li><%= @day_stats.keys.count %> days
<ul>
<% @day_stats.each do |day, stats| %>
<li><%= day.strftime('%a %b, %Y') %>:
<%= stats[:starts_at].strftime('%H:%M') %>&ndash;<%= stats[:ends_at].strftime('%H:%M') %>,
<%= stats[:wall_clock_time_min].round %> minutes wall clock time (<%= (stats[:wall_clock_time_min] / 60.0).round(2) %> hours),
<%= stats[:scheduled_time_min].round %> minutes scheduled (<%= (stats[:scheduled_time_min] / 60.0).round(2) %> hours) in <%= stats[:sessions_count] %> sessions
</li>
<% end %>
</ul>
</li>
<li><%= @relevant_sessions.count %> sessions
<ul>
<% @language_stats.each do |language, cnt| %>
<li><%= cnt %> with language <%= language %></li>
<% end %>
</ul>
</li>
<li><%= @unique_speakers %> unique speakers
<ul>
<li>ø <%= @speakers_per_session %> speakers per session</li>
</ul>
</li>
<li><%= @total_stats[:scheduled_time_min] %> minutes of sessions (<%= (@total_stats[:scheduled_time_min] / 60.0).round(2) %> hours) scheduled total</li>
</ul>
</div>
</div>
...@@ -21,7 +21,8 @@ Rails.application.routes.draw do ...@@ -21,7 +21,8 @@ Rails.application.routes.draw do
root "conferences#index" root "conferences#index"
resources :conferences, param: :slug do resources :conferences, param: :slug do
get ':date', action: :show, on: :member, as: :date get 'stats', on: :member
get ':date', action: :show, on: :member, as: :date, date: /\d{4}-\d{2}-\d{2}/
resources :sessions, param: :ref_id do resources :sessions, param: :ref_id do
resources :assignments, only: [:create, :destroy] resources :assignments, only: [:create, :destroy]
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment