openstreetmap-website/app/controllers/user_blocks_controller.rb

145 lines
5 KiB
Ruby

class UserBlocksController < ApplicationController
layout 'site'
before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:new, :create, :edit, :delete]
before_filter :require_moderator, :only => [:new, :create, :edit, :delete]
def index
@user_blocks_pages, @user_blocks = paginate(:user_blocks,
:include => [:user, :moderator, :revoker],
:order => "user_blocks.end_at DESC",
:per_page => 20)
end
def show
@user_block = UserBlock.find(params[:id])
if @user and @user.id == @user_block.user_id
@user_block.needs_view = false
@user_block.save!
end
end
def new
@user_block = UserBlock.new
@display_name = params[:display_name]
@this_user = User.find_by_display_name(@display_name, :conditions => {:visible => true})
end
# GET /user_blocks/1/edit
def edit
@user_block = UserBlock.find(params[:id])
params[:user_block_period] = ((@user_block.end_at - Time.now.getutc) / 1.hour).ceil.to_s
end
def create
@display_name = params[:display_name]
@this_user = User.find_by_display_name(@display_name, :conditions => {:visible => true})
block_period = [UserBlock::PERIODS.max, params[:user_block_period].to_i].min
@user_block = UserBlock.new(:user_id => @this_user.id,
:moderator_id => @user.id,
:reason => params[:user_block][:reason],
:end_at => Time.now.getutc() + block_period.hours,
:needs_view => params[:user_block][:needs_view])
if (@this_user and @user.moderator? and
params[:tried_contacting] == "yes" and
params[:tried_waiting] == "yes" and
block_period >= 0)
if @user_block.save
flash[:notice] = t('user_block.create.flash', :name => @display_name)
redirect_to @user_block
else
render :action => "new"
end
else
if !@user.moderator?
flash[:notice] = t('user_block.create.not_a_moderator')
elsif params[:tried_contacting] != "yes"
flash[:notice] = t('user_block.create.try_contacting')
elsif params[:tried_waiting] != "yes"
flash[:notice] = t('user_block.create.try_waiting')
else
flash[:notice] = t('user_block.create.bad_parameters')
end
@display_name = @this_user.nil? ? '' : @this_user.display_name
render :action => "new"
end
end
def update
@user_block = UserBlock.find(params[:id])
block_period = [72, params[:user_block_period].to_i].min
if @user_block.moderator_id != @user.id
flash[:notice] = t('user_block.update.only_creator_can_edit')
redirect_to(@user_block)
elsif !@user_block.active?
flash[:notice] = t('user_block.update.block_expired')
redirect_to(@user_block)
elsif @user_block.update_attributes({ :end_at => Time.now.getutc() + block_period.hours,
:reason => params[:user_block][:reason],
:needs_view => params[:user_block][:needs_view] })
flash[:notice] = t('user_block.update.success')
redirect_to(@user_block)
else
render :action => "edit"
end
end
##
# revokes the block, setting the end_time to now
def revoke
@user_block = UserBlock.find(params[:id])
if !@user.moderator?
flash[:notice] = t('user_block.create.not_a_moderator')
redirect_to @user_block
elsif params[:confirm]
if @user_block.revoke!
flash[:notice] = t'user_block.revoke.flash'
redirect_to(@user_block)
else
flash[:notice] = t'user_block.revoke.error'
render :action => "edit"
end
end
end
##
# shows a list of all the blocks on the given user
def blocks_on
@this_user = User.find_by_display_name(params[:display_name])
@user_blocks_pages, @user_blocks = paginate(:user_blocks,
:include => [:user, :moderator, :revoker],
:conditions => {:user_id => @this_user.id},
:order => "user_blocks.end_at DESC",
:per_page => 20)
end
##
# shows a list of all the blocks by the given user.
def blocks_by
@this_user = User.find_by_display_name(params[:display_name])
@user_blocks_pages, @user_blocks = paginate(:user_blocks,
:include => [:user, :moderator, :revoker],
:conditions => {:moderator_id => @this_user.id},
:order => "user_blocks.end_at DESC",
:per_page => 20)
end
private
def require_moderator
redirect_to "/403.html" unless @user.moderator?
end
end