Implement track scheduling

Add track association to schedule
Show schedules in admin sidebar to track organizers
Allow track organizers to manage the schedules of their tracks
Don't allow self-organized track events to be dragged or unscheduled in
a conference schedule
Make scheduled events of self-organized tracks appear semitransparent in
conference schedules
Make the rooms of confirmed self_organized tracks appear semitransparent
and don't allow events to be scheduled to it in the conference schedules
during the dates of its track
Create admin/SchedulesController#new action
Add a button in admin/Schedules#index to create schedules for tracks
Add self_organized scope to Track
Modify Schedules#show to handle track schedules and show a unified
schedule
Allow track organizers to create new schedules for their tracks
Correctly identify scheduled and unscheduled events in Schedules#events
Fix Event#room and Event#time for when the event is scheduled in a track
schedule
Modify Program#selected_event_schedules to include the event_schedules
of selected track schedules
Modify Track#revoke_role_and_cleanup to destroy the track's schedules
and revert its events' state to new
Add tabs for conference and track schedules in admin/Schedules#index
Add button to Create/Show a tracks schedule in Tracks#index and #show
Fix concurrent_events in application_helper because of changes in
Program#selected_event_schedules
Do not take into account cfp_active in Event#valid_track
Modify EventsController#get_tracks accordingly
Enforce cfp_active of track to be enabled for proposals in
ProposalsController#create and #update
Add support for multiple schedules per track
Add selected_schedule_id to Track
Load EventSchedules of selected track schedules for conference schedules
in admin/SchedulesController#show
Modify SchedulesController#show to take into account only the selected
track schedules
Create Event#selected_schedule_id and use it in Event#scheduled? and
Event#time
Validate that an EventSchedule for an event of a self-organized track
belongs to one of the track's schedules
Add 'Manage' button in Tracks#index, #show that sends you to the admin
side of things
Add admin/TracksController#update_selected_schedule to update the
selected_schedule_id of tracks
This commit is contained in:
AEtherC0r3 2017-08-09 18:12:20 +03:00 committed by Stella Rouzi
parent af7efdb6fe
commit 7eea930269
37 changed files with 443 additions and 118 deletions

View file

@ -45,7 +45,7 @@ describe 'User with admin role' do
let!(:my_event_schedule) { create(:event_schedule, schedule: my_schedule) }
let!(:other_event_schedule) { create(:event_schedule, schedule: other_schedule) }
let!(:my_self_organized_track) { create(:track, :self_organized, program: my_conference.program, state: 'confirmed', cfp_active: true) }
let!(:my_self_organized_track) { create(:track, :self_organized, program: my_conference.program, state: 'confirmed') }
context 'user #is_admin?' do
let(:venue) { my_conference.venue }
@ -460,8 +460,12 @@ describe 'User with admin role' do
let(:user) { create(:user, role_ids: [role.id]) }
let(:new_track) { build(:track, program: my_conference.program) }
let(:new_event) { build(:event, program: my_conference.program) }
let(:new_schedule) { build(:schedule, program: my_conference.program) }
let(:new_track_schedule) { build(:schedule, program: my_conference.program, track: new_track) }
let(:my_self_organized_track_event) { create(:event, program: my_conference.program, track: my_self_organized_track) }
let(:my_self_organized_track_event_commercial) { create(:commercial, commercialable: my_self_organized_track_event) }
let(:my_self_organized_track_schedule) { create(:schedule, program: my_conference.program, track: my_self_organized_track) }
let(:my_self_organized_track_event_schedule) { create(:event_schedule, event: my_self_organized_track_event, schedule: my_self_organized_track_schedule, room: my_self_organized_track.room) }
it{ should_not be_able_to(:new, Conference.new) }
it{ should_not be_able_to(:create, Conference.new) }
@ -532,6 +536,11 @@ describe 'User with admin role' do
it{ should be_able_to(:manage, my_self_organized_track_event) }
it{ should be_able_to(:manage, my_self_organized_track_event_commercial) }
it{ should be_able_to(:update, new_schedule) }
it{ should be_able_to(:new, new_track_schedule) }
it{ should be_able_to(:manage, my_self_organized_track_schedule) }
it{ should be_able_to(:manage, my_self_organized_track_event_schedule) }
it_behaves_like 'user with any role'
it_behaves_like 'user with non-organizer role', 'track_organizer'
end

View file

