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:
parent
dfd64a4510
commit
354e15a76d
12 changed files with 71 additions and 61 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 }%"}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
$("#link-#{event.id}").click(function(e) {
|
$("#link-#{event.id}").click(function(e) {
|
||||||
var url = "#{url_for(conference_program_proposal_path(@conference.short_title, event.id))}";
|
var url = "#{url_for(conference_program_proposal_path(@conference.short_title, event.id))}";
|
||||||
|
|
||||||
if(e.ctrlKey)
|
if(e.ctrlKey)
|
||||||
window.open(url,'_blank');
|
window.open(url,'_blank');
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
.lead
|
-if @event_schedule.present?
|
||||||
- if @event.state == 'confirmed' && !@event.intersecting_events.withdrawn.empty?
|
.lead
|
||||||
= "Please note that this talk replaces"
|
- if @event.state == 'confirmed' && !@event_schedule.intersecting_events.withdrawn.empty?
|
||||||
= link_to @event.intersecting_events.withdrawn.first.title,
|
= "Please note that this talk replaces"
|
||||||
conference_program_proposal_path(@conference.short_title, @event.intersecting_events.withdrawn.first.id)
|
= link_to @event_schedule.intersecting_events.withdrawn.first.event.title,
|
||||||
- elsif @event.state == 'confirmed' && !@event.intersecting_events.canceled.empty?
|
conference_program_proposal_path(@conference.short_title, @event_schedule.intersecting_events.withdrawn.first.event.id)
|
||||||
= "Please note that this talk replaces"
|
- elsif @event.state == 'confirmed' && !@event_schedule.intersecting_events.canceled.empty?
|
||||||
= link_to @event.intersecting_events.canceled.first.title,
|
= "Please note that this talk replaces"
|
||||||
conference_program_proposal_path(@conference.short_title, @event.intersecting_events.canceled.first.id)
|
= 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?
|
- 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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue