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
|
||||
@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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }%"}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue