mirror of
https://github.com/openSUSE/osem.git
synced 2026-02-05 19:51:11 -05:00
192 lines
6.2 KiB
Ruby
192 lines
6.2 KiB
Ruby
module Admin
|
|
class EventsController < Admin::BaseController
|
|
load_and_authorize_resource :conference, find_by: :short_title
|
|
load_and_authorize_resource :event, through: :conference
|
|
|
|
before_action :get_event, except: [:index, :create]
|
|
|
|
# FIXME: The timezome should only be applied on output, otherwise
|
|
# you get lost in timezone conversions...
|
|
# around_filter :set_timezone_for_this_request
|
|
|
|
def set_timezone_for_this_request(&block)
|
|
Time.use_zone(@conference.timezone, &block)
|
|
end
|
|
|
|
def index
|
|
authorize! :index, @conference.events.build
|
|
@conference = Conference.find_by(short_title: params[:conference_id])
|
|
@events = @conference.events
|
|
@tracks = @conference.tracks
|
|
@difficulty_levels = @conference.difficulty_levels
|
|
@machine_states = @events.state_machine.states.map
|
|
@event_types = @conference.event_types
|
|
|
|
@mystates = []
|
|
@mytypes = []
|
|
@eventstats = {}
|
|
@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 }
|
|
end
|
|
end
|
|
|
|
@event_types.each do |mytype|
|
|
events_mytype = @events.where('event_type_id' => mytype.id)
|
|
if events_mytype.count > 0
|
|
@mytypes << mytype
|
|
end
|
|
end
|
|
@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
|
|
|
|
if @eventstats[mytype.title].nil?
|
|
@eventstats[mytype.title] = { 'count' => events_mytype.count,
|
|
'length' => events_mytype.count * mytype.length }
|
|
end
|
|
|
|
tmp = { "#{mystate.name}" => { 'type_state_count' => events_mytype_mystate.count,
|
|
'type_state_length' => typelength } }
|
|
@eventstats[mytype.title].merge!(tmp)
|
|
end
|
|
end
|
|
end
|
|
@eventstats['totallength'] = @totallength
|
|
|
|
respond_to do |format|
|
|
format.html
|
|
# Explicity call #to_json to avoid the use of EventSerializer
|
|
format.json { render json: Event.where(state: :confirmed, conference: @conference).to_json }
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
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)
|
|
end
|
|
|
|
def comment
|
|
comment = Comment.build_from(@event, current_user.id, params[:comment])
|
|
comment.save!
|
|
if !params[:parent].nil?
|
|
comment.move_to_child_of(params[:parent])
|
|
end
|
|
|
|
redirect_to admin_conference_event_path(conference_id: @conference.short_title)
|
|
end
|
|
|
|
def update
|
|
if @event.submitter.update_attributes(params[:user]) &&
|
|
@event.update_attributes(params[:event])
|
|
|
|
if request.xhr?
|
|
render js: 'index'
|
|
else
|
|
flash[:notice] = "Successfully updated event with ID #{@event.id}."
|
|
redirect_back_or_to(admin_conference_event_path(@conference.short_title, @event))
|
|
end
|
|
else
|
|
@url = admin_conference_event_path(@conference.short_title, @event)
|
|
flash[:notice] = 'Update not successful. ' + @event.errors.full_messages.to_sentence
|
|
render :edit
|
|
end
|
|
end
|
|
|
|
def create; end
|
|
|
|
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)
|
|
end
|
|
|
|
def confirm
|
|
update_state(:confirm, 'Event confirmed!')
|
|
end
|
|
|
|
def cancel
|
|
update_state(:cancel, 'Event canceled!')
|
|
end
|
|
|
|
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)
|
|
end
|
|
|
|
def restart
|
|
update_state(:restart, 'Review started!')
|
|
end
|
|
|
|
def vote
|
|
@ratings = @event.votes.includes(:user)
|
|
|
|
if (votes = current_user.votes.find_by_event_id(params[:id]))
|
|
votes.update_attributes(rating: params[:rating])
|
|
else
|
|
@myvote = @event.votes.build
|
|
@myvote.user = current_user
|
|
@myvote.rating = params[:rating]
|
|
@myvote.save
|
|
end
|
|
|
|
respond_to do |format|
|
|
format.html { redirect_to admin_conference_event_path(@conference.short_title, @event) }
|
|
format.js
|
|
end
|
|
end
|
|
|
|
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
|
|
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?
|
|
flash[:notice] = notice
|
|
redirect_back_or_to(admin_conference_events_path(conference_id: @conference.short_title)) && return
|
|
else
|
|
flash[:error] = alert
|
|
return redirect_back_or_to(admin_conference_events_path(conference_id: @conference.short_title)) && return
|
|
end
|
|
end
|
|
end
|
|
end
|