osem-fcy/app/controllers/admin/events_controller.rb

201 lines
7.1 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2014-06-23 19:07:50 +03:00
module Admin
class EventsController < Admin::BaseController
2014-08-12 11:51:59 +03:00
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :program, through: :conference, singleton: true
load_and_authorize_resource :event, through: :program
2016-04-22 18:18:46 +03:00
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]
2018-02-22 21:23:41 -08:00
before_action :assign_tracks, only: [:index, :show, :edit]
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def index
@difficulty_levels = @program.difficulty_levels
@event_types = @program.event_types
2016-06-11 14:09:23 +02:00
@tracks_distribution_confirmed = @conference.tracks_distribution(:confirmed)
@event_distribution = @conference.event_distribution
@event_distribution_colors = Event::COLORS.values
2016-06-11 14:09:23 +02:00
@scheduled_event_distribution = @conference.scheduled_event_distribution
@file_name = "events_for_#{@conference.short_title}"
@event_export_option = params[:event_export_option]
2018-02-22 21:15:27 -08:00
@export_formats = [:pdf, :csv, :xlsx]
2014-06-23 19:07:50 +03:00
respond_to do |format|
format.html
2020-10-30 18:06:43 +09:00
# Explicitly call #to_json to avoid the use of EventSerializer
format.json { render json: Event.where(state: :confirmed, program: @program).to_json }
format.xlsx do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.xlsx\""
render 'events', layout: false
end
format.pdf { render 'events', layout: false }
format.csv do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.csv\""
render 'events', layout: false
end
2014-06-23 19:07:50 +03:00
end
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def show
@event_types = @program.event_types
2014-06-23 19:07:50 +03:00
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
2018-02-09 17:19:33 -08:00
@votes = @event.votes.includes(:user)
@difficulty_levels = @program.difficulty_levels
@versions = @event.versions |
@event.commercials.map(&:versions).flatten |
@event.votes.map(&:versions).flatten
2014-06-23 19:07:50 +03:00
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def edit
@event_types = @program.event_types
2014-06-23 19:07:50 +03:00
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
@user = @event.submitter
@url = admin_conference_program_event_path(@conference.short_title, @event)
2013-01-07 09:04:09 +01:00
end
2014-06-23 19:07:50 +03:00
def comment
comment = Comment.new(comment_params)
comment.commentable = @event
comment.user_id = current_user.id
2014-06-23 19:07:50 +03:00
comment.save!
2018-02-22 21:23:41 -08:00
comment.move_to_child_of(params[:parent]) unless params[:parent].nil?
redirect_to admin_conference_program_event_path(@conference.short_title, @event)
2014-02-23 16:09:09 +02:00
end
2014-04-19 16:40:09 +03:00
2014-06-23 19:07:50 +03:00
def update
if @event.update(event_params)
2014-12-13 21:13:19 +02:00
if request.xhr?
render js: 'index'
else
2014-12-09 21:40:34 +02:00
flash[:notice] = "Successfully updated event with ID #{@event.id}."
redirect_back_or_to(admin_conference_program_event_path(@conference.short_title, @event))
2014-12-13 21:13:19 +02:00
end
2014-06-23 19:07:50 +03:00
else
@url = admin_conference_program_event_path(@conference.short_title, @event)
flash.now[:error] = 'Update not successful. ' + @event.errors.full_messages.to_sentence
2014-12-09 21:40:34 +02:00
render :edit
2014-06-23 19:07:50 +03:00
end
end
2014-06-06 10:23:01 +02:00
def create
@url = admin_conference_program_events_path(@conference.short_title, @event)
@event.submitter = current_user
if @event.save
redirect_to admin_conference_program_events_path(@conference.short_title), notice: 'Event was successfully submitted.'
else
2017-08-28 22:31:24 +05:30
flash.now[:error] = "Could not submit proposal: #{@event.errors.full_messages.join(', ')}"
render action: 'new'
end
end
def new
@url = admin_conference_program_events_path(@conference.short_title, @event)
end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
def accept
send_mail = @event.program.conference.email_settings.send_on_accepted
subject = @event.program.conference.email_settings.accepted_subject.blank?
update_state(:accept, 'Event accepted!', true, subject, send_mail)
2014-06-23 19:07:50 +03:00
end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
def confirm
update_state(:confirm, 'Event confirmed!')
2014-06-23 19:07:50 +03:00
end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
def cancel
update_state(:cancel, 'Event canceled!')
selected_schedule = @event.program.selected_schedule
event_schedule = EventSchedule.unscoped.where(event: @event).find_by(schedule: selected_schedule) if selected_schedule
Rails.logger.debug "schedule: #{selected_schedule.inspect} and event_schedule #{event_schedule.inspect}"
if selected_schedule && event_schedule
event_schedule.enabled = false
event_schedule.save
else
@event.event_schedules.destroy_all
end
2014-06-23 19:07:50 +03:00
end
2013-08-27 12:38:57 +03:00
2014-06-23 19:07:50 +03:00
def reject
send_mail = @event.program.conference.email_settings.send_on_rejected
subject = @event.program.conference.email_settings.rejected_subject.blank?
update_state(:reject, 'Event rejected!', true, subject, send_mail)
2013-08-16 12:46:49 +03:00
end
2014-02-23 14:56:09 +02:00
2014-06-23 19:07:50 +03:00
def restart
update_state(:restart, 'Review started!')
2014-02-23 14:56:09 +02:00
end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
def vote
2018-02-09 17:19:33 -08:00
@votes = @event.votes.includes(:user)
2014-06-23 19:07:50 +03:00
2014-07-21 14:27:32 +02:00
if (votes = current_user.votes.find_by_event_id(params[:id]))
votes.update(rating: params[:rating])
2014-06-23 19:07:50 +03:00
else
@myvote = @event.votes.build
@myvote.user = current_user
@myvote.rating = params[:rating]
@myvote.save
end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
respond_to do |format|
format.html { redirect_to admin_conference_program_event_path(@conference.short_title, @event) }
2014-06-23 19:07:50 +03:00
format.js
end
2014-06-06 10:23:01 +02:00
end
2014-06-23 19:07:50 +03:00
2016-04-22 18:18:46 +03:00
def registrations
@event_registrations = @event.events_registrations
end
def toggle_attendance
@events_registration.attended = !@events_registration.attended
if @events_registration.save
head :ok
else
head :unprocessable_entity
end
end
2014-06-23 19:07:50 +03:00
private
2015-10-28 18:05:15 +02:00
def event_params
params.require(:event).permit(
# Set also in proposals controller
:title, :subtitle, :event_type_id, :abstract, :description, :require_registration, :difficulty_level_id,
# Set only in admin/events controller
:track_id, :state, :language, :is_highlight, :max_attendees,
2015-10-28 18:05:15 +02:00
# Not used anymore?
:proposal_additional_speakers, :user, :users_attributes,
speaker_ids: [])
2015-10-28 18:05:15 +02:00
end
def comment_params
params.require(:comment).permit(:body)
2015-10-28 18:05:15 +02:00
end
def update_state(transition, notice, mail = false, subject = false, send_mail = false)
alert = @event.update_state(transition, mail, subject, send_mail, params[:send_mail].blank?)
2015-10-06 14:15:38 +03:00
if alert.blank?
2014-12-09 21:40:34 +02:00
flash[:notice] = notice
redirect_back_or_to(admin_conference_program_events_path(conference_id: @conference.short_title)) && return
2015-10-06 14:15:38 +03:00
else
flash[:error] = alert
return redirect_back_or_to(admin_conference_program_events_path(conference_id: @conference.short_title)) && return
2014-06-23 19:07:50 +03:00
end
2014-06-06 10:23:01 +02:00
end
2018-02-22 21:23:41 -08:00
def assign_tracks
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
2017-08-09 18:12:20 +03:00
@tracks = Track.accessible_by(current_ability).where(program: @program).confirmed
end
2014-06-06 10:23:01 +02:00
end
2013-01-07 09:04:09 +01:00
end