@ -46,7 +46,7 @@ describe EventSchedule do
end
end
describe '#room_of_track' do
describe '#same_room_as_track' do
before :each do
conference = create(:conference)
conference.venue = create(:venue)
@ -108,5 +108,39 @@ describe EventSchedule do
end
end
end
describe '#valid_schedule' do
before :each do
conference.venue = create(:venue)
@room = create(:room, venue: conference.venue)
track = create(:track, :self_organized, program: conference.program, room: @room, state: 'confirmed', name: 'My awesome track')
@event = create(:event, program: conference.program, track: track)
end
context 'is valid' do
it 'when the event belongs to a self-organized track and is scheduled in one of its track\'s schedules' do
schedule = create(:schedule, program: conference.program, track: @event.track)
event_schedule = build(:event_schedule, event: @event, room: @room, schedule: schedule)
expect(event_schedule.valid?).to eq true
expect(event_schedule.errors[:schedule]).to eq []
end
it 'when the event doesn\'t belong to a self-organized track' do
@event.track = nil
@event.save!
event_schedule = build(:event_schedule, event: @event, room: @room)
expect(event_schedule.valid?).to eq true
expect(event_schedule.errors[:schedule]).to eq []
end
end
context 'is invalid' do
it 'when the event belongs to a self_organized track but isn\'t scheduled in one of its schedules' do
event_schedule = build(:event_schedule, event: @event, room: @room)
expect(event_schedule.valid?).to eq false
expect(event_schedule.errors[:schedule]).to eq ['must be one of My awesome track track\'s schedules']
end
end
end
end
end

View file

@ -97,10 +97,10 @@ describe Event do
end
end
describe '#acceptable_track' do
describe '#valid_track' do
context 'is valid' do
it 'when the track belong to the same program, is confirmed and is included in the cfp' do
track = create(:track, state: 'confirmed', cfp_active: true, program: conference.program)
it 'when the track belongs to the same program and is confirmed' do
track = create(:track, state: 'confirmed', program: conference.program)
event = build(:event, program: conference.program, track: track)
expect(event.valid?).to eq true
end
@ -108,26 +108,19 @@ describe Event do
context 'is invalid' do
it 'when the track doesn\'t have the same program' do
track = create(:track, state: 'confirmed', cfp_active: true)
track = create(:track, state: 'confirmed')
event = build(:event, program: conference.program, track: track)
expect(event.valid?).to eq false
expect(event.errors[:track]).to eq ['is invalid']
end
it 'when the track is unconfirmed' do
track = create(:track, cfp_active: true, program: conference.program)
track = create(:track, program: conference.program)
allow(track).to receive(:confirmed?).and_return(false)
event = build(:event, program: conference.program, track: track)
expect(event.valid?).to eq false
expect(event.errors[:track]).to eq ['is invalid']
end
it 'when the track isn\'t included in the cfp' do
track = create(:track, state: 'confirmed', cfp_active: false, program: conference.program)
event = build(:event, program: conference.program, track: track)
expect(event.valid?).to eq false
expect(event.errors[:track]).to eq ['is invalid']
end
end
end
end
@ -382,4 +375,30 @@ describe Event do
expect(other_event.week).to eq 48
end
end
describe '#selected_schedule_id' do
before :each do
conference.program.selected_schedule = create(:schedule, program: conference.program)
end
context 'returns the program\'s selected_schedule_id' do
it 'when it doesn\'t have a track' do
create(:event_schedule, event: event, schedule: conference.program.selected_schedule)
expect(event.send(:selected_schedule_id)).to eq conference.program.selected_schedule_id
end
it 'when it belongs to a regular track' do
event.track = create(:track, program: conference.program)
expect(event.send(:selected_schedule_id)).to eq conference.program.selected_schedule_id
end
end
context 'returns the track\'s selected_schedule_id' do
it 'when it belongs to a self-organized track' do
event.track = create(:track, :self_organized, program: conference.program, state: 'confirmed')
event.track.selected_schedule = create(:schedule, program: conference.program, track: event.track)
expect(event.send(:selected_schedule_id)).to eq event.track.selected_schedule_id
end
end
end
end

View file

@ -4,6 +4,7 @@ describe Schedule do
describe 'association' do
it { should belong_to(:program) }
it { should belong_to(:track) }
it { should have_many(:event_schedules).dependent(:destroy) }
it { should have_many(:events).through(:event_schedules) }
end

View file

