|
- 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]
- before_filter :only => [:index] do
- set_nav_status(NavStatues::COMPETION)
- end
-
- 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
- if !User.current.logged?
- redirect_to signin_url
- else
- render_403 unless @contest.is_public==1 || User.current.member_of_contest?(@contest) || User.current.admin?
- end
- end
-
- end
|