307 lines
10 KiB
Ruby
307 lines
10 KiB
Ruby
class WorksController < ApplicationController
|
|
|
|
layout "base_contests"
|
|
before_filter :find_contest, :only => [:index,:new,:create]
|
|
before_filter :find_contestwork, :only => [:edit,:update,:destroy,:score_rule_set,:open_contestant_works,:set_score_open,:alert_score_open_modal,
|
|
:set_score_rule]
|
|
before_filter :admin_of_contest, :only => [:new, :create, :edit, :update, :destroy,:score_rule_set,:open_contestant_works]
|
|
before_filter :member_of_contest, :only => [:index]
|
|
|
|
def index
|
|
search = "%#{params[:search].to_s.strip.downcase}%"
|
|
@new_homework = Work.new
|
|
@new_homework.contest = @contest
|
|
@page = params[:page] ? params[:page].to_i + 1 : 0
|
|
@is_teacher = User.current.logged? && (User.current.admin? || User.current.admin_of_contest?(@contest))
|
|
if @is_teacher
|
|
@homework_commons = @contest.works.where("name like '%#{search}%'").order("created_at desc")
|
|
else
|
|
@homework_commons = @contest.works.where("name like '%#{search}%' and work_status > 0").order("created_at desc")
|
|
end
|
|
@is_new = params[:is_new]
|
|
|
|
@homeworks = paginateHelper @homework_commons,10
|
|
#设置at已读
|
|
ids = @homeworks.inject([]) do |ids, homework|
|
|
jids = homework.journals_for_messages.map(&:id)
|
|
jids ? ids + jids : ids
|
|
|
|
# homework.delay.set_jour_viewed
|
|
end
|
|
unless ids.empty?
|
|
User.current.at_messages.where(viewed: false,
|
|
at_message_type: 'JournalsForMessage',
|
|
at_message_id: ids).update_all(viewed: true)
|
|
end
|
|
|
|
@left_nav_type = 3
|
|
respond_to do |format|
|
|
format.js
|
|
format.html
|
|
end
|
|
end
|
|
|
|
def show
|
|
|
|
end
|
|
|
|
def new
|
|
|
|
end
|
|
|
|
def create
|
|
if User.current.logged?
|
|
if params[:homework_common]
|
|
homework = Work.new
|
|
homework.name = params[:homework_common][:name]
|
|
homework.description = params[:homework_common][:description]
|
|
homework.end_time = params[:homework_common][:end_time] || Date.today
|
|
if params[:homework_common][:publish_time] == ""
|
|
homework.publish_time = Date.today
|
|
else
|
|
homework.publish_time = params[:homework_common][:publish_time]
|
|
end
|
|
homework.work_type = params[:homework_type].to_i || 1
|
|
#homework.late_penalty = 0
|
|
#homework.teacher_priority = 1
|
|
homework.user_id = User.current.id
|
|
homework.contest_id = @contest.id
|
|
|
|
homework.save_attachments(params[:attachments])
|
|
render_attachment_warning_if_needed(homework)
|
|
|
|
homework.work_status = homework.publish_time > Date.today ? 0 : (homework.end_time < Date.today ? 2 : 1)
|
|
|
|
work_detail_manual = WorkDetailManual.new
|
|
|
|
work_detail_manual.evaluation_start = homework.end_time + 7
|
|
work_detail_manual.evaluation_end = work_detail_manual.evaluation_start + 7
|
|
work_detail_manual.evaluation_num = 3
|
|
homework.work_detail_manual = work_detail_manual
|
|
|
|
#分组作业
|
|
if homework.work_type == 3
|
|
homework_detail_group = WorkDetailGroup.new
|
|
homework.work_detail_group = homework_detail_group
|
|
homework_detail_group.min_num = params[:min_num].to_i
|
|
homework_detail_group.max_num = params[:max_num].to_i
|
|
homework_detail_group.base_on_project = params[:base_on_project].to_i
|
|
end
|
|
|
|
if homework.save
|
|
work_detail_manual.save if work_detail_manual
|
|
homework_detail_group.save if homework_detail_group
|
|
redirect_to works_path(:contest => @contest.id)
|
|
end
|
|
end
|
|
else
|
|
render_403
|
|
end
|
|
end
|
|
|
|
def update
|
|
if params[:homework_common]
|
|
@contestwork.name = params[:homework_common][:name]
|
|
@contestwork.description = params[:homework_common][:description]
|
|
if params[:homework_common][:publish_time] == ""
|
|
@contestwork.publish_time = Date.today
|
|
else
|
|
@contestwork.publish_time = params[:homework_common][:publish_time]
|
|
end
|
|
if @contestwork.publish_time > Date.today
|
|
@contestwork.work_status = 0
|
|
elsif @contestwork.publish_time <= Date.today && @contestwork.work_status == 0
|
|
@contestwork.work_status = 1
|
|
end
|
|
param_end_time = Time.parse(params[:homework_common][:end_time]).strftime("%Y-%m-%d")
|
|
homework_end_time = Time.parse(@contestwork.end_time.to_s).strftime("%Y-%m-%d")
|
|
work_detail_manual = @contestwork.work_detail_manual
|
|
if homework_end_time != param_end_time
|
|
@contestwork.end_time = params[:homework_common][:end_time]
|
|
eval_start = Time.parse(work_detail_manual.evaluation_start.to_s).strftime("%Y-%m-%d")
|
|
if eval_start.nil? || (eval_start <= param_end_time && @contestwork.work_status <= 2)
|
|
work_detail_manual.evaluation_start = @contestwork.end_time + 7
|
|
work_detail_manual.evaluation_end = work_detail_manual.evaluation_start + 7
|
|
end
|
|
|
|
if homework_end_time > param_end_time
|
|
@contestwork.contestant_works.each do |st|
|
|
if param_end_time < Time.parse(st.commit_time.to_s).strftime("%Y-%m-%d")
|
|
st.work_status = 2
|
|
st.save
|
|
end
|
|
end
|
|
else
|
|
@contestwork.contestant_works.where("work_status = 2").each do |st|
|
|
if param_end_time >= Time.parse(st.commit_time.to_s).strftime("%Y-%m-%d")
|
|
st.work_status = 1
|
|
st.save
|
|
end
|
|
end
|
|
end
|
|
if @contestwork.end_time < Date.today && @contestwork.work_status == 1
|
|
@contestwork.work_status = 2
|
|
elsif @contestwork.end_time >= Date.today && @contestwork.work_status == 2
|
|
@contestwork.work_status = 1
|
|
#status = true
|
|
end
|
|
end
|
|
if params[:homework_type] && params[:homework_type].to_i != @contestwork.work_type
|
|
if @contestwork.work_type == 3
|
|
@contestwork.work_detail_group.destroy if @contestwork.work_detail_group
|
|
end
|
|
end
|
|
@contestwork.work_type = params[:homework_type].to_i || @contestwork.work_type
|
|
|
|
@contestwork.save_attachments(params[:attachments])
|
|
render_attachment_warning_if_needed(@contestwork)
|
|
|
|
#分组作业
|
|
if @contestwork.work_type == 3
|
|
@contestwork.work_detail_group ||= WorkDetailGroup.new
|
|
@homework_detail_group = @contestwork.work_detail_group
|
|
@homework_detail_group.min_num = params[:min_num].to_i if params[:min_num]
|
|
@homework_detail_group.max_num = params[:max_num].to_i if params[:max_num]
|
|
@homework_detail_group.base_on_project = params[:base_on_project] ? 1 : 0
|
|
end
|
|
|
|
if @contestwork.save
|
|
@homework_detail_group.save if @homework_detail_group
|
|
work_detail_manual.save if work_detail_manual
|
|
|
|
@hw_status = params[:hw_status].to_i
|
|
if @hw_status == 1
|
|
redirect_to user_contest_community_path(User.current.id)
|
|
elsif @hw_status == 2
|
|
redirect_to contest_path(@contest.id)
|
|
elsif @hw_status == 5
|
|
redirect_to contestant_works_path(:work => @contestwork.id)
|
|
else
|
|
redirect_to works_path(:contest => @contest.id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def edit
|
|
@user = User.current
|
|
@hw_status = params[:hw_status].to_i
|
|
@homework = @contestwork
|
|
if @hw_status != 1
|
|
@left_nav_type = 3
|
|
respond_to do |format|
|
|
format.html{render :layout => 'base_contests'}
|
|
end
|
|
else
|
|
respond_to do |format|
|
|
format.html{render :layout => 'base_contest_community'}
|
|
end
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
if @contestwork.destroy
|
|
respond_to do |format|
|
|
format.js {
|
|
@hw_status = params[:hw_status].to_i
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
def alert_score_open_modal
|
|
if params[:user_activity_id]
|
|
@user_activity_id = params[:user_activity_id]
|
|
else
|
|
@user_activity_id = -1
|
|
end
|
|
@hw_status = params[:hw_status].to_i
|
|
end
|
|
|
|
def set_score_open
|
|
@contestwork.update_attribute('score_open', params[:score_open].to_i)
|
|
@user_activity_id = params[:user_activity_id].to_i
|
|
@hw_status = params[:hw_status].to_i
|
|
@is_teacher = User.current.admin? || User.current.admin_of_contest?(@contest)
|
|
end
|
|
|
|
def open_contestant_works
|
|
@contestwork.update_attributes(:is_open => !@contestwork.is_open)
|
|
|
|
@user_activity_id = params[:user_activity_id]
|
|
@hw_status = params[:hw_status].to_i
|
|
@is_teacher = User.current.admin? || User.current.admin_of_contest?(@contest)
|
|
end
|
|
|
|
def score_rule_set
|
|
if params[:user_activity_id]
|
|
@user_activity_id = params[:user_activity_id]
|
|
else
|
|
@user_activity_id = -1
|
|
end
|
|
@hw_status = params[:hw_status].to_i
|
|
end
|
|
|
|
def set_score_rule
|
|
# 未启动在线评审时才能更改评审参数
|
|
if @contestwork.work_status < 3
|
|
@contestwork.online_evaluation = params[:online_evaluation].to_i ? 1 : 0
|
|
@contestwork.save
|
|
|
|
# 如果开启在线评审
|
|
if params[:online_evaluation]
|
|
work_detail_manual = @contestwork.work_detail_manual
|
|
work_detail_manual.evaluation_start = params[:evaluation_start]
|
|
work_detail_manual.evaluation_end = params[:evaluation_end]
|
|
work_detail_manual.evaluation_num = params[:evaluation_limit].to_i == 1 ? params[:evaluation_num] : -1
|
|
work_detail_manual.save
|
|
end
|
|
end
|
|
|
|
score_valid = params[:score_valid].to_i == 1 ? true : false
|
|
if score_valid != @contestwork.score_valid
|
|
@contestwork.score_valid = score_valid
|
|
@contestwork.save
|
|
@contestwork.contestant_works.has_committed.each do |c_work|
|
|
c_work.save
|
|
end
|
|
end
|
|
if params[:student_path] && params[:student_path] == "true"
|
|
redirect_to contestant_works_path(:work => @contestwork.id)
|
|
else
|
|
@user_activity_id = params[:user_activity_id].to_i
|
|
@hw_status = params[:hw_status].to_i
|
|
respond_to do |format|
|
|
format.js
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
#获取竞赛
|
|
def find_contest
|
|
@contest = Contest.find params[:contest]
|
|
rescue
|
|
render_404
|
|
end
|
|
#获取题目
|
|
def find_contestwork
|
|
@contestwork = Work.find params[:id]
|
|
@work_detail_group = @contestwork.work_detail_group
|
|
@contest = @contestwork.contest
|
|
rescue
|
|
render_404
|
|
end
|
|
#是不是管理员
|
|
def admin_of_contest
|
|
render_403 unless User.current.admin_of_contest?(@contest) || User.current.admin?
|
|
end
|
|
|
|
#当前用户是不是竞赛的成员
|
|
def member_of_contest
|
|
render_403 unless @contest.is_public==1 || User.current.member_of_contest?(@contest) || User.current.admin?
|
|
end
|
|
|
|
end
|