224 lines
7.3 KiB
Ruby
224 lines
7.3 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,:alert_open_student_works,:open_student_works,:set_score_open,:alert_score_open_modal]
|
|
before_filter :admin_of_contest, :only => [:new, :create, :edit, :update, :destroy,:score_rule_set,:alert_open_student_works,:open_student_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 publish_time <= '#{Date.today}'").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 : 1
|
|
|
|
#分组作业
|
|
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
|
|
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
|
|
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")
|
|
if homework_end_time != param_end_time
|
|
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
|
|
end
|
|
@contestwork.end_time = params[:homework_common][:end_time] || Time.now
|
|
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
|
|
|
|
#status = false
|
|
if @contestwork.publish_time <= Date.today && @contestwork.work_status == 0
|
|
@contestwork.work_status = 1
|
|
#status = true
|
|
end
|
|
|
|
@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
|
|
|
|
@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.html {
|
|
@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)
|
|
else
|
|
redirect_to works_path(:contest => @contest.id)
|
|
end
|
|
}
|
|
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
|