@ -9,7 +9,9 @@ describe Track do
it { is_expected.to belong_to(:program) }
it { is_expected.to belong_to(:submitter).class_name('User') }
it { is_expected.to belong_to(:room) }
it { is_expected.to belong_to(:selected_schedule).class_name('Schedule') }
it { is_expected.to have_many(:events) }
it { is_expected.to have_many(:schedules) }
end
describe 'validation' do
@ -145,20 +147,20 @@ describe Track do
end
context 'is valid' do
it 'when the tracks are in different rooms' do
it 'when the tracks are in different rooms at the same time' do
other_room = create(:room, venue: @conference.venue)
create(:track, :self_organized, state: 'confirmed', program: @conference.program, room: other_room, start_date: Date.current, end_date: Date.current)
track = build(:track, :self_organized, program: @conference.program, room: @room, start_date: Date.current, end_date: Date.current)
expect(track.valid?).to eq true
end
it 'when it ends before the other tracks' do
it 'when it ends before the other tracks in the same room' do
create(:track, :self_organized, state: 'confirmed', program: @conference.program, room: @room, start_date: Date.current, end_date: Date.current)
track = build(:track, :self_organized, program: @conference.program, room: @room, start_date: Date.current - 1.day, end_date: Date.current - 1.day)
expect(track.valid?).to eq true
end
it 'when it starts after the other tracks' do
it 'when it starts after the other tracks in the same room' do
create(:track, :self_organized, state: 'confirmed', program: @conference.program, room: @room, start_date: Date.current, end_date: Date.current)
track = build(:track, :self_organized, program: @conference.program, room: @room, start_date: Date.current + 1.day, end_date: Date.current + 1.day)
expect(track.valid?).to eq true
@ -166,7 +168,7 @@ describe Track do
end
context 'is invalid' do
it 'when it starts or ends with another track in the same room' do
it 'when it starts and/or ends with another track in the same room' do
create(:track, :self_organized, state: 'confirmed', program: @conference.program, room: @room, start_date: Date.current, end_date: Date.current)
track = build(:track, :self_organized, program: @conference.program, room: @room, start_date: Date.current, end_date: Date.current)
expect(track.valid?).to eq false
@ -264,6 +266,24 @@ describe Track do
expect(@program.tracks.cfp_active.include?(@non_cfp_active_track)).to eq false
end
end
describe '#self_organized' do
before :each do
@program = create(:program)
track.program = @program
track.save!
self_organized_track.program = @program
self_organized_track.save!
end
it 'includes self-organized tracks' do
expect(@program.tracks.self_organized.include?(self_organized_track)).to eq true
end
it 'excludes regular tracks' do
expect(@program.tracks.self_organized.include?(track)).to eq false
end
end
end
describe '#self_organized?' do
@ -334,7 +354,8 @@ describe Track do
self_organized_track.cfp_active = true
self_organized_track.save!
@a_track_organizer.add_role 'track_organizer', self_organized_track
@an_event_of_the_track = create(:event, program: self_organized_track.program, track: self_organized_track)
@event_of_self_organized_track = create(:event, program: self_organized_track.program, track: self_organized_track, state: 'confirmed')
@schedule_of_self_organized_track = create(:schedule, program: self_organized_track.program, track: self_organized_track)
end
it 'revokes the role of the track organizer' do
@ -343,11 +364,24 @@ describe Track do
expect(@a_track_organizer.has_role?(:track_organizer, self_organized_track)).to eq false
end
it 'removes the track from the events that have it set' do
expect(@an_event_of_the_track.track).to eq self_organized_track
it 'destroys the track\'s schedules' do
expect(Schedule.find(@schedule_of_self_organized_track.id)).to eq @schedule_of_self_organized_track
self_organized_track.revoke_role_and_cleanup
@an_event_of_the_track.reload
expect(@an_event_of_the_track.track).to eq nil
expect(Schedule.find_by(id: @schedule_of_self_organized_track.id)).to eq nil
end
it 'removes the track from the events that have it set' do
expect(@event_of_self_organized_track.track).to eq self_organized_track
self_organized_track.revoke_role_and_cleanup
@event_of_self_organized_track.reload
expect(@event_of_self_organized_track.track).to eq nil
end
it 'sets the state of the track\'s events to new' do
expect(@event_of_self_organized_track.state).to eq 'confirmed'
self_organized_track.revoke_role_and_cleanup
@event_of_self_organized_track.reload
expect(@event_of_self_organized_track.state).to eq 'new'
end
it 'is executed when the track is canceled' do
@ -355,15 +389,15 @@ describe Track do
self_organized_track.save!
self_organized_track.cancel
expect(@a_track_organizer.has_role?(:track_organizer, self_organized_track)).to eq false
@an_event_of_the_track.reload
expect(@an_event_of_the_track.track).to eq nil
@event_of_self_organized_track.reload
expect(@event_of_self_organized_track.track).to eq nil
end
it 'is executed when the track is withdrawn' do
self_organized_track.withdraw
expect(@a_track_organizer.has_role?(:track_organizer, self_organized_track)).to eq false
@an_event_of_the_track.reload
expect(@an_event_of_the_track.track).to eq nil
@event_of_self_organized_track.reload
expect(@event_of_self_organized_track.track).to eq nil
end
end