Public schedule adapted to the new relations

Public schedule and all events adapted to the new relations and models to allow having several schedules in the admin shcedule.
This commit is contained in:
Ana 2016-07-20 23:20:47 +02:00
parent dfd64a4510
commit 354e15a76d
12 changed files with 71 additions and 61 deletions

View file

@ -13,12 +13,13 @@ class ConferenceController < ApplicationController
def schedule def schedule
@rooms = @conference.venue.rooms if @conference.venue @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) redirect_to events_conference_path(@conference.short_title)
end end
@events = @conference.program.events @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 @dates = @conference.start_date..@conference.end_date
@step_minutes = EventType::LENGTH_STEP.minutes @step_minutes = EventType::LENGTH_STEP.minutes
@conf_start = 9 @conf_start = 9
@ -36,8 +37,12 @@ class ConferenceController < ApplicationController
def events def events
@dates = @conference.start_date..@conference.end_date @dates = @conference.start_date..@conference.end_date
@scheduled_events = @conference.program.events.scheduled if @program.selected_schedule.present?
@unscheduled_events = @conference.program.events.unscheduled @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 day = @conference.current_conference_day
@tag = day.strftime('%Y-%m-%d') if day @tag = day.strftime('%Y-%m-%d') if day

View file

@ -15,6 +15,7 @@ class ProposalController < ApplicationController
def show def show
# FIXME: We should show more than the first speaker # FIXME: We should show more than the first speaker
@speaker = @event.speakers.first || @event.submitter @speaker = @event.speakers.first || @event.submitter
@event_schedule = @event.selected_event_schedule
end end
def new def new

View file

@ -249,13 +249,6 @@ class Event < ActiveRecord::Base
(100 * result.values.count(true) / result.values.compact.count).to_s (100 * result.values.count(true) / result.values.compact.count).to_s
end 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 # Returns the room in which the event is scheduled
# #
@ -270,25 +263,18 @@ class Event < ActiveRecord::Base
selected_event_schedule.try(:start_time) selected_event_schedule.try(:start_time)
end 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 # returns the event_schedule for this event and the schedule given in case that it exists
def event_schedule(schedule_id) def event_schedule(schedule_id)
event_schedules.find_by(schedule_id: schedule_id) event_schedules.find_by(schedule_id: schedule_id)
end end
private
# returns the event_schedule for this event and for the selected_schedule # returns the event_schedule for this event and for the selected_schedule
def selected_event_schedule def selected_event_schedule
event_schedules.find_by(schedule_id: program.try(:selected_schedule)) event_schedules.find_by(schedule_id: program.try(:selected_schedule))
end end
private
## ##
# Do not allow, for the event, more attendees than the size of the room # Do not allow, for the event, more attendees than the size of the room
def max_attendees_no_more_than_room_size def max_attendees_no_more_than_room_size

View file

@ -3,7 +3,25 @@ class EventSchedule < ActiveRecord::Base
belongs_to :event belongs_to :event
belongs_to :room 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 def room_guid
room.try(:guid) room.try(:guid)
end 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 end

View file

@ -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) 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 end
def unscheduled(schedule_id=nil) def unscheduled(schedule_id)
select{ |e| e.unscheduled?(schedule_id) } select{ |e| e.unscheduled?(schedule_id) }
end end

View file

@ -27,22 +27,21 @@
%td.room{ style: "height: #{ td_height(@rooms) }px;" } %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.elipsis.break-words{ style: "-webkit-line-clamp: #{ room_lines(@rooms) }; height: #{ room_height(@rooms) }px;" }
= room.name = 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| - (1..intervals).each do |i|
- if span > 1 - if span > 1
- span -= 1 - span -= 1
- else - 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? - if event_schedule
- 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
/ There is an event, calculate the span and show it / 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) - 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 - else
/ if span equals 1 show an empty td / if span equals 1 show an empty td
%td.no-padding{ width: "#{ width }%"} %td.no-padding{ width: "#{ width }%"}

View file

@ -14,17 +14,17 @@
%p %p
= truncate(event.abstract, :length => 400) = truncate(event.abstract, :length => 400)
= link_to 'more', conference_program_proposal_path(@conference.short_title, event.id) if 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.track
%span.fa.fa-clock-o %span.fa.fa-clock-o
%span.label{ style: "background-color: grey" } %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.track
%span.fa.fa-map-marker %span.fa.fa-map-marker
%span.label{ style: "background-color: grey" } %span.label{ style: "background-color: grey" }
= event.room.name = event_schedule.room.name
- if event.track - if event.track
%span.track %span.track
%span.fa.fa-road %span.fa.fa-road

View file

@ -7,7 +7,7 @@
- if event.state == 'canceled' || event.state == 'withdrawn' - if event.state == 'canceled' || event.state == 'withdrawn'
%span.label.label-danger.schedule-label CANCELED %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 %span.label.label-info.schedule-label REPLACEMENT
= event.title = event.title

View file

