From fabe29d2ede4e9731a2810b14df81580db8e5a8e Mon Sep 17 00:00:00 2001 From: Nishanth Vijayan Date: Sun, 21 Aug 2016 15:22:31 +0530 Subject: [PATCH 1/2] Add new page with organizer reports --- app/controllers/admin/events_controller.rb | 9 +- app/views/admin/events/reports.html.haml | 96 ++++++++++++++++++++++ app/views/layouts/_admin_sidebar.html.haml | 3 + config/routes.rb | 1 + 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 app/views/admin/events/reports.html.haml diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index abe426b8..90d9b5ba 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -5,7 +5,7 @@ module Admin load_and_authorize_resource :event, through: :program load_and_authorize_resource :events_registration, only: :toggle_attendance - before_action :get_event, except: [:index, :create] + before_action :get_event, except: [:index, :create, :reports] # FIXME: The timezome should only be applied on output, otherwise # you get lost in timezone conversions... @@ -139,6 +139,13 @@ module Admin end end + def reports + @events = @program.events + @events_commercials = Commercial.where(commercialable_type: 'Event', commercialable_id: @events.pluck(:id)) + @events_missing_commercial = @events.where.not(id: @events_commercials.pluck(:commercialable_id)) + @events_with_requirements = @events.where.not(description: ['', nil]) + end + private def event_params diff --git a/app/views/admin/events/reports.html.haml b/app/views/admin/events/reports.html.haml new file mode 100644 index 00000000..0b31f685 --- /dev/null +++ b/app/views/admin/events/reports.html.haml @@ -0,0 +1,96 @@ +.tabbable + %ul.nav.nav-tabs + %li.active + = link_to 'All Events', '#all', 'data-toggle' => 'tab' + %li + %a{href: '#missing-commercial', 'data-toggle' => 'tab'} + Events without Commercials + %span.label.label-danger{style: 'border-radius: 1em;'} + = @events_missing_commercial.length + %li + %a{href: '#requirements', 'data-toggle' => 'tab'} + Speaker Requirements + %span.label.label-success{style: 'border-radius: 1em;'} + = @events_with_requirements.length + + .tab-content + #all.tab-pane.active + .row + .col-md-12 + .page-header + %h1 + All Events + = "(#{@events.length})" + %p.text-muted + All submissions and the information that they are mssing + + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Submitter Registered + %th Submitter Biography + %th Commercial + %th Subtitle + %th Difficulty Level + - if @program.tracks.any? + %th Track + %tbody + - @events.each do |event| + %tr + - progress_status = event.progress_status + %td + = link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %br + .small (Presented by #{event.speaker_names}) + + - %w(registered biography commercials subtitle difficulty_level).each do |info| + %td{'data-order' => "#{progress_status[info]}"} + %span{class: class_for_todo(progress_status[info])} + %span{class: [icon_for_todo(progress_status[info]), 'fa-lg']} + - if @program.tracks.any? + %td{'data-order' => "#{progress_status['track']}"} + %span{class: class_for_todo(progress_status['track'])} + %span{class: [icon_for_todo(progress_status['track']), 'fa-lg']} + + #missing-commercial.tab-pane + .row + .col-md-12 + .page-header + %h1 + Events without commercials + = "(#{@events_missing_commercial.length})" + %p.text-muted + All submissions that have no commercial + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Speaker(s) + %tbody + - @events_missing_commercial.each do |event| + %tr + %td= link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %td #{event.speaker_names} + + #requirements.tab-pane + .row + .col-md-12 + .page-header + %h1 + Requirements + = "(#{@events_with_requirements.length})" + %p.text-muted + All submissions where the speakers have special requirements + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Speaker(s) + %th Requirements + %tbody + - @events_with_requirements.each do |event| + %tr + %td= link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %td #{event.speaker_names} + %td= event.description diff --git a/app/views/layouts/_admin_sidebar.html.haml b/app/views/layouts/_admin_sidebar.html.haml index 44cdb3b9..07de9893 100644 --- a/app/views/layouts/_admin_sidebar.html.haml +++ b/app/views/layouts/_admin_sidebar.html.haml @@ -84,6 +84,9 @@ - if can? :update, @conference.program.schedules.build %li{class: active_nav_li(admin_conference_schedules_path(@conference.short_title))} = link_to 'Schedules', admin_conference_schedules_path(@conference.short_title) + - if can? :update, @conference.program.events.build + %li{:class=> active_nav_li(reports_admin_conference_program_path(@conference.short_title))} + = link_to 'Reports', reports_admin_conference_program_path(@conference.short_title) - if can? :update, Registration.new(conference_id: @conference.id) %li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))} diff --git a/config/routes.rb b/config/routes.rb index fac0b4f4..a0b7a60c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -69,6 +69,7 @@ Osem::Application.routes.draw do get :vote end end + get 'reports' => 'events#reports' end resources :tickets From d9540599476f80724a872c95aee1537af13f5383 Mon Sep 17 00:00:00 2001 From: Nishanth Vijayan Date: Mon, 26 Sep 2016 17:01:39 +0530 Subject: [PATCH 2/2] Show missing speakers in reports --- app/controllers/admin/events_controller.rb | 4 +++ app/views/admin/events/reports.html.haml | 31 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index 90d9b5ba..8c1526df 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -144,6 +144,10 @@ module Admin @events_commercials = Commercial.where(commercialable_type: 'Event', commercialable_id: @events.pluck(:id)) @events_missing_commercial = @events.where.not(id: @events_commercials.pluck(:commercialable_id)) @events_with_requirements = @events.where.not(description: ['', nil]) + + attended_registrants_ids = @conference.registrations.where(attended: true).pluck(:user_id) + @missing_event_speakers = EventUser.joins(:event).where('event_role = ? and program_id = ?', 'submitter', @program.id). + where.not(user_id: attended_registrants_ids).includes(:user, :event) end private diff --git a/app/views/admin/events/reports.html.haml b/app/views/admin/events/reports.html.haml index 0b31f685..228c4d0b 100644 --- a/app/views/admin/events/reports.html.haml +++ b/app/views/admin/events/reports.html.haml @@ -13,6 +13,12 @@ %span.label.label-success{style: 'border-radius: 1em;'} = @events_with_requirements.length + %li + %a{href: '#missing-speakers', 'data-toggle' => 'tab'} + Missing Speakers + %span.label.label-danger{style: 'border-radius: 1em;'} + = @missing_event_speakers.length + .tab-content #all.tab-pane.active .row @@ -94,3 +100,28 @@ %td= link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) %td #{event.speaker_names} %td= event.description + + #missing-speakers.tab-pane + .row + .col-md-12 + .page-header + %h1 + Missing Speakers + = "(#{@missing_event_speakers.length})" + %p.text-muted + All event speakers who haven't checked in + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Speaker Name + %th Registered? + %th Event + %th Start Time + %tbody + - @missing_event_speakers.each do |speaker| + %tr + %td= speaker.user.name + %td= @conference.user_registered?(speaker.user) ? 'Yes' : 'No' + %td= link_to speaker.event.title, edit_conference_program_proposal_path(@conference.short_title, speaker.event) + - event_start_time = speaker.event.time + %td= event_start_time.present? ? event_start_time : '-'