Allow the track organizer to manage events

He/She can manage the events of his/her tracks and their commercials
This commit is contained in:
AEtherC0r3 2017-08-09 14:53:27 +03:00 committed by Stella Rouzi
parent a87c6e55f7
commit af7efdb6fe
4 changed files with 34 additions and 9 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

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') }
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