diff --git a/app/assets/stylesheets/application.tailwind.css b/app/assets/stylesheets/application.tailwind.css index 46e87162e4e6e96cd5b5cb39d50300401ef1156f..beacefe26053f5ccc759fc6d76348e2717dfa984 100644 --- a/app/assets/stylesheets/application.tailwind.css +++ b/app/assets/stylesheets/application.tailwind.css @@ -78,3 +78,11 @@ select { @apply block; } } +.conference-stats { + ul { + @apply list-disc list-inside; + li { + @apply ml-6; + } + } +} \ No newline at end of file diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 8c92b12e02a03dc45ad0f9c9c44f953b79b6be3e..a73bf3d069dbc3faaf0a3fbbaef2e0997673d7e0 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -19,4 +19,25 @@ class ConferencesController < ApplicationController def update 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 diff --git a/app/views/conferences/stats.html.erb b/app/views/conferences/stats.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..385c7c1baaa1a319c0fbe37bf146cf69ac3ddbac --- /dev/null +++ b/app/views/conferences/stats.html.erb @@ -0,0 +1,39 @@ +<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') %>–<%= 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> diff --git a/config/routes.rb b/config/routes.rb index 8763f3b43ae2a7c6a90aa860b4956c00d8dba9a4..cca06578e2f8b6c1dca1eb4c35e5c13a66128064 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,7 +21,8 @@ Rails.application.routes.draw do root "conferences#index" 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 :assignments, only: [:create, :destroy] end