From 01c3bfc09d2b42e1893f492121fb10639fed3aee Mon Sep 17 00:00:00 2001 From: Teal Bauer <git@teal.is> Date: Tue, 28 May 2024 22:26:21 +0200 Subject: [PATCH] stats! --- .../stylesheets/application.tailwind.css | 8 ++++ app/controllers/conferences_controller.rb | 21 ++++++++++ app/views/conferences/stats.html.erb | 39 +++++++++++++++++++ config/routes.rb | 3 +- 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 app/views/conferences/stats.html.erb diff --git a/app/assets/stylesheets/application.tailwind.css b/app/assets/stylesheets/application.tailwind.css index 46e8716..beacefe 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 8c92b12..a73bf3d 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 0000000..385c7c1 --- /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 8763f3b..cca0657 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 -- GitLab