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

195 lines
6.3 KiB
Ruby
Raw Normal View History

2014-06-23 19:07:50 +03:00
module Admin
class EventsController < ApplicationController
2014-08-12 11:51:59 +03:00
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :event, through: :conference
2014-02-23 14:56:09 +02:00
before_action :get_event, except: [:index, :create]
2014-06-23 19:07:50 +03:00
# FIXME: The timezome should only be applied on output, otherwise
# you get lost in timezone conversions...
# around_filter :set_timezone_for_this_request
2014-06-23 19:07:50 +03:00
def set_timezone_for_this_request(&block)
Time.use_zone(@conference.timezone, &block)
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def index
2014-08-12 11:51:59 +03:00
authorize! :index, @conference.events.build
@conference = Conference.find_by(short_title: params[:conference_id])
2014-06-23 19:07:50 +03:00
@events = @conference.events
@tracks = @conference.tracks
@machine_states = @events.state_machine.states.map
@event_types = @conference.event_types
@mystates = []
@mytypes = []
2014-07-21 14:27:32 +02:00
@eventstats = {}
2014-06-23 19:07:50 +03:00
@totallength = 0
@machine_states.each do |mystate|
length = 0
events_mystate = @events.where('state' => mystate.name)
if events_mystate.count > 0
@mystates << mystate
events_mystate.each do |myevent|
length += myevent.event_type.length
end
@eventstats["#{mystate.name}"] = { 'count' => events_mystate.count, 'length' => length }
2013-08-27 12:38:57 +03:00
end
end
2014-06-23 19:07:50 +03:00
@event_types.each do |mytype|
events_mytype = @events.where('event_type_id' => mytype.id)
if events_mytype.count > 0
@mytypes << mytype
end
2013-08-27 12:38:57 +03:00
end
2014-06-23 19:07:50 +03:00
@mytypes.each do |mytype|
@mystates.each do |mystate|
events_mytype = @events.where('event_type_id' => mytype.id)
events_mytype_mystate = events_mytype.where('state' => mystate.name)
typelength = 0
if events_mytype_mystate.count > 0
events_mytype_mystate.each do |myevent|
typelength += myevent.event_type.length
@totallength += myevent.event_type.length
end
2014-06-26 17:41:46 +03:00
2014-07-21 14:27:32 +02:00
if @eventstats[mytype.title].nil?
2014-06-26 17:41:46 +03:00
@eventstats[mytype.title] = { 'count' => events_mytype.count,
'length' => events_mytype.count * mytype.length }
end
2014-06-23 19:07:50 +03:00
tmp = { "#{mystate.name}" => { 'type_state_count' => events_mytype_mystate.count,
'type_state_length' => typelength } }
@eventstats[mytype.title].merge!(tmp)
2013-08-27 12:38:57 +03:00
end
end
end
2014-06-23 19:07:50 +03:00
@eventstats['totallength'] = @totallength
2013-08-27 12:38:57 +03:00
2014-06-23 19:07:50 +03:00
respond_to do |format|
format.html
# Explicity call #to_json to avoid the use of EventSerializer
format.json { render json: Event.where(state: :confirmed).to_json }
end
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def show
@tracks = @conference.tracks
@event_types = @conference.event_types
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
@ratings = @event.votes.includes(:user)
@difficulty_levels = @conference.difficulty_levels
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
def edit
@event_types = @conference.event_types
@tracks = Track.all
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
@user = @event.submitter
@url = admin_conference_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.build_from(@event, current_user.id, params[:comment])
2014-06-23 19:07:50 +03:00
comment.save!
if !params[:parent].nil?
comment.move_to_child_of(params[:parent])
end
2014-06-23 19:07:50 +03:00
redirect_to admin_conference_event_path(conference_id: @conference.short_title)
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 params.has_key? :track_id
@event.update_attribute(:track_id, params[:track_id])
end
if params.has_key? :event_type_id
@event.update_attribute(:event_type_id, params[:event_type_id])
end
if params.has_key? :difficulty_level_id
@event.update_attribute(:difficulty_level_id, params[:difficulty_level_id])
end
2014-06-26 17:41:46 +03:00
if @event.submitter.update_attributes!(params[:user]) && @event.
update_attributes!(params[:event])
2014-06-23 19:07:50 +03:00
flash[:notice] = "Successfully updated #{@event.title}."
else
flash[:notice] = 'Update not successful.'
end
2013-01-07 09:04:09 +01:00
2014-06-23 19:07:50 +03:00
redirect_back_or_to(admin_conference_event_path(@conference.short_title, @event))
end
2014-06-06 10:23:01 +02:00
def create; end
2014-06-06 10:23:01 +02:00
2014-06-23 19:07:50 +03:00
def accept
send_mail = @event.conference.email_settings.send_on_accepted
subject = @event.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!')
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.conference.email_settings.send_on_rejected
subject = @event.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
@ratings = @event.votes.includes(:user)
2014-07-21 14:27:32 +02:00
if (votes = current_user.votes.find_by_event_id(params[:id]))
2014-06-23 19:07:50 +03:00
votes.update_attributes(rating: params[:rating])
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_event_path(@conference.short_title, @event) }
format.js
end
2014-06-06 10:23:01 +02:00
end
2014-06-23 19:07:50 +03:00
private
def get_event
@event = @conference.events.find_by_id(params[:id])
if !@event
redirect_to(admin_conference_events_path(conference_id: @conference.short_title),
alert: 'Error! Could not find event!') && return
2014-06-23 19:07:50 +03:00
end
@event
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?)
if !alert.blank?
return redirect_to(admin_conference_events_path(conference_id: @conference.short_title),
alert: alert) && return
2014-06-23 19:07:50 +03:00
else
redirect_to(admin_conference_events_path(conference_id: @conference.short_title),
notice: notice) && return
2014-06-23 19:07:50 +03:00
end
2014-06-06 10:23:01 +02:00
end
end
2013-01-07 09:04:09 +01:00
end