diff --git a/app/controllers/conference_controller.rb b/app/controllers/conference_controller.rb index 1dc1ded8..146fca38 100644 --- a/app/controllers/conference_controller.rb +++ b/app/controllers/conference_controller.rb @@ -13,12 +13,13 @@ class ConferenceController < ApplicationController def schedule @rooms = @conference.venue.rooms if @conference.venue - unless @conference.program.events.scheduled.any? + unless @program.selected_schedule.present? && @program.events.scheduled(@program.selected_schedule).any? redirect_to events_conference_path(@conference.short_title) end @events = @conference.program.events - @events_xml = @events.scheduled.order(start_time: :asc).group_by{ |event| event.start_time.to_date } + @events_xml = @program.schedules.find(program.selected_schedule).event_schedules.where('start_time IS NOT NULL AND room_id IS NOT NULL').order(start_time: :asc) + .map(&:event).group_by{ |event| event.scheduled_start_time.to_date } if program.selected_schedule.present? @dates = @conference.start_date..@conference.end_date @step_minutes = EventType::LENGTH_STEP.minutes @conf_start = 9 @@ -36,8 +37,12 @@ class ConferenceController < ApplicationController def events @dates = @conference.start_date..@conference.end_date - @scheduled_events = @conference.program.events.scheduled - @unscheduled_events = @conference.program.events.unscheduled + if @program.selected_schedule.present? + @events_schedules = @program.schedules.find(@program.selected_schedule).event_schedules.where('start_time IS NOT NULL AND room_id IS NOT NULL').order(start_time: :asc) + else + @events_schedules = [] + end + @unscheduled_events = @program.events.unscheduled(@program.selected_schedule.id) day = @conference.current_conference_day @tag = day.strftime('%Y-%m-%d') if day diff --git a/app/controllers/proposal_controller.rb b/app/controllers/proposal_controller.rb index db511fe7..e9cd028e 100644 --- a/app/controllers/proposal_controller.rb +++ b/app/controllers/proposal_controller.rb @@ -15,6 +15,7 @@ class ProposalController < ApplicationController def show # FIXME: We should show more than the first speaker @speaker = @event.speakers.first || @event.submitter + @event_schedule = @event.selected_event_schedule end def new diff --git a/app/models/event.rb b/app/models/event.rb index e46384d0..807339ee 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -249,13 +249,6 @@ class Event < ActiveRecord::Base (100 * result.values.count(true) / result.values.compact.count).to_s end - ## - # Returns end of the event - # - def end_time - self.scheduled_start_time + self.event_type.length.minutes - end - ## # Returns the room in which the event is scheduled # @@ -270,25 +263,18 @@ class Event < ActiveRecord::Base selected_event_schedule.try(:start_time) end - ## - # Returns events that are scheduled in the same room and start_time as event - # - def intersecting_events - room.events.where(start_time: start_time).where.not(id: id) - end - # returns the event_schedule for this event and the schedule given in case that it exists def event_schedule(schedule_id) event_schedules.find_by(schedule_id: schedule_id) end - private - # returns the event_schedule for this event and for the selected_schedule def selected_event_schedule event_schedules.find_by(schedule_id: program.try(:selected_schedule)) end + private + ## # Do not allow, for the event, more attendees than the size of the room def max_attendees_no_more_than_room_size diff --git a/app/models/event_schedule.rb b/app/models/event_schedule.rb index 7aa8db45..157a478e 100644 --- a/app/models/event_schedule.rb +++ b/app/models/event_schedule.rb @@ -3,7 +3,25 @@ class EventSchedule < ActiveRecord::Base belongs_to :event belongs_to :room + scope :confirmed, -> { joins(:event).where('state = ?', 'confirmed') } + scope :canceled, -> { joins(:event).where('state = ?', 'canceled') } + scope :withdrawn, -> { joins(:event).where('state = ?', 'withdrawn') } + def room_guid room.try(:guid) end + + ## + # Returns end of the event + # + def end_time + start_time + event.event_type.length.minutes + end + + ## + # Returns events that are scheduled in the same room and start_time as event + # + def intersecting_events + room.event_schedules.where(start_time: start_time, schedule: schedule).where.not(id: id) + end end diff --git a/app/models/program.rb b/app/models/program.rb index 8258c9a4..a1f22c74 100644 --- a/app/models/program.rb +++ b/app/models/program.rb @@ -31,7 +31,7 @@ class Program < ActiveRecord::Base joins(:event_schedules).where('event_schedules.schedule_id = ? AND event_schedules.start_time IS NOT NULL AND event_schedules.room_id IS NOT NULL', schedule_id) end - def unscheduled(schedule_id=nil) + def unscheduled(schedule_id) select{ |e| e.unscheduled?(schedule_id) } end diff --git a/app/views/conference/_carousel.html.haml b/app/views/conference/_carousel.html.haml index 33826939..1f4b9a61 100644 --- a/app/views/conference/_carousel.html.haml +++ b/app/views/conference/_carousel.html.haml @@ -27,22 +27,21 @@ %td.room{ style: "height: #{ td_height(@rooms) }px;" } .room.elipsis.break-words{ style: "-webkit-line-clamp: #{ room_lines(@rooms) }; height: #{ room_height(@rooms) }px;" } = room.name - - events = room.events{ |e| e.start_time >= start_time and e.start_time < (start_time + number_columns.hour)} + - event_schedules = room.event_schedules.select{ |e| (e.schedule_id == @conference.program.selected_schedule) && (e.start_time >= start_time) && (e.start_time < (start_time + number_columns.hour)) } - (1..intervals).each do |i| - if span > 1 - span -= 1 - else - - event = events.find{|e| e.start_time <= start_room_time and e.end_time > start_room_time} + - event_schedule = event_schedules.find{ |e| e.start_time <= start_room_time and e.end_time > start_room_time } + - if event_schedule && (event_schedule.event.state == 'canceled' || event_schedule.event.state == 'withdrawn') && !event_schedule.intersecting_events.confirmed.empty? + - replacement_event = event_schedule.intersecting_events.confirmed.first + - event_schedule = (replacement_event.start_time <= start_room_time && replacement_event.end_time > start_room_time) ? replacement_event : nil - - if event && (event.state == 'canceled' || event.state == 'withdrawn') && !event.intersecting_events.confirmed.empty? - - replacement_event = event.intersecting_events.confirmed.first - - event = (replacement_event.start_time <= start_room_time && replacement_event.end_time > start_room_time) ? replacement_event : nil - - - if event + - if event_schedule / There is an event, calculate the span and show it - - event_span = (event.end_time.to_i - start_room_time.to_i) / 60 / EventType::LENGTH_STEP + - event_span = (event_schedule.end_time.to_i - start_room_time.to_i) / 60 / EventType::LENGTH_STEP - span = ((event_span + i - 1 ) > intervals ? intervals + 1 - i : event_span) - = render partial: 'schedule_item', locals: {event: event, span: span, width: width} + = render partial: 'schedule_item', locals: {event: event_schedule.event, event_schedule: event_schedule, span: span, width: width} - else / if span equals 1 show an empty td %td.no-padding{ width: "#{ width }%"} diff --git a/app/views/conference/_event.html.haml b/app/views/conference/_event.html.haml index fe849737..1be0e685 100644 --- a/app/views/conference/_event.html.haml +++ b/app/views/conference/_event.html.haml @@ -14,17 +14,17 @@ %p = truncate(event.abstract, :length => 400) = link_to 'more', conference_program_proposal_path(@conference.short_title, event.id) if event.abstract.length > 400 - - if event.scheduled? + - if event_schedule.present? %span.track %span.fa.fa-clock-o %span.label{ style: "background-color: grey" } - = event.start_time.strftime('%H:%M') + = event_schedule.start_time.strftime('%H:%M') \- - = event.end_time.strftime('%H:%M') + = event_schedule.end_time.strftime('%H:%M') %span.track %span.fa.fa-map-marker %span.label{ style: "background-color: grey" } - = event.room.name + = event_schedule.room.name - if event.track %span.track %span.fa.fa-road @@ -35,7 +35,7 @@ $("#link-#{event.id}").click(function(e) { var url = "#{url_for(conference_program_proposal_path(@conference.short_title, event.id))}"; - + if(e.ctrlKey) window.open(url,'_blank'); else diff --git a/app/views/conference/_schedule_item.html.haml b/app/views/conference/_schedule_item.html.haml index 10e76c97..5d3f97c6 100644 --- a/app/views/conference/_schedule_item.html.haml +++ b/app/views/conference/_schedule_item.html.haml @@ -7,7 +7,7 @@ - if event.state == 'canceled' || event.state == 'withdrawn' %span.label.label-danger.schedule-label CANCELED - - elsif event.state == 'confirmed' && (!event.intersecting_events.canceled.empty? || !event.intersecting_events.withdrawn.empty?) + - elsif event.state == 'confirmed' && (!event_schedule.intersecting_events.canceled.empty? || !event_schedule.intersecting_events.withdrawn.empty?) %span.label.label-info.schedule-label REPLACEMENT = event.title diff --git a/app/views/conference/events.html.haml b/app/views/conference/events.html.haml index d011390d..24092ec2 100644 --- a/app/views/conference/events.html.haml +++ b/app/views/conference/events.html.haml @@ -1,5 +1,5 @@ .container#program - -if @scheduled_events.any? + -if @events_schedules.any? = render partial: 'schedule_tabs', locals: { active: 'program' } %h1.text-center @@ -22,24 +22,24 @@ / scheduled events - date = nil - time = nil - - @scheduled_events.each do |event| - - unless event.start_time.strftime('%Y-%m-%d').eql?(date) + - @events_schedules.each do |event_schedule| + - unless event_schedule.start_time.strftime('%Y-%m-%d').eql?(date) .col-xs-12.col-md-12 .date-content - %span{ class: 'date-title', id: "#{ event.start_time.strftime('%Y-%m-%d') }" } - = date = event.start_time.strftime('%Y-%m-%d') + %span{ class: 'date-title', id: "#{ event_schedule.start_time.strftime('%Y-%m-%d') }" } + = date = event_schedule.start_time.strftime('%Y-%m-%d') %a{ title: "Go up", class: "pull-right", href: "#program" } %i{ class: "fa fa-angle-double-up fa-lg", 'aria-hidden' => true } - - unless event.start_time.strftime('%H:%M').eql?(time) + - unless event_schedule.start_time.strftime('%H:%M').eql?(time) .col-xs-12.col-md-1 .start-time - = time = event.start_time.strftime('%H:%M') + = time = event_schedule.start_time.strftime('%H:%M') .col-xs-12.col-md-11 .new-time-event - = render partial: 'event', locals: {event: event} + = render partial: 'event', locals: { event: event_schedule.event, event_schedule: event_schedule } - else .col-xs-12.col-md-11.col-md-offset-1 - = render partial: 'event', locals: {event: event} + = render partial: 'event', locals: { event: event_schedule.event, event_schedule: event_schedule } / confirmed events that are not scheduled - if @unscheduled_events.any? @@ -52,7 +52,7 @@ - @unscheduled_events.each do |event| .col-xs-12.col-md-12 .unscheduled-event - = render partial: 'event', locals: {event: event} + = render partial: 'event', locals: { event: event, event_schedule: nil } :javascript $('.program-selector').on('click', function(e) { diff --git a/app/views/conference/schedule.xml.haml b/app/views/conference/schedule.xml.haml index e85ddf14..72c6ca88 100644 --- a/app/views/conference/schedule.xml.haml +++ b/app/views/conference/schedule.xml.haml @@ -16,8 +16,8 @@ %room{ name: room.name } - events_in_rooms[room].each do |event| %event{ guid: event.guid, id: event.id } - %date= event.start_time.iso8601 - %start= event.start_time.strftime('%H:%M') + %date= event.scheduled_start_time.iso8601 + %start= event.scheduled_start_time.strftime('%H:%M') %duration= length_timestamp(event.event_type.length) %room= event.scheduled_room.name %type= event.event_type.name diff --git a/app/views/proposal/show.html.haml b/app/views/proposal/show.html.haml index aaa1d379..2eedf981 100644 --- a/app/views/proposal/show.html.haml +++ b/app/views/proposal/show.html.haml @@ -17,7 +17,7 @@ - if @event.state == 'canceled' || @event.state == 'withdrawn' %span.label.label-danger CANCELED - - elsif @event.state == 'confirmed' && (!@event.intersecting_events.canceled.empty? || !@event.intersecting_events.withdrawn.empty?) + - elsif @event.state == 'confirmed' && @event_schedule.present? && (!@event_schedule.intersecting_events.canceled.empty? || !@event_schedule.intersecting_events.withdrawn.empty?) %span.label.label-info REPLACEMENT .row @@ -40,15 +40,16 @@ .col-md-9 .row .col-md-12 - .lead - - if @event.state == 'confirmed' && !@event.intersecting_events.withdrawn.empty? - = "Please note that this talk replaces" - = link_to @event.intersecting_events.withdrawn.first.title, - conference_program_proposal_path(@conference.short_title, @event.intersecting_events.withdrawn.first.id) - - elsif @event.state == 'confirmed' && !@event.intersecting_events.canceled.empty? - = "Please note that this talk replaces" - = link_to @event.intersecting_events.canceled.first.title, - conference_program_proposal_path(@conference.short_title, @event.intersecting_events.canceled.first.id) + -if @event_schedule.present? + .lead + - if @event.state == 'confirmed' && !@event_schedule.intersecting_events.withdrawn.empty? + = "Please note that this talk replaces" + = link_to @event_schedule.intersecting_events.withdrawn.first.event.title, + conference_program_proposal_path(@conference.short_title, @event_schedule.intersecting_events.withdrawn.first.event.id) + - elsif @event.state == 'confirmed' && !@event_schedule.intersecting_events.canceled.empty? + = "Please note that this talk replaces" + = link_to @event_schedule.intersecting_events.canceled.first.title, + conference_program_proposal_path(@conference.short_title, @event_schedule.intersecting_events.canceled.first.event.id) - if @event.commercials.empty? %h5.text-warning @@ -67,7 +68,7 @@ %dl#proposal-info .col-md-12 %dt Date: - %dd= @event.scheduled_start_time.strftime("%Y %B %e %H:%M") if @event.scheduled_start_time.present? + %dd= @event_schedule.start_time.strftime("%Y %B %e %H:%M") if @event_schedule.try(:start_time) .col-md-12 %dt Duration: %dd= show_time(@event.event_type.length) diff --git a/spec/controllers/conference_controller_spec.rb b/spec/controllers/conference_controller_spec.rb index 1a766232..856d618d 100644 --- a/spec/controllers/conference_controller_spec.rb +++ b/spec/controllers/conference_controller_spec.rb @@ -39,8 +39,8 @@ describe ConferenceController do it 'assigns variables' do expect(assigns(:conference)).to eq conference - expect(assigns(:events_xml)).to eq conference.program.events.scheduled. - group_by{ |event| event.start_time.to_date } + expect(assigns(:events_xml)).to eq conference.program.schedules.find(conference.program.selected_schedule).event_schedules.where('start_time IS NOT NULL AND room_id IS NOT NULL') + .order(start_time: :asc).map(&:event).group_by{ |event| event.scheduled_start_time.to_date } end it 'renders successfully' do