diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index c93c3892..2d7af60e 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -4,6 +4,10 @@ module Admin load_and_authorize_resource :program, through: :conference, singleton: true load_and_authorize_resource :event, through: :program load_and_authorize_resource :events_registration, only: :toggle_attendance + # For some reason this doesn't work, so a workaround is used + # load_and_authorize_resource :track, through: :program, only: [:index, :show, :edit] + + before_action :get_tracks, only: [:index, :show, :edit] # FIXME: The timezome should only be applied on output, otherwise # you get lost in timezone conversions... @@ -14,7 +18,6 @@ module Admin end def index - @tracks = @program.tracks.confirmed.cfp_active @difficulty_levels = @program.difficulty_levels @event_types = @program.event_types @tracks_distribution_confirmed = @conference.tracks_distribution(:confirmed) @@ -40,7 +43,6 @@ module Admin end def show - @tracks = @program.tracks.confirmed.cfp_active @event_types = @program.event_types @comments = @event.root_comments @comment_count = @event.comment_threads.count @@ -55,7 +57,6 @@ module Admin def edit @event_types = @program.event_types - @tracks = @program.tracks.confirmed.cfp_active @comments = @event.root_comments @comment_count = @event.comment_threads.count @user = @event.submitter @@ -195,5 +196,9 @@ module Admin return redirect_back_or_to(admin_conference_program_events_path(conference_id: @conference.short_title)) && return end end + + def get_tracks + @tracks = Track.accessible_by(current_ability).where(program: @program).confirmed.cfp_active + end end end diff --git a/app/models/admin_ability.rb b/app/models/admin_ability.rb index e8b8d098..af0f80eb 100644 --- a/app/models/admin_ability.rb +++ b/app/models/admin_ability.rb @@ -298,5 +298,14 @@ class AdminAbility can :toggle_user, Role do |role| role.resource_type == 'Track' && track_ids_for_track_organizer.include?(role.resource_id) end + + # Show Events in the admin sidebar + can :update, Event do |event| + event.new_record? && conf_ids_for_track_organizer.include?(event.program.conference_id) + end + + can :manage, Event, track_id: track_ids_for_track_organizer + can :manage, Commercial, commercialable_type: 'Event', + commercialable_id: Event.where(track_id: track_ids_for_track_organizer).pluck(:id) end end diff --git a/spec/features/track_organizer_ability_spec.rb b/spec/features/track_organizer_ability_spec.rb index 91c0b55a..69b4d3e5 100644 --- a/spec/features/track_organizer_ability_spec.rb +++ b/spec/features/track_organizer_ability_spec.rb @@ -4,7 +4,7 @@ feature 'Has correct abilities' do let(:organization) { create(:organization) } let(:conference) { create(:full_conference, organization: organization) } - let(:self_organized_track) { create(:track, :self_organized, program: conference.program) } + let(:self_organized_track) { create(:track, :self_organized, program: conference.program, state: 'confirmed', cfp_active: true) } let(:role_track_organizer) { Role.where(name: 'track_organizer', resource: self_organized_track).first_or_create } let(:user_track_organizer) { create(:user, role_ids: [role_track_organizer.id]) } @@ -28,12 +28,12 @@ feature 'Has correct abilities' do expect(page).to_not have_link('Lodgings', href: "/admin/conferences/#{conference.short_title}/lodgings") expect(page).to have_link('Program', href: "/admin/conferences/#{conference.short_title}/program") expect(page).to_not have_link('Call for Papers', href: "/admin/conferences/#{conference.short_title}/program/cfps") - expect(page).to_not have_link('Events', href: "/admin/conferences/#{conference.short_title}/program/events") + expect(page).to have_link('Events', href: "/admin/conferences/#{conference.short_title}/program/events") expect(page).to have_link('Tracks', href: "/admin/conferences/#{conference.short_title}/program/tracks") expect(page).to_not have_link('Event Types', href: "/admin/conferences/#{conference.short_title}/program/event_types") expect(page).to_not have_link('Difficulty Levels', href: "/admin/conferences/#{conference.short_title}/program/difficulty_levels") expect(page).to_not have_link('Schedules', href: "/admin/conferences/#{conference.short_title}/schedules") - expect(page).to_not have_link('Reports', href: "/admin/conferences/#{conference.short_title}/program/reports") + expect(page).to have_link('Reports', href: "/admin/conferences/#{conference.short_title}/program/reports") expect(page).to_not have_link('Registrations', href: "/admin/conferences/#{conference.short_title}/registrations") expect(page).to_not have_link('Registration Period', href: "/admin/conferences/#{conference.short_title}/registration_period") expect(page).to_not have_link('Questions', href: "/admin/conferences/#{conference.short_title}/questions") @@ -101,12 +101,16 @@ feature 'Has correct abilities' do expect(current_path).to eq root_path visit admin_conference_program_events_path(conference.short_title) - expect(current_path).to eq root_path + expect(current_path).to eq admin_conference_program_events_path(conference.short_title) create(:event, program: conference.program) visit edit_admin_conference_program_event_path(conference.short_title, conference.program.events.first) expect(current_path).to eq root_path + self_organized_track_event = create(:event, program: conference.program, track: self_organized_track) + visit edit_admin_conference_program_event_path(conference.short_title, self_organized_track_event) + expect(current_path).to eq(edit_admin_conference_program_event_path(conference.short_title, self_organized_track_event)) + visit admin_conference_program_event_types_path(conference.short_title) expect(current_path).to eq root_path @@ -219,7 +223,7 @@ feature 'Has correct abilities' do expect(current_path).to eq admin_conference_program_track_path(conference.short_title, self_organized_track) visit edit_admin_conference_program_track_path(conference.short_title, self_organized_track) - expect(current_path).to eq edit_admin_conference_program_track_path(conference.short_title, self_organized_track) + expect(current_path).to eq root_path visit admin_conference_roles_path(conference.short_title) expect(current_path).to eq admin_conference_roles_path(conference.short_title) diff --git a/spec/models/admin_ability_spec.rb b/spec/models/admin_ability_spec.rb index f148b2ae..126668fa 100644 --- a/spec/models/admin_ability_spec.rb +++ b/spec/models/admin_ability_spec.rb @@ -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') } + let!(:my_self_organized_track) { create(:track, :self_organized, program: my_conference.program, state: 'confirmed', cfp_active: true) } context 'user #is_admin?' do let(:venue) { my_conference.venue } @@ -459,6 +459,9 @@ describe 'User with admin role' do let(:role) { Role.where(name: 'track_organizer', resource: my_self_organized_track).first_or_create } 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(: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) } it{ should_not be_able_to(:new, Conference.new) } it{ should_not be_able_to(:create, Conference.new) } @@ -525,6 +528,10 @@ describe 'User with admin role' do it{ should_not be_able_to(:assign_org_admins, organization) } it{ should_not be_able_to(:unassign_org_admins, organization) } + it{ should be_able_to(:update, new_event) } + it{ should be_able_to(:manage, my_self_organized_track_event) } + it{ should be_able_to(:manage, my_self_organized_track_event_commercial) } + it_behaves_like 'user with any role' it_behaves_like 'user with non-organizer role', 'track_organizer' end