2016-12-22 17:02:54 +08:00
#encoding=utf-8
2016-12-22 10:01:37 +08:00
class ContestsController < ApplicationController
2016-12-23 14:41:21 +08:00
include ContestsHelper
2016-12-24 16:29:10 +08:00
helper :contest_members
2016-12-28 11:30:31 +08:00
helper :users
2017-01-06 15:03:01 +08:00
helper :attachments
helper :files
include AvatarHelper
2017-02-15 10:54:09 +08:00
include ApplicationHelper
2017-01-17 16:49:36 +08:00
before_filter :find_contest , :only = > [ :show , :settings , :update , :destroy , :contest_activities , :private_or_public , :switch_role , :set_invite_code_halt , :renew ,
2017-01-11 10:16:25 +08:00
:member , :export_all_members , :feedback ]
2016-12-22 10:01:37 +08:00
before_filter :is_logged , :only = > [ :index , :new , :create ]
2016-12-30 11:18:29 +08:00
before_filter :is_admin? , :only = > [ :settings , :set_invite_code_halt , :destroy ]
2016-12-24 18:48:50 +08:00
before_filter :is_member? , :only = > [ :show , :contest_activities ]
2016-12-30 11:18:29 +08:00
2016-12-22 14:47:42 +08:00
layout " base_contests "
2016-12-22 10:01:37 +08:00
def show
2017-01-20 16:16:07 +08:00
#更新创建课程消息状态
2017-02-15 10:54:09 +08:00
update_messsages_to_viewed ( " ContestMessage " , @contest )
2016-12-23 14:41:21 +08:00
@left_nav_type = 1
2017-02-24 15:14:09 +08:00
contest_activities = @contest . contest_activities
@page = params [ :page ] ? params [ :page ] . to_i + 1 : 0
if params [ :type ] . present?
case params [ :type ]
when " work "
@contest_activities = contest_activities . where ( " contest_act_type = 'Work' " ) . order ( 'updated_at desc' )
when " news "
@contest_activities = contest_activities . where ( " contest_act_type = 'News' " ) . order ( 'updated_at desc' )
when " message "
@contest_activities = contest_activities . where ( " contest_act_type = 'Message' " ) . order ( 'updated_at desc' )
when " poll "
@contest_activities = contest_activities . where ( " contest_act_type = 'Poll' " ) . order ( 'updated_at desc' )
when " attachment "
@contest_activities = contest_activities . where ( " contest_act_type = 'Attachment' " ) . order ( 'updated_at desc' )
when " journalsForMessage "
@contest_activities = contest_activities . where ( " contest_act_type = 'JournalsForMessage' " ) . order ( 'updated_at desc' )
when " news "
@contest_activities = contest_activities . where ( " contest_act_type = 'News' " ) . order ( 'updated_at desc' )
else
@contest_activities = contest_activities . order ( 'updated_at desc' )
end
else
@contest_activities = contest_activities . order ( 'updated_at desc' )
end
@contest_activities_count = @contest_activities . count
@contest_activities = @contest_activities . limit ( 10 ) . offset ( @page * 10 )
@type = params [ :type ]
2016-12-23 14:41:21 +08:00
respond_to do | format |
format . js
format . html
end
end
def contest_activities
contest_activities = @contest . contest_activities
@page = params [ :page ] ? params [ :page ] . to_i + 1 : 0
if params [ :type ] . present?
case params [ :type ]
when " work "
@contest_activities = contest_activities . where ( " contest_act_type = 'Work' " ) . order ( 'updated_at desc' )
when " news "
@contest_activities = contest_activities . where ( " contest_act_type = 'News' " ) . order ( 'updated_at desc' )
when " message "
@contest_activities = contest_activities . where ( " contest_act_type = 'Message' " ) . order ( 'updated_at desc' )
when " poll "
@contest_activities = contest_activities . where ( " contest_act_type = 'Poll' " ) . order ( 'updated_at desc' )
when " attachment "
@contest_activities = contest_activities . where ( " contest_act_type = 'Attachment' " ) . order ( 'updated_at desc' )
when " journalsForMessage "
@contest_activities = contest_activities . where ( " contest_act_type = 'JournalsForMessage' " ) . order ( 'updated_at desc' )
2016-12-23 21:13:40 +08:00
when " news "
@contest_activities = contest_activities . where ( " contest_act_type = 'News' " ) . order ( 'updated_at desc' )
2016-12-23 14:41:21 +08:00
else
@contest_activities = contest_activities . order ( 'updated_at desc' )
end
else
@contest_activities = contest_activities . order ( 'updated_at desc' )
end
@contest_activities_count = @contest_activities . count
@contest_activities = @contest_activities . limit ( 10 ) . offset ( @page * 10 )
@type = params [ :type ]
@left_nav_type = 2
2016-12-22 11:17:13 +08:00
respond_to do | format |
format . js
2016-12-22 14:47:42 +08:00
format . html
2016-12-23 14:41:21 +08:00
format . api
2016-12-22 11:17:13 +08:00
end
2016-12-22 10:01:37 +08:00
end
def new
if User . current . login?
@contest = Contest . new
render :layout = > 'new_base'
else
redirect_to signin_url
end
end
def create
@contest = Contest . new
2016-12-22 11:17:13 +08:00
@contest . name = params [ :contest ] [ :name ]
2016-12-22 10:01:37 +08:00
params [ :contest ] [ :is_public ] ? @contest . is_public = 1 : @contest . is_public = 0
@contest . user_id = User . current . id
if @contest && @contest . save
#unless User.current.admin?
2016-12-22 11:17:13 +08:00
member = ContestMember . new ( :user_id = > User . current . id )
@contest . contest_members << member
2016-12-22 15:08:15 +08:00
ContestMemberRole . create ( :contest_member_id = > member . id , :role_id = > 13 )
2016-12-22 11:17:13 +08:00
2016-12-22 15:08:15 +08:00
@contest . contest_acts << ContestActivity . new ( :user_id = > @contest . user_id , :contest_id = > @contest . id )
2016-12-22 11:17:13 +08:00
respond_to do | format |
format . html { redirect_to contest_url ( @contest ) }
end
2016-12-22 10:01:37 +08:00
end
end
2016-12-22 16:39:54 +08:00
def update
@contest . name = params [ :contest ] [ :name ]
@contest . description = params [ :contest ] [ :description ]
# @project.organization_id = params[:organization_id]
params [ :contest ] [ :is_public ] == " on " ? @contest . is_public = 1 : @contest . is_public = 0
2016-12-23 14:41:21 +08:00
@contest . save_attachments ( params [ :attachments ] )
2016-12-22 16:39:54 +08:00
begin
if @contest . save
respond_to do | format |
2016-12-23 14:41:21 +08:00
format . html { redirect_to contest_path ( @contest ) }
2016-12-22 16:39:54 +08:00
end
end
rescue Exception = > e
@message = e . message
end
end
2016-12-30 11:18:29 +08:00
def destroy
@contest . update_attributes ( :is_delete = > true )
end
2017-01-11 10:16:25 +08:00
def feedback
if ( User . current . admin? || @contest . is_public || ( ! @contest . is_public && User . current . member_of_contest? ( @contest ) ) )
ContestMessage . where ( :user_id = > User . current . id , :contest_id = > @contest . id , :contest_message_type = > 'JournalsForMessage' , :contest_message_id = > @contest . journals_for_messages . map { | jour | jour . id } ) . update_all ( :viewed = > true )
page = params [ :page ]
# Find the page of the requested reply
@jours = @contest . journals_for_messages . where ( 'm_parent_id IS NULL' ) . order ( 'created_on DESC' )
@jour_count = @jours . count
@limit = 10
if params [ :r ] && page . nil?
offset = @jours . count ( :conditions = > [ " #{ JournalsForMessage . table_name } .id > ? " , params [ :r ] . to_i ] )
page = 1 + offset / @limit
end
@jour = paginateHelper @jours , 10
@state = false
@left_nav_type = 6
respond_to do | format |
format . html { render :layout = > 'base_contests' }
format . api
end
else
render_403
end
end
2016-12-23 21:44:03 +08:00
def private_or_public
@contest . update_attributes ( :is_public = > ! @contest . is_public )
respond_to do | format |
format . js
end
end
2016-12-24 16:29:53 +08:00
#设置竞赛公开或私有
def set_contest_attribute
contest_id = params [ :contest ] . to_i
@contest = Contest . find ( contest_id )
@user = User . find ( params [ :user_id ] )
@contest . is_public? ? @contest . update_attribute ( :is_public , false ) : @contest . update_attribute ( :is_public , true )
respond_to do | format |
format . js
end
end
2016-12-22 16:39:54 +08:00
def settings
2017-01-03 17:05:27 +08:00
@select_tab = params [ :tab ]
2016-12-24 16:29:10 +08:00
@member || = @contest . contest_members . new
@roles = Role . where ( " id in (13, 14, 15) " )
2016-12-22 17:02:54 +08:00
@members = @contest . member_principals . includes ( :roles , :principal ) . all . sort
2016-12-22 16:39:54 +08:00
end
2016-12-22 15:08:15 +08:00
def join_contest
end
def join_contest_multi_role
if User . current . logged?
cs = ContestsService . new
@user = User . current
join = cs . join_contest_roles params , @user
@state = join [ :state ]
@contest = join [ :contest ]
else
@state = 5 #未登录
end
@object_id = @contest . id if @contest
respond_to do | format |
format . js
end
end
2016-12-22 16:02:36 +08:00
#处理加入竞赛成为管理员、评委、参赛者的请求
#status 1 同意 2 拒绝
def dealwith_apply_request
@msg = AppliedMessage . find ( params [ :msg_id ] )
#AppliedMessage role 13 管理员 14 评委 15 参赛者
applied_contest = @msg . applied
apply_user = User . find ( applied_contest . user_id )
ids = applied_contest . role . split ( " , " ) # [@msg.content] msg content保存的是申请的职位角色
integer_ids = [ ]
ids . each do | role_id |
integer_ids << role_id . to_i
end
case params [ :agree ]
when 'Y'
2016-12-30 20:30:45 +08:00
if ContestMember . where ( :user_id = > apply_user . id , :contest_id = > applied_contest . contest_id ) . first . nil?
2016-12-28 11:30:31 +08:00
member = ContestMember . new ( :user_id = > apply_user . id )
Contest . find ( applied_contest . contest_id ) . contest_members << member
else
2016-12-30 20:30:45 +08:00
member = ContestMember . where ( :user_id = > apply_user . id , :contest_id = > applied_contest . contest_id ) . first
2016-12-28 11:30:31 +08:00
end
2016-12-22 17:13:10 +08:00
contest_member_roles = member . contest_member_roles
if integer_ids . include? ( 14 ) && integer_ids . include? ( 13 )
contest_member_roles << ContestMemberRole . new ( :role_id = > 13 )
contest_member_roles << ContestMemberRole . new ( :role_id = > 14 , :is_current = > 0 )
else
contest_member_roles << ContestMemberRole . new ( :role_id = > integer_ids [ 0 ] )
end
2016-12-22 16:02:36 +08:00
ContestMessage . create ( :user_id = > apply_user . id , :contest_id = > applied_contest . contest_id , :viewed = > false , :contest_message_id = > User . current . id , :content = > applied_contest . role , :contest_message_type = > 'ContestRequestDealResult' , :status = > 1 )
2016-12-28 11:30:31 +08:00
applied_contest . applied_messages . update_all ( :status = > 1 , :viewed = > 1 , :applied_user_id = > User . current . id )
@msg . update_attributes ( :status = > 1 , :viewed = > 1 , :applied_user_id = > User . current . id )
2016-12-22 16:02:36 +08:00
applied_contest . update_attributes ( :status = > 1 )
2016-12-22 17:13:10 +08:00
if integer_ids . include? ( 15 )
2016-12-22 16:02:36 +08:00
ContestantForContest . create ( :student_id = > apply_user . id , :contest_id = > applied_contest . contest_id )
end
when 'N'
ContestMessage . create ( :user_id = > apply_user . id , :contest_id = > applied_contest . contest_id , :viewed = > false , :contest_message_id = > User . current . id , :content = > applied_contest . role , :contest_message_type = > 'ContestRequestDealResult' , :status = > 2 )
2016-12-28 11:30:31 +08:00
applied_contest . applied_messages . update_all ( :status = > 2 , :viewed = > 1 , :applied_user_id = > User . current . id )
@msg . update_attributes ( :status = > 2 , :viewed = > 1 , :applied_user_id = > User . current . id )
2016-12-22 16:02:36 +08:00
applied_contest . update_attributes ( :status = > 2 )
end
respond_to do | format |
format . js
end
end
2016-12-23 21:44:03 +08:00
def switch_role
members = @contest . contest_members . where ( " user_id = #{ params [ :user_id ] } " )
unless members . blank?
curr_role = ContestMemberRole . find_by_contest_member_id_and_role_id ( members . first . id , params [ :curr_role ] )
tar_role = ContestMemberRole . find_by_contest_member_id_and_role_id ( members . first . id , params [ :tar_role ] )
unless ( curr_role . nil? || tar_role . nil? )
curr_role . update_column ( 'is_current' , 0 )
tar_role . update_column ( 'is_current' , 1 )
end
end
redirect_to contest_path ( @contest )
end
2016-12-30 11:18:29 +08:00
# 邀请码停用/启用
def set_invite_code_halt
if User . current . admin_of_contest? ( @contest ) || User . current . admin?
@contest . update_attribute ( 'invite_code_halt' , @contest . invite_code_halt == 0 ? 1 : 0 )
end
end
# 恢复已删除的竞赛
def renew
if User . current . admin?
@contest . update_attributes ( :is_delete = > false )
2017-02-08 14:16:40 +08:00
respond_to do | format |
format . js
end
2016-12-30 11:18:29 +08:00
else
return 404
end
end
2017-01-03 17:05:27 +08:00
# 成员列表
def member
if ( User . current . admin? || @contest . is_public || ( ! @contest . is_public && User . current . member_of_contest? ( @contest ) ) )
@role = params [ :role ] . nil? ? '3' : params [ :role ]
case @role
when '1'
@members = contest_managers @contest
when '2'
@members = contest_judges @contest
when '3'
@members = contest_contestants @contest
end
if params [ :name ]
q = " #{ params [ :name ] . strip } "
@members = search_member_by_name_login_school @members , q
end
@limit = 50
@page = params [ :page ] . nil? ? 1 : params [ 'page' ] . to_i
@members_count = @members . count
@mem_pages = Paginator . new @members_count , @limit , @page
@members = paginateHelper @members , @limit
respond_to do | format |
format . html { render :layout = > 'base_contests' }
format . js
end
else
render_403
end
end
2017-01-10 11:00:18 +08:00
def export_all_members
sql = " SELECT DISTINCT(cmr.id) AS cmr_id, cmr.role_id, users.`login`, users.id AS user_id, users.`mail`, cmr.created_at FROM users, contest_members cm, contest_member_roles cmr, user_extensions ue, schools " +
" WHERE users.id = cm.`user_id` AND users.id=ue.`user_id` AND cmr.`contest_member_id` = cm.`id` AND cm.`contest_id` = #{ @contest . id } AND (ue.`school_id` IS NULL OR ue.`school_id` = schools.`id`) " +
" ORDER BY role_id ASC, CONVERT(schools.`name` USING gbk) COLLATE gbk_chinese_ci DESC, CONVERT(users.`lastname` USING gbk) COLLATE gbk_chinese_ci DESC "
@members = ContestMemberRole . find_by_sql sql
respond_to do | format |
format . xls {
filename = " #{ @contest . name . to_s } -成员列表- #{ DateTime . parse ( Time . now . to_s ) . strftime ( '%Y%m%d%H%M%S' ) . to_s } .xls "
send_data ( member_to_xls ( @members ) , :type = > " text/excel;charset=utf-8; header=present " ,
:filename = > filename_for_content_disposition ( " #{ filename } .xls " ) )
}
end
end
2016-12-22 10:01:37 +08:00
private
2017-01-10 11:00:18 +08:00
def member_to_xls members
xls_report = StringIO . new
book = Spreadsheet :: Workbook . new
sheet1 = book . create_worksheet :name = > " 成员列表 "
blue = Spreadsheet :: Format . new :color = > :blue , :weight = > :bold , :size = > 10
#sheet1.row(0).default_format = blue
#sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_class),l(:excel_f_score),l(:excel_commit_time)])
sheet1 [ 0 , 0 ] = " id "
sheet1 [ 0 , 1 ] = " 姓名 "
sheet1 [ 0 , 2 ] = " 登录名 "
sheet1 [ 0 , 3 ] = " 电子邮箱 "
sheet1 [ 0 , 4 ] = " 单位 "
sheet1 [ 0 , 5 ] = " 角色 "
sheet1 [ 0 , 6 ] = " 加入时间 "
count_row = 1
members . each_with_index do | member , i |
user = User . find ( member . user_id )
sheet1 [ count_row , 0 ] = user . id
sheet1 [ count_row , 1 ] = user . show_name
sheet1 [ count_row , 2 ] = user . login
sheet1 [ count_row , 3 ] = user . mail
sheet1 [ count_row , 4 ] = user . user_extensions . school_id . blank? ? " " : ( user . user_extensions . school . blank? ? " " : user . user_extensions . school . name )
sheet1 [ count_row , 5 ] = member . role_id == 13 ? " 管理员 " : ( member . role_id == 14 ? " 评委 " : " 参赛者 " )
sheet1 [ count_row , 6 ] = format_time member . created_at
count_row += 1
end
book . write xls_report
xls_report . string
end
2016-12-22 10:01:37 +08:00
def find_contest
if params [ :id ] . to_i < 780
render_403
return
end
@contest = Contest . find ( params [ :id ] )
2016-12-30 11:18:29 +08:00
if @contest . is_delete and ! User . current . admin?
render_404
return
end
2016-12-22 10:01:37 +08:00
rescue ActiveRecord :: RecordNotFound
render_404
end
def is_logged
redirect_to signin_path unless User . current . logged?
end
2016-12-24 18:48:50 +08:00
def is_admin?
unless User . current . admin_of_contest? ( @contest ) || User . current . admin?
render_403
return
end
end
def is_member?
if User . current . member_of_contest? ( @contest ) || User . current . admin? || @contest . is_public
else
render_403
return
end
end
2016-12-22 10:01:37 +08:00
end