|
- #encoding: utf-8
- class StudentWorkController < ApplicationController
- layout "base_courses"
- include StudentWorkHelper
- include ApplicationHelper
- require 'bigdecimal'
- require "base64"
- before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :program_test,:program_test_ex,
- :set_score_rule,:forbidden_anonymous_comment,:delete_work,:new_student_work_project,:student_work_project,:cancel_relate_project,
- :search_course_students,:work_canrepeat,:add_group_member,:change_project]
- before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work, :retry_work, :revise_attachment, :hide_score_detail]
- before_filter :member_of_course, :only => [:new, :create, :show, :add_score, :praise_student_work]
- before_filter :author_of_work, :only => [:edit, :update, :destroy]
- before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :set_score_rule, :forbidden_anonymous_comment]
- before_filter :is_logged, :only => [:index]
-
- ###
- def program_test
- is_test = params[:is_test] == 'true'
- resultObj = {status: 0, results: [], error_msg: '', time: Time.now.strftime('%Y-%m-%d %T')}
-
- student_work = find_or_save_student_work(is_test)
-
- unless student_work
- resultObj[:status] = 100
- else
- if @homework.homework_type == 2 && @homework.homework_detail_programing
- result = test_realtime(student_work, params[:src])
- logger.debug result
- resultObj[:status] = result["status"]
- resultObj[:results] = result["results"]
- resultObj[:error_msg] = result["error_msg"]
- results = result["results"]
- if result["status"].to_i == -2 #编译错误
- results = [result["error_msg"]]
- end
- student_work_test = student_work.student_work_tests.build(status: result["status"], results: results,
- src: params[:src])
- unless student_work.save
- resultObj[:status] = 200
- else
- student_work.name = params[:title]
- student_work.description = params[:src]
- if @homework.end_time < Time.now.to_s
- student_work.late_penalty = @homework.late_penalty
- else
- student_work.late_penalty = 0
- end
- student_work.save
- resultObj[:status] = result["status"].to_i
- resultObj[:time] = student_work_test.created_at.to_s(:db)
- resultObj[:index] = student_work.student_work_tests.count
- end
- end
- end
- render :json => resultObj
- end
-
- #行尾空格替换成□
- def space_replace_1(str)
- for i in 0 .. str.size
- tChar = str[i]
- if tChar != ' ' && tChar != "\n"
- sFlag = false
- eFlag = false
- elsif tChar == ' ' && sFlag == false
- tStart = i
- sFlag = true
- elsif tChar == "\n"
- tEnd = i - 1
- if sFlag == true
- for j in tStart .. tEnd
- str[j] = "□"
- end
- sFlag = false
- end
- end
- end
- end
-
- #由于负载问题 不要使用全局变量
- #根据传入的tIndex确定是第几次测试
- #之后如果觉得很卡 可以改成将结果传回JS再以参数形式传回来
- def program_test_ex
-
- tStarttime = Time.now
-
- is_test = params[:is_test] == 'true'
- resultObj = {status: 0, results: [], error_msg: '', time: Time.now.strftime('%Y-%m-%d %T'),tseq:1,tcount:1,testid:1} #保存每测试一次返回的结果
-
- student_work = find_or_save_student_work(is_test)
-
- resultObj[:tcount] = @homework.homework_tests.size
-
- unless student_work
- resultObj[:status] = 100
- else
- if @homework.homework_type == 2 && @homework.homework_detail_programing
- #找到第index个测试的输入输出
- index = params[:tIndex].to_i
- resultObj[:tseq] = index
- test = @homework.homework_tests[index - 1]
-
- #请求测试
- begin
- result = test_realtime_ex(test, params[:src])
- rescue Timeout::Error
- tEndtime = Time.now
- tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000+(tEndtime.usec - tStarttime.usec)/1000
- logger.info "program_test_ex user wait time = #{tUsedtime} 毫秒"
- #status 0:答案正确 -5program_test_ex 函数出错 -4judge代码出错 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
- resultObj[:status] = -3
- CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>-3,:wait_time=>tUsedtime,:student_work_id=>student_work.id)
- rescue => e
- #-4 judge代码 出错
- logger.info "program_test_error #{e}"
- resultObj[:status] = -4
- tmpstatus = -4
- CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id)
- end
-
- begin
- if resultObj[:status] != -3 && resultObj[:status] != -4
- if result["status"].to_i != -2
- #result["results"].first['output'] = result["results"].first['output'].gsub(" ","□")
- #result["results"].first['result'] = result["results"].first['result'].gsub(" ","□")
- space_replace_1(result["results"].first['output'])
- space_replace_1(result["results"].first['result'])
- end
-
- logger.debug result
-
- #-1 默认值 0全部正确并结束 2 超时 -2 编译错误
- resultObj[:status] = -1
- resultObj[:results] = result["results"].first #本次测试结果
- if result["status"].to_i == -2 #编译错误
- result["error_msg"] = result["error_msg"][0..2047]
- end
- resultObj[:error_msg] = result["error_msg"] #编译错误时的信息
-
- #该状态用于存入CodeTests
- tmpstatus = -1
- if result["status"].to_i == -2 #编译错误
- resultObj[:results] = result["error_msg"]
- resultObj[:status] = -2
- tmpstatus = -2
- elsif result["results"][0]["status"].to_i == 2
- resultObj[:status] = 2
- tmpstatus = 2
- end
-
- if result["status"] == 0
- tmpstatus = 0
- end
-
- unless student_work.save
- resultObj[:status] = 200
- else
- student_work.name = params[:title]
- student_work.description = params[:src]
-
- if !is_test && @homework.end_time < Time.now.to_s
- student_work.late_penalty = @homework.late_penalty
- else
- student_work.late_penalty = 0
- end
-
- #每次从数据库取出上次的结果加上本次的结果再存入数据库
- if result["status"].to_i != -2
- result["results"].first['user_wait'] = tUsedtime
-
- if result["results"][0]["status"].to_i == 2
- result["status"] = 2
- end
- end
-
- status = result["status"]
- if index == 1
- student_work_test = student_work.student_work_tests.build(status: status,
- results: [resultObj[:results]],src: params[:src])
- student_work_test.save!
- resultObj[:testid] = student_work_test.id
- else
- #先从数据库取出result
- student_work_test = StudentWorkTest.find(params[:testid])
- results = student_work_test.results
- results << resultObj[:results]
- student_work_test.results = results
- student_work_test.status = (result["status"] != 0 ? result["status"] : student_work_test.status)
- student_work_test.save!
- status = student_work_test.status
- resultObj[:testid] = student_work_test.id
- end
- student_work.save
- #超时或编译错误则直接返回了并存入数据库
- if resultObj[:status] == 2 || resultObj[:status] == -2 || index == @homework.homework_tests.size
- if status == 0
- resultObj[:status] = 0
- end
- student_work.save!
- resultObj[:time] = student_work_test.created_at.strftime(format='%Y-%m-%d %H:%M:%S')
- resultObj[:index] = student_work.student_work_tests.count
- end
-
- #将每次用户等待时间都存起来以便管理界面显示用
- tEndtime = Time.now
- tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000+(tEndtime.usec - tStarttime.usec)/1000
- logger.debug "program_test_ex user wait time = #{tUsedtime} 毫秒"
-
- time_used = 0
- if result["status"].to_i != -2
- #至少一毫秒
- time_used = result["results"].first['time_used'] == 0 ? 1:result["results"].first['time_used']
- end
- #0:答案正确 -3http超时 -2:编译错误 -1:答案错误 2:程序运行超时
- CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>time_used,:wait_time=>tUsedtime,:student_work_id=>student_work.id)
- end
- end
- rescue
- #-5 program_test_ex 函数出错
- logger.info "program_test_error 2"
- resultObj[:status] = -5
- tmpstatus = -5
- CodeTests.create(:homework_id=>@homework.id,:language=>@homework.homework_detail_programing.language,:status=>tmpstatus,:time_used=>0,:wait_time=>0,:student_work_id=>student_work.id)
- end
- #渲染返回结果
- render :json => resultObj
- end
- end
- end
-
- #找出该作业的所有提交作业
- def find_all_student_work_by_homeid()
- all_studentwork = StudentWork.where("homework_common_id = #{@homework.id} and is_test = 0 ")
-
- all_studentwork
- end
-
- def request_code_repeattest(src)
- url = "#{Redmine::Configuration['jplag_server']}api/realtime_test.json"
-
- factor = []
- src.each do |test|
- factor << {work_id: test.id, des: test.description,created_at:test.created_at.to_i}
- end
-
- solutions = {
- homeid:@homework.id,
- language:@homework.homework_detail_programing.language,
- factor: factor
- }
- uri = URI(url)
- body = solutions.to_json
-
- logger.debug "send body"
- logger.debug body
-
- res = Net::HTTP.new(uri.host, uri.port).start do |client|
- request = Net::HTTP::Post.new(uri.path)
- request.body = body
- request["Content-Type"] = "application/json"
- client.request(request)
- end
-
- JSON.parse(res.body)
- end
-
- #点击代码查重按钮
- def work_canrepeat
- @homework_id = params[:homework]
- @course_id = params[:course_id]
-
- all_studentwork = find_all_student_work_by_homeid()
-
- @work_count = all_studentwork.has_committed.count
- end
-
- #代码查重 status: 0完成 -2不需要查重 -1查重失败不支持该语言
- def code_repeattest
- tStarttime = Time.now
- logger.debug "code_repeattest start is #{tStarttime}}"
- resultObj = {status: -2}
-
- @homework = HomeworkCommon.find params[:homework]
-
- all_studentwork = find_all_student_work_by_homeid().has_committed
-
- if all_studentwork == nil
- resultObj[:status] = -2
- elsif all_studentwork.count <= 1
- resultObj[:status] = -2
- else
-
- #@homework.homework_detail_programing.language、id、description
- logger.debug "time1 is #{Time.now.usec} "
- result = request_code_repeattest(all_studentwork)
- logger.debug "time2 is #{Time.now.usec} "
-
- resultObj[:status] = result['status'].to_i
- # resultObj[:results] = result['results']
-
- #Time.now, simi_id = simiworkid , simi_value = simivalue
- if resultObj[:status] == 0
- @homework.simi_time = Time.now
- resultObj[:comparetime] = @homework.simi_time
- @homework.update_column('simi_time', @homework.simi_time)
-
- logger.debug "time3 is #{Time.now.usec} "
- result['results'].each do |key,value|
- @student_work = StudentWork.where("id =?", key.to_i).first
- @student_work.update_column('simi_id', value['simiworkid'].to_i)
- @student_work.update_column('simi_value', value['simivalue'].to_i)
- # sqlstr = "update student_works set simi_id=#{value['simiworkid']},simi_value=#{value['simivalue']} where id=#{key.to_i} "
- # dbh.execute(sqlstr)
- end
- logger.debug "time4 is #{Time.now.usec} "
- end
- end
- tEndtime = Time.now
- logger.debug "code_repeattest end is #{tEndtime}}"
- tUsedtime = (tEndtime.to_i-tStarttime.to_i)*1000000+(tEndtime.usec - tStarttime.usec)
- logger.debug "code_repeattest userd utime is #{tUsedtime}"
- render :json => resultObj
- end
-
- #上次代码查重时间
- def last_codecomparetime
- resultObj = {status: 0}
- @homework = HomeworkCommon.find params[:homework]
-
- #转换一下
- if @homework.simi_time != nil
- resultObj[:comparetime] = Time.parse(@homework.simi_time.to_s).strftime("%Y-%m-%d %H:%M:%S")
- else
- resultObj[:comparetime] = 0
- end
-
- render :json => resultObj
- end
-
- def index
- # 作业消息状态更新?
- homeworkcommon_messages = CourseMessage.where(:user_id => User.current.id, :viewed => 0, :course_message_id => @homework.id, :course_message_type => "HomeWorkCommon")
- homeworkcommon_messages.update_all(:viewed => true)
- studentwork_messages = CourseMessage.where(:user_id => User.current.id, :viewed => 0, :course_id => @homework.course, :course_message_type => "StudentWork")
- studentwork_messages.update_all(:viewed => true)
- # 作品打分消息状态更新
- studentworks_scores = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @homework.course, "StudentWorksScore", 0)
- studentworks_scores.update_all(:viewed => true)
- # 作品评论消息状态更新
- journals_for_teacher = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @homework.course, "JournalsForMessage", 0)
- journals_for_teacher.update_all(:viewed => true)
- #匿评申诉消息状态更新
- if params[:show_work_id]
- work = @homework.student_works.where("id = #{params[:show_work_id].to_i}").first
- if work && !work.student_works_scores.where("reviewer_role = 3 and appeal_status != 0").blank?
- score_ids = "(" + work.student_works_scores.where("reviewer_role = 3 and appeal_status != 0").map{|score| score.id}.join(",") + ")"
- score_appeal_ids = StudentWorksScoresAppeal.where("student_works_score_id in #{score_ids}").blank? ? "(-1)" : "(" + StudentWorksScoresAppeal.where("student_works_score_id in #{score_ids}").map{|score_appeal| score_appeal.id}.join(",") + ")"
- anonymous_appeal =AppliedMessage.where("user_id =? and applied_id in #{score_appeal_ids} and applied_type =? and viewed =?", User.current.id, 'StudentWorksScoresAppeal', 0)
- anonymous_appeal.update_all(:viewed => true)
- appeal_message = CourseMessage.where("user_id =? and course_id =? and course_message_id in #{score_appeal_ids} and course_message_type =? and viewed =?", User.current.id, @homework.course, "StudentWorksScoresAppeal", 0)
- appeal_message.update_all(:viewed => true)
- end
- end
- ##################################################################################################################
- @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name].to_s.strip || "",params[:group]
- @homework_commons = @course.homework_commons.where("publish_time <= ?",Time.now).order("created_at desc")
- @all_homework_commons = @course.homework_commons.order("created_at desc")
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- @is_evaluation = @homework.homework_detail_manual && @homework.homework_detail_manual.comment_status == 2 && !@is_teacher #是不是匿评
- @show_all = false
-
- # 0表示没有分组的学生,-1表示所有分组的学生
- if @group
- if @group == "0"
- none_group_students = @course.members.select{ |member| member.course_group_id == 0 }
- if none_group_students.empty?
- student_in_group = '(0)'
- else
- student_in_group = '(' + none_group_students.map{ |member| member.user_id }.join(',') + ')'
- end
- elsif @group == "-1"
- all_group_students = @course.members.select{ |member| member.course_group_id }
- if all_group_students.empty?
- student_in_group = '(0)'
- else
- student_in_group = '(' + all_group_students.map{ |member| member.user_id }.join(',') + ')'
- end
- else
- course_group = CourseGroup.find_by_id(@group)
- group_students = course_group.users
- if group_students.empty?
- student_in_group = '(0)'
- else
- student_in_group = '(' + group_students.map{ |user| user.id }.join(',') + ')'
- end
- end
-
- #开放作品 || 老师 || 超级管理员 || 禁用匿评&&作业截止&&已提交作品 显示所有列表
- if (@homework.is_open == 1 && @course.is_public == 1) || (@homework.is_open == 1 && @course.is_public == 0 && User.current.member_of_course?(@course)) || @is_teacher || User.current.admin? || (User.current.member_of_course?(@course) && @homework.anonymous_comment == 1 && @homework.end_time < Time.now && !@homework.student_works.has_committed.where(:user_id => User.current.id).empty?)
- if params[:appeal] && params[:appeal].to_i == 1
- @stundet_works = @homework.student_works.no_copy.joins(:student_works_scores).where("reviewer_role = 3 and appeal_status = 1").
- select("student_works.*,student_works.work_score as score").where("users.id in #{student_in_group}")
- else
- @stundet_works = @homework.student_works.no_copy.select("student_works.*,student_works.work_score as score").where("users.id in #{student_in_group}")
- end
- if @order == 'lastname'
- @stundet_works = search_homework_member @stundet_works.joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
- elsif @order == 'student_id'
- @stundet_works = search_homework_member @stundet_works.joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
- else
- @stundet_works = search_homework_member @stundet_works.includes(:user => {:user_extensions => []}, :project => {}, :student_works_scores => {}).order("#{@order} #{@b_sort}"),@name
- end
- @show_all = true
- elsif User.current.member_of_course?(@course)
- if @homework.homework_detail_manual.comment_status == 1 #学生 && 未开启匿评 只看到自己的
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- @stundet_works = []
- else
- @stundet_works = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
- end
- else
- @stundet_works = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
- end
- elsif @homework.homework_detail_manual.comment_status == 2 #学生 && 开启匿评 看到匿评列表
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- my_work = []
- else
- my_work = @homework.student_works.where(:id => pro.student_work_id)
- end
- else
- my_work = @homework.student_works.has_committed.where(:user_id => User.current.id)
- end
- @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
- elsif @homework.homework_detail_manual.comment_status == 3 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- my_work = []
- else
- my_work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
- end
- else
- my_work = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
- end
- if my_work.empty?
- @stundet_works = []
- else
- if @order == 'lastname'
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
- elsif @order == 'student_id'
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
- else
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name
- end
- @show_all = true
- end
- else
- @stundet_works = []
- end
- else
- render_403
- return
- end
-
- @student_work_count = (search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name).count
- else
- if (@homework.is_open == 1 &&@course.is_public == 1) || (@homework.is_open == 1 && @course.is_public == 0 && User.current.member_of_course?(@course)) || @is_teacher || User.current.admin? || (User.current.member_of_course?(@course) && @homework.anonymous_comment == 1 && @homework.end_time < Time.now && !@homework.student_works.has_committed.where(:user_id => User.current.id).empty?)
- if params[:appeal] && params[:appeal].to_i == 1
- @stundet_works = @homework.student_works.no_copy.joins(:student_works_scores).where("reviewer_role = 3 and appeal_status = 1").
- select("student_works.*,student_works.work_score as score")
- else
- @stundet_works = @homework.student_works.no_copy.select("student_works.*,student_works.work_score as score")
- end
- if @order == 'lastname'
- @stundet_works = search_homework_member @stundet_works.joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
- elsif @order == 'student_id'
- @stundet_works = search_homework_member @stundet_works.joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
- else
- @stundet_works = search_homework_member @stundet_works.includes(:user => {:user_extensions => []}, :project => {}, :student_works_scores => {}).order("#{@order} #{@b_sort}"),@name
- end
- @show_all = true
- elsif User.current.member_of_course?(@course)
- if @homework.homework_detail_manual.comment_status == 1 #学生 && 未开启匿评 只看到自己的
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- @stundet_works = []
- else
- @stundet_works = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
- end
- else
- @stundet_works = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
- end
- elsif @homework.homework_detail_manual.comment_status == 2 #学生 && 开启匿评 看到匿评列表
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- my_work = []
- else
- my_work = @homework.student_works.where(:id => pro.student_work_id)
- end
- else
- my_work = @homework.student_works.has_committed.where(:user_id => User.current.id)
- end
- @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
- elsif @homework.homework_detail_manual.comment_status == 3 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
- if @homework.homework_type == 3
- pro = @homework.student_work_projects.where(:user_id => User.current.id).first
- if pro.nil?
- my_work = []
- else
- my_work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => pro.student_work_id)
- end
- else
- my_work = @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").where(:user_id => User.current.id)
- end
- if my_work.empty?
- @stundet_works = []
- else
- if @order == 'lastname'
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins(:user).order("CONVERT(lastname USING gbk) COLLATE gbk_chinese_ci #{@b_sort}, login #{@b_sort}"),@name
- elsif @order == 'student_id'
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").joins("join user_extensions on student_works.user_id = user_extensions.user_id").order("#{@order} #{@b_sort}"),@name
- else
- @stundet_works = search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").order("#{@order} #{@b_sort}"),@name
- end
- @show_all = true
- end
- else
- @stundet_works = []
- end
- else
- render_403
- return
- end
- @student_work_count = (search_homework_member @homework.student_works.has_committed.select("student_works.*,student_works.work_score as score").order("#{@order} #{@b_sort}"),@name).count
-
- end
-
- @is_group_project_homework = @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
- @all_group_projects = []
-
- if @is_group_project_homework
- project_ids = @homework.student_works.has_committed.joins(:student_work_projects).where("student_works.id = student_work_projects.student_work_id").pluck("student_work_projects.project_id").uniq
- project_url = "https://forgeplus.trustie.net"
- if request.subdomain.blank? || request.subdomain === '127.0.0.1'
- project_url = "http://127.0.0.1:3002"
- elsif request.subdomain == "ucloudtest"
- project_url = "https://testforgeplus.trustie.net"
- end
- url = "#{project_url}/api/users/trustie_related_projects.json" #trustie上的相关路由
- sync_params = {
- ids: project_ids,
- }
- uri = URI.parse(url)
- http = Net::HTTP.new(uri.hostname, uri.port)
- http.use_ssl = project_url.include?("forgeplus.trustie.net")
- response = http.send_request('GET', uri.path, sync_params.to_json, {'Content-Type' => 'application/json'})
- if response.code == "200"
- @all_group_projects = eval(response.body)[:projects]
- end
- end
-
- @score = @b_sort == "desc" ? "asc" : "desc"
- @is_focus = params[:is_focus] ? params[:is_focus].to_i : 0
- # 消息传过来的ID
- @message_student_work_id = params[:student_work_id]
- @left_nav_type = 3
- @tab = params[:tab].to_i
- respond_to do |format|
- format.js
- format.html
- format.xls {
- filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_homework_list)}.xls"
- send_data(homework_to_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
- :filename => filename_for_content_disposition(filename))
- }
- end
- end
-
- def new
- #更新消息
- noEvaluation = @homework.course_messages.where("user_id =? and viewed =?", User.current.id, 0)
- noEvaluation.update_all(:viewed => true)
-
- if @homework.homework_type==2
- redirect_to new_user_commit_homework_users_path(homework_id: @homework.id)
- return
- end
- @user = User.current
- #@student_work = @homework.student_works.where("user_id = ?",User.current.id).first
- #if @student_work.nil?
- @student_work = StudentWork.new
- #end
- respond_to do |format|
- format.html{ render :layout => "base_courses"}
- end
- end
-
- def create
- # 提交作品前先判断是否已经提交
- @has_commit = false;
- if hsd_committed_work?(User.current.id, @homework.id)
- @work = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", User.current.id, @homework.id).first
- @has_commit = true;
- #flash[:notice] = l(:notice_successful_create)
- #redirect_to edit_student_work_url(params[:student_work])
- respond_to do |format|
- format.js
- end
- return
- end
- if params[:student_work]
- @submit_result = true
- student_work = StudentWork.find(params[:student_work_id]) if params[:student_work_id]
- student_work = StudentWork.where("user_id =? and homework_common_id =? and work_status = 0", User.current.id, @homework.id).first
- student_work ||= StudentWork.new
- student_work.name = params[:student_work][:name] == "#{@homework.name}的作品提交(可修改)" ? "#{@homework.name}的作品提交" : params[:student_work][:name]
- student_work.description = params[:student_work][:description]
- student_work.homework_common_id = @homework.id
- student_work.user_id = User.current.id
- student_work.commit_time = Time.now
- student_work.save_attachments(params[:attachments])
- render_attachment_warning_if_needed(student_work)
- if @homework.homework_type == 3 && @homework.homework_detail_group.base_on_project == 1
- @student_work_project = @homework.student_work_projects.where("user_id = #{User.current.id}").first
- student_work.project_id = @student_work_project.project_id
- end
- #提交作品时,计算是否迟交
- if @homework.end_time < Time.now.to_s
- student_work.late_penalty = @homework.late_penalty
- student_work.work_status = 2
- # 缺评扣分
- if @homework.homework_detail_manual.no_anon_penalty == 0 && @homework.homework_detail_manual.comment_status == 3 && @homework.anonymous_comment == 0
- work_ids = "(" + @homework.student_works.has_committed.map(&:id).join(",") + ")"
- all_dis_eva = StudentWorksEvaluationDistribution.where("student_work_id IN #{work_ids}")
- has_sw_count = all_dis_eva.select("distinct user_id").count
- anon_count = all_dis_eva.count / has_sw_count
- student_work.absence_penalty = @homework.homework_detail_manual.absence_penalty * anon_count
- end
-
- #更新CourseHomeworkStatistics中学生的迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, User.current.id)
- course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics
- else
- student_work.late_penalty = 0
- student_work.work_status = 1
- end
- if student_work.save
- #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, User.current.id)
- course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics
-
- if @homework.homework_type == 3
- if @homework.homework_detail_group.base_on_project == 1
- @student_work_project.student_work_id = student_work.id
- @student_work_project.save
- elsif @homework.homework_detail_group.base_on_project == 0
- stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => student_work.id, :project_id => student_work.project_id, :user_id => student_work.user_id, :is_leader => 1, :course_id => @homework.course_id)
- stu_project.save
- end
- members = params[:group_member_ids].split(',')
- for i in 1 .. members.count-1
- stu_work = StudentWork.new(:name => student_work.name, :description => student_work.description,:user_id =>members[i].to_i, :homework_common_id => @homework.id,:project_id => student_work.project_id, :late_penalty => student_work.late_penalty,:work_status => 3, :commit_time => student_work.commit_time)
- if stu_work.save
- stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => student_work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => members[i].to_i, :is_leader => 0, :course_id => @homework.course_id)
- stu_project.save
- end
-
- #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, members[i].to_i)
- course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics
- if student_work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics
- end
- end
- end
- @homework.update_column(:updated_at, Time.now)
- update_course_activity(@homework.class,@homework.id)
- update_user_activity(@homework.class,@homework.id)
- update_org_activity(@homework.class,@homework.id)
-
- course_message = CourseMessage.new(:user_id =>User.current.id,:content=>"new",:course_message_id=>student_work.id,:course_id => @course.id,:course_message_type=>"StudentWork", :status => 9) #作品提交记录
- course_message.save
-
- @student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id).first
- respond_to do |format|
- format.js
- end
- return
- end
- end
- @submit_result = false
- respond_to do |format|
- format.js
- end
- end
-
- def edit
- @user = User.current
- if (!User.current.admin? && @homework.homework_type == 2) || @homework.end_time < Time.now #编程作业不能修改作业|| 截止日期已到不能修改作业
- render_403
- else
- respond_to do |format|
- format.html{ render :layout => "base_courses"}
- end
- end
- end
-
- def update
- if params[:student_work]
- @submit_result = true
- @work.name = params[:student_work][:name]
- @work.description = params[:student_work][:description]
- @work.save_attachments(params[:attachments])
- render_attachment_warning_if_needed(@work)
- if @work.save
- #如果学生作品被打分后修改,应该给老师提示
- send_message_to_teacher(@work)
- if @homework.homework_type == 3
- @student_work_project = @homework.student_work_projects.where("user_id=?",User.current.id).first
- student_work_projects = @homework.student_work_projects.where("student_work_id=? and is_leader =?",@work.id,0)
- user_ids = student_work_projects.empty? ? "(-1)" : "(" + student_work_projects.map{|stu|stu.user_id}.join(",") + ")"
- student_works = @homework.student_works.where("user_id in #{user_ids}")
- student_works.each do |sw|
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
- end
- student_works.destroy_all
- student_work_projects.destroy_all
- members = params[:group_member_ids].split(',')
- for i in 1 .. members.count-1
- stu_work = StudentWork.new(:name => @work.name, :description => @work.description,:user_id=> members[i].to_i, :homework_common_id => @homework.id, :project_id => @work.project_id, :late_penalty => @work.late_penalty,:work_status => 3, :commit_time => @work.commit_time)
- if stu_work.save
- stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => @work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => members[i].to_i, :is_leader => 0, :course_id => @homework.course_id)
- stu_project.save
- end
-
- #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, members[i].to_i)
- course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics
- end
- end
- end
-
- course_message = CourseMessage.new(:user_id =>User.current.id,:content=>"edit",:course_message_id=>@work.id,:course_id => @course.id,:course_message_type=>"StudentWork", :status => 9) #作品提交记录
- course_message.save
- @student_work = @work
- respond_to do |format|
- format.js
- end
- return
- end
- end
- =begin
- respond_to do |format|
- format.html{redirect_to edit_student_work_url(@work)}
- end
- =end
- @submit_result = false
- respond_to do |format|
- format.js
- end
- end
-
- def show
- #匿评申诉消息状态更新
- if @work && !@work.student_works_scores.where("reviewer_role = 3 and appeal_status != 0").blank?
- score_ids = "(" + @work.student_works_scores.where("reviewer_role = 3 and appeal_status != 0").map{|score| score.id}.join(",") + ")"
- score_appeal_ids = StudentWorksScoresAppeal.where("student_works_score_id in #{score_ids}").blank? ? "(-1)" : "(" + StudentWorksScoresAppeal.where("student_works_score_id in #{score_ids}").map{|score_appeal| score_appeal.id}.join(",") + ")"
- anonymous_appeal =AppliedMessage.where("user_id =? and applied_id in #{score_appeal_ids} and applied_type =? and viewed =?", User.current.id, 'StudentWorksScoresAppeal', 0)
- anonymous_appeal.update_all(:viewed => true)
- appeal_message = CourseMessage.where("user_id =? and course_id =? and course_message_id in #{score_appeal_ids} and course_message_type =? and viewed =?", User.current.id, @homework.course, "StudentWorksScoresAppeal", 0)
- appeal_message.update_all(:viewed => true)
- end
-
- @score = student_work_score @work,User.current
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- if @homework.homework_detail_manual.comment_status == 2 && !@is_teacher && @work.user != User.current
- @student_work_scores = @work.student_works_scores.where("user_id = #{User.current.id} and reviewer_role = 3").order("updated_at desc").limit(1)
- else
- @student_work_scores = student_work_score_record(@work)
- end
- respond_to do |format|
- format.js
- end
- end
-
- def destroy
- if @homework.homework_type == 3
- pros = @work.student_work_projects.where("is_leader = 0")
- user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")"
- student_works = @homework.student_works.where("user_id in #{user_ids}")
-
- #更新CourseHomeworkStatistics中每个学生的未交作品数、已交作品数、迟交作品数
- student_works.each do |sw|
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
- end
- student_works.destroy_all
- pros.destroy_all
-
- project = @work.student_work_projects.where("is_leader = 1").first
- if @homework.homework_detail_group.base_on_project == 1
- project.update_attributes(:student_work_id => nil)
- else
- project.destroy
- end
- @work.destroy
- else
- #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
-
- @work.attachments.destroy_all
- @work.student_works_scores.destroy_all
- @work.course_messages.destroy_all
- @work.student_work_tests.destroy_all
- @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0, :commit_time => nil,:final_score => nil,:teacher_score => nil,:student_score => nil,:teaching_asistant_score => nil,:system_score => 0,:work_score => nil, :project_id => 0)
- @work.update_column("work_score",nil)
- end
- respond_to do |format|
- format.html {
- redirect_to student_work_index_url(:homework => @homework.id)
- }
- end
- end
-
- def delete_work
- @work = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", User.current.id, @homework.id).first
- if @work
- if @homework.homework_type == 3
- pros = @work.student_work_projects.where("is_leader = 0")
- user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")"
- student_works = @homework.student_works.where("user_id in #{user_ids}")
-
- #更新CourseHomeworkStatistics中每个学生的已交作品数、迟交作品数
- student_works.each do |sw|
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
- end
- student_works.delete_all
- pros.delete_all
-
- project = @work.student_work_projects.where("is_leader = 1").first
- if @homework.homework_detail_group.base_on_project == 1
- project.update_attributes(:student_work_id => nil)
- else
- project.destroy
- end
- @work.destroy
- else
- #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
-
- @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0, :commit_time => nil, :project_id => 0)
- @work.attachments.destroy_all
- @work.course_messages.destroy_all
- end
- end
- redirect_to student_work_index_path(:homework => @homework.id)
- end
-
- def retry_work
- if @homework.homework_type == 3
- pros = @work.student_work_projects.where("is_leader = 0")
- user_ids = pros.empty? ? "(-1)" : "(" + pros.map{|stu|stu.user_id}.join(",") + ")"
- student_works = @homework.student_works.where("user_id in #{user_ids}")
-
- #更新CourseHomeworkStatistics中每个学生的已交作品数、迟交作品数
- student_works.each do |sw|
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, sw.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
- end
- student_works.delete_all
- pros.delete_all
-
- project = @work.student_work_projects.where("is_leader = 1").first
- if @homework.homework_detail_group.base_on_project == 1
- project.update_attributes(:student_work_id => nil)
- else
- project.destroy
- end
- @work.destroy
- else
- #更新CourseHomeworkStatistics中学生的已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id)
- if @work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
-
- @work.update_attributes(:work_status => 0, :name => "#{@homework.name}的作品提交", :description => nil, :late_penalty => 0, :commit_time => nil, :project_id => 0)
- @work.attachments.destroy_all
- @work.course_messages.destroy_all
- end
- @student_work = StudentWork.new
- respond_to do |format|
- format.js
- end
- end
-
- #添加评分,已评分则为修改评分
- def add_score
- @is_last = params[:is_last] == "true"
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- #老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分
- render_403 and return unless @is_teacher || @homework.homework_detail_manual.comment_status == 2
- #@score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
- #@score.score = params[:score] if params[:score]
- #if User.current.admin?
- # @score.reviewer_role = 1
- #else
- # role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name
- # @score.reviewer_role = get_role_by_name(role)
- #end
- #@is_new = false
- @is_last_a = @work.student_works_scores.empty?
- @new_score = StudentWorksScore.new
- if params[:score] == -1
- score = student_work_score @work,User.current
- @new_score.score = @score.try(:score)
- else
- @new_score.score = params[:score]
- end
-
- @new_score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
- @new_score.user_id = User.current.id
- @new_score.student_work_id = @work.id
- if @is_teacher && !@new_score.score.nil? && @work.work_status == 0
- @work.work_status = 1
- @work.commit_time = Time.now
- #更新CourseHomeworkStatistics中学生的已交作品数、未交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, @work.user_id)
- course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics
- end
- if User.current.admin?
- @new_score.reviewer_role = 1
- else
- role = User.current.members.where("course_id = ?",@course.id).first.roles.where("is_current = 1").first.name
- @new_score.reviewer_role = get_role_by_name(role)
- end
-
- @new_score.save_attachments(params[:attachments])
- render_attachment_warning_if_needed(@new_score)
-
- if @new_score.save
- if @work.re_commit && @new_score.reviewer_role != 3
- @work.re_commit = 0
- end
- if @homework.homework_type == 3
- @is_group_leader = !@work.student_work_projects.empty?
- end
- case @new_score.reviewer_role
- when 1 #教师评分:最后一个教师评分为最终评分
- @work.teacher_score = @new_score.score
- if @is_group_leader && params[:same_score]
- add_score_to_member @work, @homework, @new_score
- end
- when 2 #教辅评分 教辅评分显示平均分
- #@work.teaching_asistant_score = @work.student_works_scores.where(:reviewer_role => 2).average(:score).try(:round, 2).to_f
- if @homework.homework_detail_manual.ta_mode == 1
- ts_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM student_works_scores where id in (select max(id) FROM student_works_scores WHERE student_work_id = #{@work.id} AND reviewer_role = 2 AND score IS NOT NULL GROUP BY user_id)")
- @work.teaching_asistant_score = ts_score.first.score.nil? ? nil : ts_score.first.score.try(:round, 2).to_f
- else
- @work.teaching_asistant_score = @new_score.score
- end
- if @is_group_leader && params[:same_score]
- add_score_to_member @work, @homework, @new_score
- end
- when 3 #学生评分 学生评分显示平均分
- #@work.student_score = @work.student_works_scores.where(:reviewer_role => 3).average(:score).try(:round, 2).to_f
- stu_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM student_works_scores where id in (select max(id) FROM student_works_scores WHERE student_work_id = #{@work.id} AND reviewer_role = 3 AND appeal_status != 3 GROUP BY user_id)")
- @work.student_score = stu_score.first.score.try(:round, 2).to_f
- if @is_group_leader
- add_score_to_member @work, @homework, @new_score
- end
-
- User.current.student_works_scores.where(:student_work_id => @work.id, :reviewer_role => 3, :appeal_status => 1).update_all(:appeal_status => 5)
-
- #更新CourseHomeworkStatistics中该学生的待匿评数, 只计算第一次评分
- if User.current.student_works_scores.where(:student_work_id => @work.id, :reviewer_role => 3).count == 1
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, User.current.id)
- course_statistics.update_attribute('un_evaluation_work_num', (course_statistics.un_evaluation_work_num - 1) < 0 ? 0 : (course_statistics.un_evaluation_work_num - 1)) if course_statistics
- end
- end
- @homework.update_column('updated_at', Time.now)
- update_course_activity(@homework.class,@homework.id)
- update_user_activity(@homework.class,@homework.id)
- # update_org_activity(@homework.class,@homework.id)
- if @work.save
- @work = @homework.student_works.select("student_works.*,student_works.work_score as score").where(:id => @work.id).first
- @count = @homework.student_works.has_committed.count
- @student_work_scores = student_work_score_record @work
- respond_to do |format|
- format.js
- end
- end
- end
- end
-
- #添加评分的回复
- def add_score_reply
- @score = StudentWorksScore.find params[:score_id]
- @is_last = params[:is_last] == "true"
- @jour = @score.journals_for_messages.new(:user_id => User.current.id,:notes =>params[:message], :reply_id => 0)
- @show_real_name = User.current.allowed_to?(:as_teacher, @score.student_work.homework_common.course) || User.current.admin? || @score.reviewer_role != 3 || @jour.user == User.current
- if @jour.save
- @status = 1
- else
- @status = 2
- end
- respond_to do |format|
- format.js
- end
- end
-
- #删除评分的回复
- def destroy_score_reply
- @jour = JournalsForMessage.find params[:jour_id]
- if @jour.destroy
- respond_to do |format|
- format.js
- end
- end
- end
-
- #提交未评分的评语
- def add_comments_to_work
- @work = StudentWork.find params[:id]
- respond_to do |format|
- format.js
- end
- end
-
- #为作品点赞
- def praise_student_work
- pt = PraiseTread.new
- pt.user_id = User.current.id
- pt.praise_tread_object_id = @work.id
- pt.praise_tread_object_type = "StudentWork"
- pt.praise_or_tread = 1
- if pt.save
- respond_to do |format|
- format.js
- end
- else
- render_404
- end
- end
-
- def hide_score_detail
- student_work_score = StudentWorksScore.where(:id => params[:score_id]).first
- if student_work_score
- student_work_score.update_attributes(:is_hidden => 1)
- end
- @is_member_work = @homework.homework_type == 3 && @work.student_work_projects.empty?
- @student_work_scores = student_work_score_record(@work)
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- respond_to do |format|
- format.js
- end
- end
-
- #缺评列表显示
- def student_work_absence_penalty
- order = params[:order] || "desc"
- if @homework.student_works.empty?
- @stundet_works = []
- else
- work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
- @stundet_works = StudentWork.find_by_sql("SELECT *,(all_count - has_count) AS absence FROM(
- SELECT * ,
- (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count,
- (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
- FROM `student_works`
- WHERE homework_common_id = #{@homework.id}
- ) AS table_1
- ORDER BY absence #{order}")
- end
- @order = order == "desc" ? "asc" : "desc"
- @left_nav_type = 3
- respond_to do |format|
- format.html
- end
- end
-
- #导出缺评列表
- def absence_penalty_list
- if @homework.student_works.empty?
- @stundet_works = []
- else
- work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
- @stundet_works = StudentWork.find_by_sql("SELECT * FROM (SELECT *,(all_count - has_count) AS absence FROM(
- SELECT * ,
- (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count,
- (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
- FROM `student_works`
- WHERE homework_common_id = #{@homework.id}
- ) AS table_1) AS table_2
- where absence > 0 order by absence")
- end
- respond_to do |format|
- format.xls {
- filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_absence_list)}.xls"
- send_data(absence_penalty_list_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
- :filename => filename_for_content_disposition(filename))
- }
- end
- end
-
- #导出匿评列表
- def evaluation_list
- respond_to do |format|
- format.xls {
- filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_evaluation_list)}.xls"
- send_data(evaluation_list_xls(@homework.student_works), :type => "text/excel;charset=utf-8; header=present",
- :filename => filename_for_content_disposition(filename))
- }
- end
- end
-
- #设置评分规则
- def set_score_rule
- homework_detail_manual = @homework.homework_detail_manual
- homework_detail_programing = @homework.homework_detail_programing
-
- unless @homework.late_penalty.to_s == params[:late_penalty].to_s
- @homework.late_penalty = params[:late_penalty].to_s
- @homework.student_works.where("commit_time > '#{@homework.end_time}'").each do |student_work|
- student_work.late_penalty = params[:late_penalty].to_i
- student_work.save
- end
- end
-
- unless (params[:anonymous_appeal].to_i == 1 && @homework.anonymous_appeal == 1 && params[:appeal_penalty].to_i == homework_detail_manual.appeal_penalty) || (params[:anonymous_appeal].to_i == 0 && @homework.anonymous_appeal == 0)
- if params[:anonymous_appeal].to_i == 0 && @homework.anonymous_appeal != 0
- homework_detail_manual.appeal_penalty = 0
- StudentWork.where("homework_common_id = #{@homework.id} and work_status != 0").each do |student_work|
- student_work.update_attribute('appeal_penalty', 0)
- end
- else
- homework_detail_manual.appeal_penalty = params[:appeal_penalty].to_i
- work_ids = "(" + @homework.student_works.has_committed.map(&:id).join(",") + ")"
- @homework.student_works.where("work_status != 0").each do |student_work|
- appeal_penalty_count = student_work.user.student_works_scores.where("student_work_id IN #{work_ids} and appeal_status = 3").count
- student_work.appeal_penalty = appeal_penalty_count > 0 ? appeal_penalty_count * params[:appeal_penalty].to_i : 0
- student_work.save
- end
- end
-
- @homework.anonymous_appeal = params[:anonymous_appeal].to_i
- homework_detail_manual.save if homework_detail_manual
- end
-
- no_anon_penalty = params[:no_anon_penalty] ? 0 : 1
-
- if (params[:absence_penalty] && homework_detail_manual.absence_penalty.to_s != params[:absence_penalty].to_s)
- homework_detail_manual.absence_penalty = params[:absence_penalty]
- homework_detail_manual.save if homework_detail_manual
- if homework_detail_manual.comment_status == 3 #当前作业处于匿评结束状态,修改缺评扣分才会修改每个作品应扣分的值
- work_ids = "(" + @homework.student_works.has_committed.map(&:id).join(",") + ")"
- all_dis_eva = StudentWorksEvaluationDistribution.where("student_work_id IN #{work_ids}")
- has_sw_count = all_dis_eva.select("distinct user_id").count
- anon_count = all_dis_eva.count / has_sw_count
- @homework.student_works.where("work_status != 0").each do |student_work|
- if student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count != 0
- absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids} and reviewer_role = 3").count
- student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual.absence_penalty : 0
- else
- if no_anon_penalty
- student_work.absence_penalty = homework_detail_manual.absence_penalty * anon_count
- else
- student_work.absence_penalty = 0
- end
- end
- student_work.save
- end
- end
- end
-
- if no_anon_penalty != homework_detail_manual.no_anon_penalty
- homework_detail_manual.no_anon_penalty = no_anon_penalty
- if homework_detail_manual.comment_status == 3 #当前作业处于匿评结束状态,修改缺评扣分才会修改每个作品应扣分的值
- work_ids = "(" + @homework.student_works.has_committed.map(&:id).join(",") + ")"
- all_dis_eva = StudentWorksEvaluationDistribution.where("student_work_id IN #{work_ids}")
- has_sw_count = all_dis_eva.select("distinct user_id").count
- anon_count = all_dis_eva.count / has_sw_count
- @homework.student_works.where("work_status != 0").each do |student_work|
- if student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count == 0
- if no_anon_penalty == 0
- student_work.absence_penalty = homework_detail_manual.absence_penalty * anon_count
- else
- student_work.absence_penalty = 0
- end
- student_work.save
- end
- end
- end
- homework_detail_manual.save if homework_detail_manual
- end
-
- if params[:ta_mode] && homework_detail_manual.ta_mode.to_i != params[:ta_mode].to_i
- homework_detail_manual.ta_mode = params[:ta_mode].to_i
- homework_detail_manual.save
- if homework_detail_manual.ta_mode == 1
- @homework.student_works.where("work_status != 0").each do |student_work|
- ts_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM (SELECT * FROM (SELECT * FROM student_works_scores WHERE student_work_id = #{student_work.id} AND reviewer_role = 2 AND score IS NOT NULL ORDER BY created_at DESC) AS t GROUP BY user_id) AS a")
- student_work.teaching_asistant_score = ts_score.first.score.nil? ? nil : ts_score.first.score.try(:round, 2).to_f
- student_work.save
- end
- else
- @homework.student_works.where("work_status != 0").each do |student_work|
- ts_score = StudentWorksScore.where("student_work_id = #{student_work.id} AND reviewer_role = 2 AND score IS NOT NULL").order("created_at DESC")
- student_work.teaching_asistant_score = ts_score.first.nil? ? nil : ts_score.first.score
- student_work.save
- end
- end
- end
-
- if params[:final_mode] && params[:final_mode].to_i != homework_detail_manual.final_mode
- homework_detail_manual.final_mode = params[:final_mode].to_i
- if params[:final_mode].to_i == 0
- homework_detail_manual.te_proportion = params[:te_proportion]
- homework_detail_manual.ta_proportion = params[:ta_proportion]
- homework_detail_programing.ta_proportion = params[:sy_proportion] if homework_detail_programing
- homework_detail_programing.save if homework_detail_programing
- end
- homework_detail_manual.save if homework_detail_manual
- @homework.save
- @homework = HomeworkCommon.find @homework.id
- @homework.student_works.each do |student_work|
- set_final_score @homework,student_work
- student_work.save
- end
- elsif params[:final_mode] && homework_detail_manual.final_mode == 0
- if (params[:te_proportion] && params[:te_proportion].to_s != homework_detail_manual.te_proportion.to_s) || (params[:ta_proportion] && params[:ta_proportion].to_s != homework_detail_manual.ta_proportion.to_s) || (homework_detail_programing && homework_detail_programing.ta_proportion.to_s != params[:sy_proportion].to_s)
- homework_detail_manual.te_proportion = params[:te_proportion]
- homework_detail_manual.ta_proportion = params[:ta_proportion]
- homework_detail_programing.ta_proportion = params[:sy_proportion] if homework_detail_programing
-
- homework_detail_manual.save if homework_detail_manual
- homework_detail_programing.save if homework_detail_programing
- @homework.save
- @homework = HomeworkCommon.find @homework.id
- @homework.student_works.each do |student_work|
- set_final_score @homework,student_work
- student_work.save
- end
- end
- end
-
- @homework.save
- if params[:student_path] && params[:student_path] == "true"
- redirect_to student_work_index_url(:homework => @homework.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
-
- def appeal_anonymous_score
- @student_work_score = StudentWorksScore.where("id = #{params[:score_id].to_i}").first
- @is_last = params[:is_last] == "true" ? true : false
- if @student_work_score
- @student_work_score.update_column('appeal_status', 1)
- score_appeal = StudentWorksScoresAppeal.create(:user_id => User.current.id, :student_works_score_id => @student_work_score.id, :comment => params[:appeal][:comment], :appeal_status => 1)
- course = @student_work_score.student_work.homework_common.course
- course.members.includes(:member_roles).where("member_roles.role_id in (3, 7, 9)").each do |member|
- AppliedMessage.create(:user_id => member.user_id, :status => 0, :viewed => 0, :applied_id => score_appeal.id, :applied_type => 'StudentWorksScoresAppeal', :applied_user_id => User.current.id)
- end
- CourseMessage.create(:user_id => @student_work_score.user_id, :course_id => course.id, :viewed => false,:course_message_id=> score_appeal.id,:course_message_type=>'StudentWorksScoresAppeal',:status=>1)
- end
- @homework = @student_work_score.student_work.homework_common
- @is_teacher = User.current.allowed_to?(:as_teacher, course) || User.current.admin?
- end
-
- def alert_appeal_box
- @student_work_score = StudentWorksScore.where("id = #{params[:score_id].to_i}").first
- @is_last = params[:is_last]
- end
-
- def deal_appeal_score
- @student_work_score = StudentWorksScore.where("id = #{params[:score_id].to_i}").first
- @is_last = params[:is_last] == "true" ? true : false
- if @student_work_score && @student_work_score.appeal_status == 1
- @student_work_score.update_column('appeal_status', params[:status].to_i)
- score_appeal = @student_work_score.student_works_scores_appeal
- score_appeal.applied_messages.update_all(:status => params[:status].to_i == 2 ? 3 : (params[:status].to_i == 3 ? 1 : 2))
- if params[:status].to_i == 3 || params[:status].to_i == 4
- homework = @student_work_score.student_work.homework_common
- course = homework.course
- if params[:status].to_i == 3
- # 申诉成功后 扣匿评学生的违规匿评扣分
- sw = homework.student_works.where("user_id = #{@student_work_score.user_id}").first
- sw.update_attribute("appeal_penalty", homework.homework_detail_manual.appeal_penalty + sw.appeal_penalty)
-
- #申诉成功,匿评学生的被申诉记录加一
- course_homework_statistics = CourseHomeworkStatistics.where(:user_id => @student_work_score.user_id, :course_id => course.id).first
- if course_homework_statistics
- course_homework_statistics.update_attribute('appeal_num', course_homework_statistics.appeal_num + 1)
- end
-
- # 申诉成功 重新计算申诉者的匿评分
- work = @student_work_score.student_work
- if work.student_works_scores.where("reviewer_role = 3 AND appeal_status != 3").count > 0
- stu_score = StudentWorksScore.find_by_sql("SELECT AVG(score) AS score FROM student_works_scores where id in (select max(id) FROM student_works_scores WHERE student_work_id = #{@student_work_score.student_work_id} AND reviewer_role = 3 AND appeal_status != 3 GROUP BY user_id)")
- work.student_score = stu_score.first.score.try(:round, 2).to_f
- else
- work.student_score = nil
- end
- @student_work_score.student_work.save
- end
- CourseMessage.create(:user_id => @student_work_score.user_id, :course_id => course.id, :viewed => false,:course_message_id=> score_appeal.id,:course_message_type=>'StudentWorksScoresAppeal',:status=>params[:status].to_i,:apply_result =>User.current.id)
- CourseMessage.create(:user_id => score_appeal.user_id, :course_id => course.id, :viewed => false,:course_message_id=> score_appeal.id,:course_message_type=>'StudentWorksScoresAppeal',:status=>params[:status].to_i,:apply_result =>User.current.id)
- end
- end
- @homework = @student_work_score.student_work.homework_common
- @is_teacher = User.current.allowed_to?(:as_teacher, course) || User.current.admin?
- @work = @student_work_score.student_work
- @is_group_leader = !@work.student_work_projects.empty?
- end
-
- def forbidden_anonymous_comment
- homework_detail_manual = @homework.homework_detail_manual
- if homework_detail_manual.comment_status != 0
- @homework.update_column('anonymous_comment', @homework.anonymous_comment == 0 ? 1 : 0)
- homework_detail_programing = @homework.homework_detail_programing
- if @homework.anonymous_comment == 1
- @status = 1
- else
- if @homework.end_time < Time.now
- homework_detail_manual.evaluation_start = (Time.now + 7*24*60*60).strftime("%Y-%m-%d")
- homework_detail_manual.evaluation_end = homework_detail_manual.evaluation_start + 7
- @status = 2
- else
- homework_detail_manual.evaluation_start = (@homework.end_time + 7*24*60*60).strftime("%Y-%m-%d")
- homework_detail_manual.evaluation_end = homework_detail_manual.evaluation_start + 7
- @status = 3
- end
- end
- homework_detail_manual.te_proportion = 1.0
- homework_detail_manual.ta_proportion = 0
-
- if @homework.homework_type == 2 && homework_detail_programing
- homework_detail_programing.ta_proportion = 0
- end
- homework_detail_manual.save
- homework_detail_programing.save if homework_detail_programing
- @homework.student_works.each do |student_work|
- set_final_score @homework,student_work
- student_work.save
- end
- @user_activity_id = params[:user_activity_id].to_i
- @hw_status = params[:hw_status].to_i
- else
- @status = 0
- end
- end
-
- def revise_attachment
- Attachment.attach_filesex(@work, params[:attachments], params[:attachment_type])
- revise_attachments = @work.attachments.where("attachtype = 7").reorder("created_on desc")
- if revise_attachments.count == 2
- revise_attachments.last.destroy
- end
- attachment = @work.attachments.where("attachtype = 7").first
- attachment.update_attributes(:description => params[:description])
- if attachment.attachtype == 7
- student_work = StudentWork.find attachment.container_id
- CourseMessage.create(:user_id => student_work.homework_common.user_id, :course_id => student_work.homework_common.course_id, :viewed => false,:course_message_id=>attachment.container_id,:course_message_type=>'StudentWork',:status=>2)
- end
- @work.update_attributes(:re_commit => 1)
- respond_to do |format|
- format.js
- end
- @homework = @work.homework_common
- end
-
- def new_student_work_project
- @user_activity_id = params[:user_activity_id].to_i
- @hw_status = params[:hw_status].to_i
- respond_to do |format|
- format.js
- end
- end
-
- #创建作业的关联项目
- def student_work_project
- @work = @homework.student_works.where("user_id = #{User.current.id} and work_status = 0").first
- if @work
- @work.update_column('project_id', params[:projectName].to_i)
- end
- @project = StudentWorkProject.new
- @project.homework_common_id = @homework.id
- @project.project_id = params[:projectName].to_i
- @project.user_id = User.current.id
- @project.is_leader = 1
- @project.course_id = @homework.course_id
- if @project.save
- @user_activity_id = params[:user_activity_id].to_i
- @hw_status = params[:hw_status].to_i
- @is_teacher = User.current.allowed_to?(:as_teacher,@homework.course) || User.current.admin?
- respond_to do |format|
- format.js
- end
- end
-
- end
-
- #查找学生创建的项目列表
- def search_user_projects
- Rails.logger.info("=============#######{request.subdomain}")
- project_url = "https://forgeplus.trustie.net"
-
- if request.subdomain.blank? || request.subdomain === '127.0.0.1'
- project_url = "http://127.0.0.1:3002"
- elsif request.subdomain == "ucloudtest"
- project_url = "https://testforgeplus.trustie.net"
- end
- url = "#{project_url}/api/users/trustie_projects.json" #trustie上的相关路由
- sync_params = {
- login: current_user.try(:login),
- search: params[:name] || ""
- }
- uri = URI.parse(url)
- http = Net::HTTP.new(uri.hostname, uri.port)
- http.use_ssl = project_url.include?("forgeplus.trustie.net")
- response = http.send_request('GET', uri.path, sync_params.to_json, {'Content-Type' => 'application/json'})
- @project_ids = []
- if response.code == "200"
- @project_ids = eval(response.body)[:projects]
- end
-
-
- # condition = '%%'
- # if !params[:name].nil?
- # condition = "%#{params[:name].strip}%".gsub(" ","")
- # end
- # @project_ids = Project.visible.where("user_id = #{User.current.id} and name like '#{condition}'")
- @first = params[:first].to_i
-
- respond_to do |format|
- format.js
- end
-
- end
-
- # 作品更换关联项目
- def change_project
- work = @homework.student_works.has_committed.where("user_id = #{User.current.id}").first
- project = Project.find params[:projectName].to_i
- if work && project
- relate_user_ids = work.student_work_projects.map{|pro| pro.user_id}
- member_ids = project.members.map{|mem| mem.user_id}
- if (relate_user_ids & member_ids) == relate_user_ids
- work.student_work_projects.update_all(:project_id => params[:projectName].to_i)
- student_works = @homework.student_works.where("user_id in #{'(' + relate_user_ids.join(',') + ')'}")
- student_works.update_all(:project_id => params[:projectName].to_i)
- else
- @remain_user_ids = relate_user_ids - (relate_user_ids & member_ids)
- end
- end
- respond_to do |format|
- format.js
- end
- end
-
- #查找课程的学生
- def search_course_students
- name = ""
- unless params[:name].nil?
- name = params[:name]
- end
- if @homework.homework_detail_group.base_on_project == 0
- all_student_ids = "(" + @homework.course.student.map{|student| student.student_id}.join(",") + ")"
- else
- pro = Project.find @homework.student_work_projects.where("user_id=?",User.current.id).first.project_id
- all_student_ids = "(" + pro.members.map{|member| member.user_id}.join(",") + ")"
- end
- all_students = User.where("id in #{all_student_ids}")
- student_work_id = @homework.student_work_projects.where("user_id=? and student_work_id is not null",User.current.id).first.nil? ? -1 : @homework.student_work_projects.where("user_id=?",User.current.id).first.student_work_id
- @commit_student_ids = @homework.student_works.where("id != #{student_work_id}").map{|student| student.user_id}
- @users = searchstudent_by_name all_students,name
- respond_to do |format|
- format.js
- end
- end
-
- def cancel_relate_project
- @work = @homework.student_works.where("user_id = #{User.current.id} and work_status = 0").first
- if @work
- @work.update_column('project_id', 0)
- end
- relate_pro = StudentWorkProject.where("user_id = #{User.current.id} and homework_common_id = #{@homework.id}").first
- if relate_pro.destroy
- @user_activity_id = params[:user_activity_id].to_i
- @hw_status = params[:hw_status].to_i
- @is_teacher = User.current.allowed_to?(:as_teacher,@homework.course) || User.current.admin?
- respond_to do |format|
- format.js
- end
- end
- end
-
- def get_user_infor
- req = Hash.new(false)
- user = User.where("id = #{params[:user_id].to_i}").first
- if user
- req[:id] = user.id
- req[:name] = user.show_name
- req[:student_id] = user.user_extensions.student_id
- req[:valid] = true
- else
- req[:valid] = false
- end
- render :json => req
- end
-
- #作业截止后组长添加成员
- def add_group_member
- student_work = @homework.student_works.where("user_id = #{User.current.id}").first
- if params[:member_id]
- #为新增加的成员创建作品
- for i in 1 .. params[:member_id].count do
- work = StudentWork.find_by_homework_common_id_and_user_id(@homework.id, params[:member_id][i].to_i)
- unless work
- stu_work = StudentWork.new(:name => student_work.name, :description => student_work.description,:user_id =>params[:member_id][i].to_i, :homework_common_id => @homework.id,:project_id => student_work.project_id, :late_penalty => student_work.late_penalty,:work_status => 3, :commit_time => Time.now)
- if stu_work.save
- stu_project = StudentWorkProject.new(:homework_common_id => @homework.id, :student_work_id => student_work.id, :project_id => stu_work.project_id == 0 ? -1 : stu_work.project_id, :user_id => params[:member_id][i].to_i, :is_leader => 0, :course_id => @homework.course_id)
- stu_project.save
- end
-
- #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, params[:member_id][i].to_i)
- course_statistics.update_attribute('committed_work_num', course_statistics.committed_work_num + 1) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', (course_statistics.un_commit_work_num - 1) < 0 ? 0 : (course_statistics.un_commit_work_num - 1)) if course_statistics
- if student_work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', course_statistics.late_commit_work_num + 1) if course_statistics
- end
- end
- end
-
- #未选择的成员删除作品
- student_work_projects = @homework.student_work_projects.where("student_work_id=? and is_leader =?",student_work.id,0)
- student_work_projects.each do |sp|
- unless params[:member_id].include?(sp.user_id.to_s)
- work = StudentWork.where("homework_common_id = #{@homework.id} and user_id = #{sp.user_id}").first
- sp.destroy
- if work
- #更新CourseHomeworkStatistics中学生的未交作品数、已交作品数、迟交作品数
- course_statistics = CourseHomeworkStatistics.find_by_course_id_and_user_id(@homework.course_id, work.user_id)
- if student_work.work_status == 2
- course_statistics.update_attribute('late_commit_work_num', (course_statistics.late_commit_work_num - 1) < 0 ? 0 : (course_statistics.late_commit_work_num - 1)) if course_statistics
- end
- course_statistics.update_attribute('committed_work_num', (course_statistics.committed_work_num - 1) < 0 ? 0 : (course_statistics.committed_work_num - 1)) if course_statistics
- course_statistics.update_attribute('un_commit_work_num', course_statistics.un_commit_work_num + 1) if course_statistics
-
- work.destroy
- end
- end
- end
- end
- respond_to do |format|
- format.html {
- redirect_to student_work_index_url(:homework => @homework.id, :tab => 2)
- }
- end
- end
-
- private
- def hsd_committed_work?(user, homework)
- sw = StudentWork.where("user_id =? and homework_common_id =? and work_status != 0", user, homework).first
- sw.nil? ? result = false : result = true
- result
- end
-
- #获取作业
- def find_homework
- @homework = HomeworkCommon.find params[:homework]
- @course = @homework.course
- rescue
- render_404
- end
- #获取作品
- def find_work
- @work = StudentWork.find params[:id]
- @homework = @work.homework_common
- @course = @homework.course
- rescue
- render_404
- end
-
- #是不是当前课程的成员
- #当前课程成员才可以看到作品列表
- def member_of_course
- render_403 unless User.current.member_of_course?(@course) || User.current.admin?
- end
-
- #判断是不是当前作品的提交者
- #提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
- def author_of_work
- render_403 unless User.current.admin? || (User.current.id == @work.user_id && @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
- end
-
- def teacher_of_course
- render_403 unless User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- end
-
- def is_logged
- redirect_to signin_path unless User.current.logged?
- end
-
- #根据条件过滤作业结果
- def search_homework_member homeworks,name
- if name == ""
- select_homework = homeworks
- else
- name = name.downcase
- select_homework = homeworks.select{ |homework|
- homework.user[:login].to_s.downcase.include?(name) || homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
- }
- end
- select_homework
- end
-
- #作品列表转换为excel
- def homework_to_xls items
- xls_report = StringIO.new
- book = Spreadsheet::Workbook.new
- sheet1 = book.create_worksheet :name => "homework"
- blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
- sheet1.row(0).default_format = blue
- if @homework.homework_type == 1 #普通作业
- if @homework.anonymous_comment ==0
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- else
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- end
- count_row = 1
- items.each do |homework|
- sheet1[count_row,0]=homework.user.id
- sheet1[count_row,1] = homework.user.show_name
- sheet1[count_row,2] = homework.user.login
- sheet1[count_row,3] = homework.user.user_extensions.student_id
- sheet1[count_row,4] = homework.user.mail
- sheet1[count_row,5] = homework.name
- sheet1[count_row,6] = strip_html homework.description if !homework.description.nil?
- sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
- sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
- if @homework.anonymous_comment ==0
- sheet1[count_row,9] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
- sheet1[count_row,10] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
- sheet1[count_row,11] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,12] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
- sheet1[count_row,13] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- else
- sheet1[count_row,9] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,10] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
- sheet1[count_row,11] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- end
- count_row += 1
- end
- elsif @homework.homework_type == 2 #编程作业
- if @homework.anonymous_comment ==0
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- else
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- end
- count_row = 1
- items.each do |homework|
- sheet1[count_row,0]=homework.user.id
- sheet1[count_row,1] = homework.user.show_name
- sheet1[count_row,2] = homework.user.login
- sheet1[count_row,3] = homework.user.user_extensions.student_id
- sheet1[count_row,4] = homework.user.mail
- sheet1[count_row,5] = homework.name
- sheet1[count_row,6] = homework.description
- sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
- sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
- sheet1[count_row,9] = homework.system_score.nil? ? l(:label_without_score) : homework.system_score.round(2)
- if @homework.anonymous_comment ==0
- sheet1[count_row,10] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
- sheet1[count_row,11] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
- sheet1[count_row,12] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,13] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
- sheet1[count_row,14] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- else
- sheet1[count_row,10] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,11] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score)
- sheet1[count_row,12] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- end
- count_row += 1
- end
- elsif @homework.homework_type == 3 #分组作业
- if @homework.anonymous_comment ==0
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- else
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
- l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
- end
- count_row = 1
- @homework.student_works.where("work_status != 0").each do |homework|
- sheet1[count_row,0]=homework.user.id
- sheet1[count_row,1] = homework.user.show_name
- sheet1[count_row,2] = homework.user.login
- sheet1[count_row,3] = homework.user.user_extensions.student_id
- sheet1[count_row,4] = homework.user.mail
- sheet1[count_row,5] = homework.name
- sheet1[count_row,6] = (homework.project_id == 0 || homework.project_id.nil?) ? l(:excel_no_project) : homework.project.name
- sheet1[count_row,7] = strip_html homework.description
- sheet1[count_row,8] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2)
- sheet1[count_row,9] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2)
- if @homework.anonymous_comment ==0
- sheet1[count_row,10] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2)
- sheet1[count_row,11] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.absence_penalty
- sheet1[count_row,12] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,13] = homework.work_score.nil? ? l(:label_without_score) : homework.work_score.round(2)
- sheet1[count_row,14] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- else
- sheet1[count_row,10] = (@homework.teacher_priority == 1 && !homework.teacher_score.nil?) ? 0 : homework.late_penalty
- sheet1[count_row,11] = homework.work_score.nil? ? l(:label_without_score) : homework.work_score.round(2)
- sheet1[count_row,12] = homework.commit_time ? format_time(homework.commit_time) : "未提交"
- end
- count_row += 1
- end
- end
- book.write xls_report
- xls_report.string
- end
-
- #缺评列表转换为excel
- def absence_penalty_list_xls items
- xls_report = StringIO.new
- book = Spreadsheet::Workbook.new
- sheet1 = book.create_worksheet :name => "homework"
- blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
- sheet1.row(0).default_format = blue
-
- sheet1.row(0).concat([l(:excel_student_id),l(:excel_nickname),l(:excel_user_name),l(:lable_all_penalty),l(:lable_has_penalty),l(:lable_absence_penalty)])
- count_row = 1
- items.each do |homework|
- sheet1[count_row,0] = homework.user.user_extensions.student_id
- sheet1[count_row,1] = homework.user.login
- sheet1[count_row,2] = homework.user.lastname.to_s + homework.user.firstname.to_s
- sheet1[count_row,3] = homework.all_count
- sheet1[count_row,4] = homework.has_count
- sheet1[count_row,5] = homework.absence
- count_row += 1
- end
- book.write xls_report
- xls_report.string
- end
-
- #匿评列表转换为excel
- def evaluation_list_xls items
- xls_report = StringIO.new
- book = Spreadsheet::Workbook.new
- sheet1 = book.create_worksheet :name => "homework"
- blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
- sheet1.row(0).default_format = blue
-
- sheet1.row(0).concat([l(:label_work_name),l(:label_work_id),l(:label_work_autor),l(:label_evaluation_id),l(:label_evaluation_name),
- l(:label_evaluation_score),l(:label_evaluation_common),l(:label_evaluation_time)])
- count_row = 1
- items.each do |homework|
- homework.student_works_scores.where(:reviewer_role => 3).each do |score|
- sheet1[count_row,0] = homework.name
- sheet1[count_row,1] = homework.user.user_extensions.student_id
- sheet1[count_row,2] = homework.user.show_name
- sheet1[count_row,3] = score.user.user_extensions.student_id
- sheet1[count_row,4] = score.user.show_name
- sheet1[count_row,5] = score.score
- sheet1[count_row,6] = score.comment
- sheet1[count_row,7] = format_time(score.created_at)
- count_row += 1
- end
- end
- book.write xls_report
- xls_report.string
- end
-
- def find_or_save_student_work(is_test)
- student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id, is_test: is_test).first
- if student_work.nil?
- @homework.student_works.build(
- name: params[:title],
- description: params[:src],
- user_id: User.current.id,
- is_test: is_test
- )
- unless @homework.save
- logger.debug @homework.errors.full_messages
- else
- student_work = StudentWork.where(homework_common_id: @homework.id, user_id: User.current.id, is_test: is_test).first
- end
- end
- student_work
- end
-
- def test_realtime(student_work, src)
- url = "#{Redmine::Configuration['judge_server']}api/realtime_test.json"
-
- factor = []
- @homework.homework_tests.each do |test|
- factor << {input: test.input, output: test.output}
- end
- solutions = {
- src:src,
- language:@homework.homework_detail_programing.language,
- factor: factor
- }
- uri = URI(url)
- body = solutions.to_json
- res = Net::HTTP.new(uri.host, uri.port).start do |client|
- request = Net::HTTP::Post.new(uri.path)
- request.body = body
- request["Content-Type"] = "application/json"
- client.request(request)
- end
- JSON.parse(res.body)
- end
-
- def test_realtime_ex(test, src)
- url = "#{Redmine::Configuration['judge_server']}api/realtime_test.json"
-
- factor = []
- factor << {input: test.input, output: test.output}
-
- solutions = {
- src:src,
- language:@homework.homework_detail_programing.language,
- factor: factor
- }
- uri = URI(url)
- body = solutions.to_json
- res = Net::HTTP.new(uri.host, uri.port).start do |client|
- request = Net::HTTP::Post.new(uri.path)
- request.body = body
- request["Content-Type"] = "application/json"
- client.request(request)
- end
- JSON.parse(res.body)
- end
-
- #成绩计算
- def set_final_score homework,student_work
- if homework && homework.homework_detail_manual
- if !homework.homework_detail_manual.final_mode
- tea_ass_proportion = homework.homework_detail_manual.ta_proportion
- tea_proportion = homework.homework_detail_manual.te_proportion
- if homework.homework_type != 2 #非编程作业
- if student_work.teacher_score
- if student_work.teaching_asistant_score.nil?
- if student_work.student_score.nil?
- student_work.final_score = student_work.teacher_score
- else
- te_proportion = tea_proportion + tea_ass_proportion / 2
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{te_proportion}")
- final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{te_proportion}"))
- final_score = final_te_score + final_s_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- else
- if student_work.student_score.nil?
- te_proportion = tea_proportion + (1.0 - tea_proportion - tea_ass_proportion) / 2
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{te_proportion}")
- final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{te_proportion}"))
- final_score = final_te_score + final_ta_score
- student_work.final_score = format("%.2f",final_score.to_f)
- else
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{tea_proportion}")
- final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{tea_ass_proportion}")
- final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{tea_proportion}") - BigDecimal.new("#{tea_ass_proportion}"))
- final_score = final_te_score + final_ta_score + final_s_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- end
- else
- if student_work.teaching_asistant_score.nil?
- student_work.final_score = student_work.student_score
- elsif student_work.student_score.nil?
- student_work.final_score = student_work.teaching_asistant_score
- else
- ta_proportion = tea_ass_proportion + tea_proportion / 2
- final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{ta_proportion}")
- final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
- final_score = final_ta_score + final_s_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- end
- elsif homework.homework_type == 2 && homework.homework_detail_programing #编程作业-----设定:系统评分必定不为空
- #if homework.teacher_priority == 1 #教师优先
- sy_proportion = homework.homework_detail_programing.ta_proportion
- if student_work.teacher_score
- if student_work.teaching_asistant_score.nil? #教辅未评分
- if student_work.student_score.nil?
- ta_proportion = tea_proportion + (1 - tea_proportion - sy_proportion) / 2
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{ta_proportion}")
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
- final_score = final_sy_score + final_te_score
- student_work.final_score = format("%.2f",final_score.to_f)
- else
- rest_proportion = tea_ass_proportion / 3
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{sy_proportion + rest_proportion}")
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{tea_proportion + rest_proportion}")
- final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{sy_proportion + rest_proportion}") - BigDecimal.new("#{tea_proportion + rest_proportion}"))
- final_score = final_sy_score + final_te_score + final_st_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- elsif student_work.student_score.nil? #学生未评分
- rest_proportion = (1 - tea_proportion - sy_proportion - tea_ass_proportion) / 3
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{sy_proportion + rest_proportion}")
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{tea_proportion + rest_proportion}")
- final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{sy_proportion + rest_proportion}") - BigDecimal.new("#{tea_proportion + rest_proportion}"))
- final_score = final_sy_score + final_te_score + final_ta_score
- student_work.final_score = format("%.2f",final_score.to_f)
- else
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{sy_proportion}")
- final_te_score = BigDecimal.new("#{student_work.teacher_score}") * BigDecimal.new("#{tea_proportion}")
- final_ta_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{tea_ass_proportion}")
- final_s_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{sy_proportion}") - BigDecimal.new("#{tea_proportion}") - BigDecimal.new("#{tea_ass_proportion}"))
- final_score = final_sy_score + final_ta_score + final_te_score + final_st_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- else
- if student_work.teaching_asistant_score.nil? #教辅未评分
- if student_work.student_score.nil?
- student_work.final_score = student_work.system_score
- else
- ta_proportion = sy_proportion + (tea_ass_proportion + tea_proportion) / 2
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
- final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
- final_score = final_sy_score + final_st_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- elsif student_work.student_score.nil? #学生未评分
- if student_work.teaching_asistant_score.nil?
- student_work.final_score = student_work.system_score
- else
- ta_proportion = sy_proportion + (1.0 - tea_ass_proportion - sy_proportion) / 2
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{ta_proportion}")
- final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}"))
- final_score = final_sy_score + final_ts_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- else
- rest_proportion = tea_proportion / 3
- final_sy_score = BigDecimal.new("#{student_work.system_score || 0}") * BigDecimal.new("#{sy_proportion + rest_proportion}")
- final_ts_score = BigDecimal.new("#{student_work.teaching_asistant_score}") * BigDecimal.new("#{tea_ass_proportion + rest_proportion}")
- final_st_score = BigDecimal.new("#{student_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{sy_proportion + rest_proportion}") - BigDecimal.new("#{tea_ass_proportion + rest_proportion}"))
- final_score = final_sy_score + final_ts_score + final_st_score
- student_work.final_score = format("%.2f",final_score.to_f)
- end
- end
- end
- else
- if homework.homework_type != 2
- if student_work.teacher_score
- student_work.final_score = student_work.teacher_score
- else
- if student_work.teaching_asistant_score.nil?
- student_work.final_score = student_work.student_score
- else
- student_work.final_score = student_work.teaching_asistant_score
- end
- end
- elsif homework.homework_type == 2 && homework.homework_detail_programing
- if student_work.teacher_score
- student_work.final_score = student_work.teacher_score
- else
- if student_work.teaching_asistant_score
- student_work.final_score = student_work.teaching_asistant_score
- else
- if student_work.system_score
- student_work.final_score = student_work.system_score
- else
- student_work.final_score = student_work.student_score
- end
- end
- end
- end
- end
- if student_work.final_score
- score = student_work.final_score - student_work.absence_penalty - student_work.late_penalty - student_work.appeal_penalty
- student_work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) if score
- else
- student_work.work_score = nil
- end
- end
- end
-
- end
|