@ -1,5 +1,5 @@
.container#program .container#program
-if @scheduled_events.any? -if @events_schedules.any?
= render partial: 'schedule_tabs', locals: { active: 'program' } = render partial: 'schedule_tabs', locals: { active: 'program' }
%h1.text-center %h1.text-center
@ -22,24 +22,24 @@
/ scheduled events / scheduled events
- date = nil - date = nil
- time = nil - time = nil
- @scheduled_events.each do |event| - @events_schedules.each do |event_schedule|
- unless event.start_time.strftime('%Y-%m-%d').eql?(date) - unless event_schedule.start_time.strftime('%Y-%m-%d').eql?(date)
.col-xs-12.col-md-12 .col-xs-12.col-md-12
.date-content .date-content
%span{ class: 'date-title', id: "#{ event.start_time.strftime('%Y-%m-%d') }" } %span{ class: 'date-title', id: "#{ event_schedule.start_time.strftime('%Y-%m-%d') }" }
= date = event.start_time.strftime('%Y-%m-%d') = date = event_schedule.start_time.strftime('%Y-%m-%d')
%a{ title: "Go up", class: "pull-right", href: "#program" } %a{ title: "Go up", class: "pull-right", href: "#program" }
%i{ class: "fa fa-angle-double-up fa-lg", 'aria-hidden' => true } %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 .col-xs-12.col-md-1
.start-time .start-time
= time = event.start_time.strftime('%H:%M') = time = event_schedule.start_time.strftime('%H:%M')
.col-xs-12.col-md-11 .col-xs-12.col-md-11
.new-time-event .new-time-event
= render partial: 'event', locals: {event: event} = render partial: 'event', locals: { event: event_schedule.event, event_schedule: event_schedule }
- else - else
.col-xs-12.col-md-11.col-md-offset-1 .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 / confirmed events that are not scheduled
- if @unscheduled_events.any? - if @unscheduled_events.any?
@ -52,7 +52,7 @@
- @unscheduled_events.each do |event| - @unscheduled_events.each do |event|
.col-xs-12.col-md-12 .col-xs-12.col-md-12
.unscheduled-event .unscheduled-event
= render partial: 'event', locals: {event: event} = render partial: 'event', locals: { event: event, event_schedule: nil }
:javascript :javascript
$('.program-selector').on('click', function(e) { $('.program-selector').on('click', function(e) {

View file

@ -16,8 +16,8 @@
%room{ name: room.name } %room{ name: room.name }
- events_in_rooms[room].each do |event| - events_in_rooms[room].each do |event|
%event{ guid: event.guid, id: event.id } %event{ guid: event.guid, id: event.id }
%date= event.start_time.iso8601 %date= event.scheduled_start_time.iso8601
%start= event.start_time.strftime('%H:%M') %start= event.scheduled_start_time.strftime('%H:%M')
%duration= length_timestamp(event.event_type.length) %duration= length_timestamp(event.event_type.length)
%room= event.scheduled_room.name %room= event.scheduled_room.name
%type= event.event_type.name %type= event.event_type.name

View file

@ -17,7 +17,7 @@
- if @event.state == 'canceled' || @event.state == 'withdrawn' - if @event.state == 'canceled' || @event.state == 'withdrawn'
%span.label.label-danger CANCELED %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 %span.label.label-info REPLACEMENT
.row .row
@ -40,15 +40,16 @@
.col-md-9 .col-md-9
.row .row
.col-md-12 .col-md-12
-if @event_schedule.present?
.lead .lead
- if @event.state == 'confirmed' && !@event.intersecting_events.withdrawn.empty? - if @event.state == 'confirmed' && !@event_schedule.intersecting_events.withdrawn.empty?
= "Please note that this talk replaces" = "Please note that this talk replaces"
= link_to @event.intersecting_events.withdrawn.first.title, = link_to @event_schedule.intersecting_events.withdrawn.first.event.title,
conference_program_proposal_path(@conference.short_title, @event.intersecting_events.withdrawn.first.id) conference_program_proposal_path(@conference.short_title, @event_schedule.intersecting_events.withdrawn.first.event.id)
- elsif @event.state == 'confirmed' && !@event.intersecting_events.canceled.empty? - elsif @event.state == 'confirmed' && !@event_schedule.intersecting_events.canceled.empty?
= "Please note that this talk replaces" = "Please note that this talk replaces"
= link_to @event.intersecting_events.canceled.first.title, = link_to @event_schedule.intersecting_events.canceled.first.title,
conference_program_proposal_path(@conference.short_title, @event.intersecting_events.canceled.first.id) conference_program_proposal_path(@conference.short_title, @event_schedule.intersecting_events.canceled.first.event.id)
- if @event.commercials.empty? - if @event.commercials.empty?
%h5.text-warning %h5.text-warning
@ -67,7 +68,7 @@
%dl#proposal-info %dl#proposal-info
.col-md-12 .col-md-12
%dt Date: %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 .col-md-12
%dt Duration: %dt Duration:
%dd= show_time(@event.event_type.length) %dd= show_time(@event.event_type.length)

View file

@ -39,8 +39,8 @@ describe ConferenceController do
it 'assigns variables' do it 'assigns variables' do
expect(assigns(:conference)).to eq conference expect(assigns(:conference)).to eq conference
expect(assigns(:events_xml)).to eq conference.program.events.scheduled. 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')
group_by{ |event| event.start_time.to_date } .order(start_time: :asc).map(&:event).group_by{ |event| event.scheduled_start_time.to_date }
end end
it 'renders successfully' do it 'renders successfully' do