2015-05-19 17:12:43 +08:00
class StudentWorkController < ApplicationController
layout " base_courses "
2015-05-26 18:14:53 +08:00
include StudentWorkHelper
2015-05-29 11:26:39 +08:00
require 'bigdecimal'
2015-07-16 18:13:43 +08:00
require " base64 "
2015-09-17 20:20:20 +08:00
before_filter :find_homework , :only = > [ :new , :index , :create , :student_work_absence_penalty , :absence_penalty_list , :evaluation_list , :program_test , :set_score_rule ]
2015-05-28 16:10:40 +08:00
before_filter :find_work , :only = > [ :edit , :update , :show , :destroy , :add_score , :praise_student_work ]
before_filter :member_of_course , :only = > [ :index , :new , :create , :show , :add_score , :praise_student_work ]
2015-05-20 17:53:01 +08:00
before_filter :author_of_work , :only = > [ :edit , :update , :destroy ]
2015-09-17 20:20:20 +08:00
before_filter :teacher_of_course , :only = > [ :student_work_absence_penalty , :absence_penalty_list , :evaluation_list , :set_score_rule ]
2015-05-19 17:12:43 +08:00
2015-08-28 12:04:49 +08:00
###
def program_test
2015-09-02 21:38:13 +08:00
is_test = params [ :is_test ] == 'true'
2015-09-02 21:44:08 +08:00
resultObj = { status : 0 , results : [ ] , error_msg : '' , time : Time . now . strftime ( '%Y-%m-%d %T' ) }
2015-09-07 23:47:14 +08:00
student_work = find_or_save_student_work ( is_test )
2015-09-02 21:38:13 +08:00
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
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
2015-08-28 12:04:49 +08:00
render :json = > resultObj
end
2015-05-19 17:12:43 +08:00
def index
2015-09-08 09:43:41 +08:00
# 作业消息状态更新
2015-09-02 18:00:36 +08:00
@homework . course_messages . each do | homework_message |
2015-09-08 14:14:49 +08:00
if User . current . id == homework_message . user_id && homework_message . viewed == 0
homework_message . update_attributes ( :viewed = > true ) if homework_message . viewed == 0
2015-09-02 18:00:36 +08:00
end
end
2015-09-08 14:14:49 +08:00
# 作品打分消息状态更新
studentworks_scores = CourseMessage . where ( " user_id =? and course_id =? and course_message_type =? and viewed =? " , User . current . id , @homework . course , " StudentWorksScore " , 0 )
studentworks_scores . each do | studentworks_score |
studentworks_score . update_attributes ( :viewed = > true ) if studentworks_score . viewed == 0
end
# 作品评论消息状态更新
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 . each do | journal_for_teacher |
journal_for_teacher . update_attributes ( :viewed = > true )
end
2015-10-19 15:45:24 +08:00
#不能参与作业匿评消息状态更新
2015-10-20 16:19:32 +08:00
no_evaluation = CourseMessage . where ( " user_id =? and course_id =? and course_message_type =? and viewed =? and status =? " , User . current . id , @homework . course , " StudentWork " , 0 , 0 )
2015-10-19 15:45:24 +08:00
no_evaluation . update_all ( :viewed = > true )
2015-09-08 14:14:49 +08:00
# 作品留言
2015-09-02 18:00:36 +08:00
# 消息end
2015-08-25 16:42:29 +08:00
#设置作业对应的forge_messages表的viewed字段
query_student_work = @homework . course_messages
query_student_work . each do | query |
if User . current . id == query . user_id
query . update_attributes ( :viewed = > true )
end
end
2015-09-16 15:51:35 +08:00
##################################################################################################################
2015-09-17 14:16:13 +08:00
@order , @b_sort , @name , @group = params [ :order ] || " score " , params [ :sort ] || " desc " , params [ :name ] || " " , params [ :group ]
2015-05-28 09:03:01 +08:00
@homework_commons = @course . homework_commons . order ( " created_at desc " )
2015-09-17 14:16:13 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
2015-09-25 14:33:33 +08:00
@is_evaluation = @homework . homework_detail_manual && @homework . homework_detail_manual . comment_status == 2 && ! @is_teacher #是不是匿评
2015-09-17 17:06:08 +08:00
@show_all = false
2015-09-22 16:16:55 +08:00
course_group = CourseGroup . find_by_id ( @group ) if @group
if course_group
group_students = course_group . users
if group_students . empty?
student_in_group = '(0)'
2015-09-17 14:16:13 +08:00
else
2015-09-22 16:16:55 +08:00
student_in_group = '(' + group_students . map { | user | user . id } . join ( ',' ) + ')'
end
2015-09-25 14:33:33 +08:00
if @is_teacher || @homework . homework_detail_manual . nil? #老师 || 超级管理员 显示所有列表
2015-09-22 16:16:55 +08:00
@stundet_works = search_homework_member @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . joins ( :user ) . where ( " users.id in #{ student_in_group } " ) . order ( " #{ @order } #{ @b_sort } " ) , @name
2015-09-17 17:06:08 +08:00
@show_all = true
2015-09-22 16:16:55 +08:00
elsif @homework . homework_detail_manual . comment_status == 1 #学生 && 未开启匿评 只看到自己的
@stundet_works = @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . where ( :user_id = > User . current . id )
elsif @homework . homework_detail_manual . comment_status == 2 #学生 && 开启匿评 看到匿评列表
my_work = @homework . student_works . where ( :user_id = > User . current . id )
@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 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
my_work = @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . where ( :user_id = > User . current . id )
if my_work . empty?
@stundet_works = [ ]
else
@stundet_works = search_homework_member @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . joins ( :user ) . where ( " users.id in #{ student_in_group } " ) . order ( " #{ @order } #{ @b_sort } " ) , @name
@show_all = true
end
else
@stundet_works = [ ]
2015-09-17 14:16:13 +08:00
end
else
2015-09-25 14:33:33 +08:00
if @is_teacher || @homework . homework_detail_manual . nil? #老师 || 超级管理员 显示所有列表
2015-09-22 16:16:55 +08:00
@stundet_works = search_homework_member @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . order ( " #{ @order } #{ @b_sort } " ) , @name
@show_all = true
elsif @homework . homework_detail_manual . comment_status == 1 #学生 && 未开启匿评 只看到自己的
@stundet_works = @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . where ( :user_id = > User . current . id )
elsif @homework . homework_detail_manual . comment_status == 2 #学生 && 开启匿评 看到匿评列表
my_work = @homework . student_works . where ( :user_id = > User . current . id )
@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 #学生 && 关闭匿评 未提交作品之前列表为空,提交了作品看到所有的
my_work = @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . where ( :user_id = > User . current . id )
if my_work . empty?
@stundet_works = [ ]
else
@stundet_works = search_homework_member @homework . student_works . select ( " student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . order ( " #{ @order } #{ @b_sort } " ) , @name
@show_all = true
end
else
@stundet_works = [ ]
end
2015-09-17 14:16:13 +08:00
end
2015-09-22 16:16:55 +08:00
2015-09-17 14:16:13 +08:00
@score = @b_sort == " desc " ? " asc " : " desc "
2015-09-16 15:51:35 +08:00
2015-05-19 17:12:43 +08:00
respond_to do | format |
2015-09-22 15:52:08 +08:00
format . js
2015-05-19 17:12:43 +08:00
format . html
2015-05-28 11:07:28 +08:00
format . xls {
2015-10-13 17:10:46 +08:00
filename = " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @course . time . to_s + @course . term } _ #{ @homework . name } #{ l ( :excel_homework_list ) } .xls "
2015-05-28 11:07:28 +08:00
send_data ( homework_to_xls ( @stundet_works ) , :type = > " text/excel;charset=utf-8; header=present " ,
2015-10-13 17:10:46 +08:00
:filename = > filename_for_content_disposition ( filename ) )
2015-05-28 11:07:28 +08:00
}
2015-05-19 17:12:43 +08:00
end
end
def new
2015-10-20 16:19:32 +08:00
#更新消息
noEvaluation = @homework . course_messages . where ( " user_id =? and viewed =? " , User . current . id , 0 )
noEvaluation . update_all ( :viewed = > true )
2015-09-02 22:09:23 +08:00
if @homework . homework_type == 2
redirect_to new_user_commit_homework_users_path ( homework_id : @homework . id )
return
end
2015-09-02 19:41:45 +08:00
@user = User . current
2015-08-28 12:04:49 +08:00
@student_work = @homework . student_works . where ( " user_id = ? " , User . current . id ) . first
if @student_work . nil?
@student_work = StudentWork . new
2015-05-19 17:12:43 +08:00
end
2015-09-02 19:41:45 +08:00
respond_to do | format |
format . html { render :layout = > " new_base_user " }
end
2015-05-19 17:12:43 +08:00
end
def create
2015-05-21 15:52:27 +08:00
if params [ :student_work ]
2015-09-09 00:43:54 +08:00
student_work = StudentWork . find ( params [ :student_work_id ] ) if params [ :student_work_id ]
student_work || = StudentWork . new
student_work . name = params [ :student_work ] [ :name ]
student_work . description = params [ :student_work ] [ :description ]
student_work . project_id = params [ :student_work ] [ :project_id ]
student_work . homework_common_id = @homework . id
student_work . user_id = User . current . id
student_work . save_attachments ( params [ :attachments ] )
2015-09-16 10:26:13 +08:00
render_attachment_warning_if_needed ( student_work )
#提交作品时,计算是否迟交
2015-07-02 16:16:29 +08:00
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
2015-09-17 10:06:04 +08:00
student_work . late_penalty = @homework . late_penalty
2015-09-16 10:26:13 +08:00
else
2015-09-09 00:43:54 +08:00
student_work . late_penalty = 0
2015-07-02 16:16:29 +08:00
end
2015-09-09 00:43:54 +08:00
if student_work . save
2015-09-29 10:49:08 +08:00
course_activity = CourseActivity . where ( " course_act_type='HomeworkCommon' and course_act_id = #{ @homework . id } " ) . first
2015-09-29 11:54:43 +08:00
if course_activity
course_activity . updated_at = Time . now
course_activity . save
end
2015-09-29 10:49:08 +08:00
user_activity = UserActivity . where ( " act_type='HomeworkCommon' and act_id = #{ @homework . id } " ) . first
2015-09-29 11:54:43 +08:00
if user_activity
user_activity . updated_at = Time . now
user_activity . save
end
2015-05-21 15:52:27 +08:00
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_create )
redirect_to student_work_index_url ( :homework = > @homework . id )
}
end
return
end
end
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_failed_create )
redirect_to new_student_work_url ( :homework = > @homework . id )
}
end
2015-05-19 17:12:43 +08:00
end
def edit
2015-09-02 19:52:44 +08:00
@user = User . current
2015-07-22 10:18:01 +08:00
if ! User . current . admin? && @homework . homework_type == 2 #编程作业不能修改作业
2015-07-08 17:19:11 +08:00
render_403
else
respond_to do | format |
2015-09-02 19:52:44 +08:00
format . html { render :layout = > " new_base_user " }
2015-07-08 17:19:11 +08:00
end
2015-05-28 17:09:38 +08:00
end
2015-05-19 17:12:43 +08:00
end
def update
2015-05-28 17:09:38 +08:00
if params [ :student_work ]
@work . name = params [ :student_work ] [ :name ]
@work . description = params [ :student_work ] [ :description ]
@work . project_id = params [ :student_work ] [ :project ]
@work . save_attachments ( params [ :attachments ] )
render_attachment_warning_if_needed ( @work )
if @work . save
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_edit )
redirect_to student_work_index_url ( :homework = > @homework . id )
}
end
return
end
end
respond_to do | format |
format . html { redirect_to edit_student_work_url ( @work ) }
end
2015-05-19 17:12:43 +08:00
end
2015-05-20 17:53:01 +08:00
def show
2015-05-27 08:55:33 +08:00
@score = student_work_score @work , User . current
2015-09-17 16:04:16 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
@student_work_scores = @work . student_works_scores . order ( " updated_at desc " )
2015-05-21 17:17:54 +08:00
respond_to do | format |
format . js
end
2015-05-20 17:53:01 +08:00
end
def destroy
2015-09-18 11:05:21 +08:00
if @work . destroy
2015-05-28 17:18:37 +08:00
respond_to do | format |
format . html {
redirect_to student_work_index_url ( :homework = > @homework . id )
}
end
end
2015-05-20 17:53:01 +08:00
end
2015-05-27 11:25:32 +08:00
#添加评分,已评分则为修改评分
2015-05-22 14:45:01 +08:00
def add_score
2015-09-17 16:31:32 +08:00
@is_last = params [ :is_last ] == " true "
2015-05-29 14:06:16 +08:00
render_403 and return if User . current == @work . user #不可以匿评自己的作品
2015-09-17 16:31:32 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
2015-05-29 14:06:16 +08:00
#老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分
2015-09-16 15:51:35 +08:00
render_403 and return unless @is_teacher || @homework . homework_detail_manual . comment_status == 2
2015-05-29 14:06:16 +08:00
@score = student_work_score @work , User . current
2015-05-27 16:01:00 +08:00
if @score
@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 ]
2015-07-15 17:34:34 +08:00
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
2015-05-27 16:01:00 +08:00
@is_new = false
2015-05-26 18:14:53 +08:00
else
2015-09-30 10:43:40 +08:00
@is_last_a = @work . student_works_scores . empty?
2015-05-27 16:01:00 +08:00
@score = StudentWorksScore . new
@score . score = params [ :score ] if params [ :score ]
@score . comment = params [ :new_form ] [ :user_message ] if params [ :new_form ] && params [ :new_form ] [ :user_message ] && params [ :new_form ] [ :user_message ] != " "
@score . user_id = User . current . id
@score . student_work_id = @work . id
2015-07-15 17:34:34 +08:00
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
2015-05-27 16:01:00 +08:00
@is_new = true
2015-05-26 18:14:53 +08:00
end
2015-05-26 17:51:56 +08:00
2015-05-27 16:01:00 +08:00
@score . save_attachments ( params [ :attachments ] )
render_attachment_warning_if_needed ( @score )
2015-05-26 18:14:53 +08:00
2015-05-27 16:01:00 +08:00
if @score . save
2015-05-27 17:32:14 +08:00
case @score . reviewer_role
when 1 #教师评分:最后一个教师评分为最终评分
@work . teacher_score = @score . score
when 2 #教辅评分 教辅评分显示平均分
@work . teaching_asistant_score = @work . student_works_scores . where ( :reviewer_role = > 2 ) . average ( :score ) . try ( :round , 2 ) . to_f
when 3 #学生评分 学生评分显示平均分
@work . student_score = @work . student_works_scores . where ( :reviewer_role = > 3 ) . average ( :score ) . try ( :round , 2 ) . to_f
end
if @work . save
respond_to do | format |
format . js
end
2015-05-26 18:14:53 +08:00
end
2015-05-23 11:24:24 +08:00
end
end
2015-05-22 14:45:01 +08:00
2015-05-27 11:25:32 +08:00
#添加评分的回复
2015-05-23 11:24:24 +08:00
def add_score_reply
2015-05-27 15:11:11 +08:00
@score = StudentWorksScore . find params [ :score_id ]
2015-09-17 16:31:32 +08:00
@is_last = params [ :is_last ] == " true "
2015-05-27 14:58:55 +08:00
@jour = @score . journals_for_messages . new ( :user_id = > User . current . id , :notes = > params [ :message ] , :reply_id = > 0 )
if @jour . save
2015-05-29 11:00:35 +08:00
@status = 1
else
@status = 2
end
respond_to do | format |
format . js
2015-05-23 11:24:24 +08:00
end
2015-05-22 14:45:01 +08:00
end
2015-05-27 11:25:32 +08:00
#删除评分的回复
def destroy_score_reply
2015-05-27 15:11:11 +08:00
@jour = JournalsForMessage . find params [ :jour_id ]
if @jour . destroy
respond_to do | format |
format . js
end
2015-05-27 11:25:32 +08:00
end
end
2015-05-28 16:10:40 +08:00
#为作品点赞
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
2015-06-30 15:30:51 +08:00
#缺评列表显示
2015-06-18 17:56:28 +08:00
def student_work_absence_penalty
2015-06-19 09:56:39 +08:00
order = params [ :order ] || " desc "
2015-06-19 16:23:28 +08:00
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(
2015-06-19 09:56:39 +08:00
SELECT * ,
2015-07-03 11:49:02 +08:00
( SELECT COUNT ( * ) FROM ` student_works_evaluation_distributions ` WHERE user_id = student_works . user_id AND student_work_id IN #{work_ids}) AS all_count,
2015-06-19 09:56:39 +08:00
( 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 `
2015-06-19 14:20:00 +08:00
WHERE homework_common_id = #{@homework.id}
2015-06-19 16:23:28 +08:00
) AS table_1
ORDER BY absence #{order}")
end
2015-06-19 09:56:39 +08:00
@order = order == " desc " ? " asc " : " desc "
2015-06-18 17:56:28 +08:00
respond_to do | format |
format . html
end
end
2015-06-30 15:30:51 +08:00
#导出缺评列表
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 * ,
2015-07-03 17:30:08 +08:00
( SELECT COUNT ( * ) FROM ` student_works_evaluation_distributions ` WHERE user_id = student_works . user_id AND student_work_id IN #{work_ids}) AS all_count,
2015-06-30 15:30:51 +08:00
( 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 {
2015-10-13 17:10:46 +08:00
filename = " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @course . time . to_s + @course . term } _ #{ @homework . name } #{ l ( :excel_absence_list ) } .xls "
2015-06-30 15:30:51 +08:00
send_data ( absence_penalty_list_xls ( @stundet_works ) , :type = > " text/excel;charset=utf-8; header=present " ,
2015-10-13 17:10:46 +08:00
:filename = > filename_for_content_disposition ( filename ) )
2015-06-30 15:30:51 +08:00
}
end
end
#导出匿评列表
def evaluation_list
2015-06-30 16:36:37 +08:00
respond_to do | format |
format . xls {
2015-10-13 17:10:46 +08:00
filename = " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @course . time . to_s + @course . term } _ #{ @homework . name } #{ l ( :excel_evaluation_list ) } .xls "
2015-06-30 16:36:37 +08:00
send_data ( evaluation_list_xls ( @homework . student_works ) , :type = > " text/excel;charset=utf-8; header=present " ,
2015-10-13 17:10:46 +08:00
:filename = > filename_for_content_disposition ( filename ) )
2015-06-30 16:36:37 +08:00
}
end
2015-06-30 15:30:51 +08:00
end
2015-09-17 20:20:20 +08:00
#设置评分规则
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 ]
@homework . student_works . where ( " created_at > ' #{ @homework . end_time } 23:59:59' " ) . each do | student_work |
student_work . late_penalty = @homework . late_penalty
student_work . save
end
2015-09-18 11:29:58 +08:00
@homework . save
2015-09-17 20:20:20 +08:00
end
unless homework_detail_manual . absence_penalty . to_s == params [ :absence_penalty ] . to_s
homework_detail_manual . absence_penalty = params [ :absence_penalty ]
if homework_detail_manual . comment_status == 3 #当前作业处于匿评结束状态,修改缺评扣分才会修改每个作品应扣分的值
work_ids = " ( " + @homework . student_works . map ( & :id ) . join ( " , " ) + " ) "
@homework . student_works . each do | student_work |
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 } " ) . count
2015-09-17 20:33:36 +08:00
student_work . absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual . absence_penalty : 0
2015-09-17 20:20:20 +08:00
student_work . save
end
end
2015-09-18 11:29:58 +08:00
homework_detail_manual . save if homework_detail_manual
2015-09-17 20:20:20 +08:00
end
teacher_priority = params [ :teacher_priority ] ? 1 : 0
if homework_detail_manual . ta_proportion . to_s != params [ :ta_proportion ] . to_s || @homework . teacher_priority . to_s != teacher_priority . to_s || ( homework_detail_programing && homework_detail_programing . ta_proportion . to_s != params [ :sy_proportion ] . to_s )
homework_detail_manual . ta_proportion = params [ :ta_proportion ]
homework_detail_programing . ta_proportion = params [ :sy_proportion ] if homework_detail_programing
@homework . teacher_priority = teacher_priority
2015-09-18 11:29:58 +08:00
@homework . save
homework_detail_manual . save if homework_detail_manual
homework_detail_programing . save if homework_detail_programing
2015-09-17 20:20:20 +08:00
@homework . student_works . each do | student_work |
set_final_score @homework , student_work
student_work . save
end
end
respond_to do | format |
2015-10-23 14:45:56 +08:00
format . html {
if params [ :student_path ]
redirect_to student_work_index_url ( :homework = > @homework . id )
else
redirect_to user_homeworks_user_path ( User . current . id )
end
}
2015-09-17 20:20:20 +08:00
end
end
2015-05-19 17:12:43 +08:00
private
#获取作业
def find_homework
@homework = HomeworkCommon . find params [ :homework ]
@course = @homework . course
rescue
render_404
end
#获取作品
def find_work
@work = StudentWork . find params [ :id ]
2015-05-21 17:33:54 +08:00
@homework = @work . homework_common
@course = @homework . course
2015-05-19 17:12:43 +08:00
rescue
render_404
end
2015-05-20 17:53:01 +08:00
#是不是当前课程的成员
#当前课程成员才可以看到作品列表
def member_of_course
2015-06-25 14:56:53 +08:00
render_403 unless User . current . member_of_course? ( @course ) || User . current . admin?
2015-05-20 17:53:01 +08:00
end
#判断是不是当前作品的提交者
2015-05-28 17:18:37 +08:00
#提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
2015-05-20 17:53:01 +08:00
def author_of_work
2015-07-22 10:18:01 +08:00
render_403 unless User . current . admin? || ( User . current . id == @work . user_id && @homework . homework_type != 1 || @homework . homework_detail_manual . comment_status == 1 )
2015-05-20 17:53:01 +08:00
end
2015-05-28 09:46:35 +08:00
2015-06-30 15:30:51 +08:00
def teacher_of_course
2015-09-17 20:20:20 +08:00
render_403 unless User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
2015-06-30 15:30:51 +08:00
end
2015-05-28 09:46:35 +08:00
#根据条件过滤作业结果
def search_homework_member homeworks , name
2015-09-17 14:16:13 +08:00
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
2015-05-28 09:46:35 +08:00
select_homework
end
2015-05-28 11:07:28 +08:00
2015-06-30 15:30:51 +08:00
#作品列表转换为excel
2015-05-28 11:07:28 +08:00
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
2015-09-17 17:20:29 +08:00
if @homework . homework_type == 1 #匿评作业
2015-07-23 10:33:54 +08:00
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_t_score ) , l ( :excel_ta_score ) , l ( :excel_n_score ) , l ( :excel_f_score ) , l ( :excel_commit_time ) ] )
count_row = 1
items . each do | homework |
sheet1 [ count_row , 0 ] = homework . user . id
sheet1 [ count_row , 1 ] = homework . user . lastname . to_s + homework . user . firstname . to_s
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 . teacher_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . teacher_score )
sheet1 [ count_row , 7 ] = homework . teaching_asistant_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . teaching_asistant_score )
sheet1 [ count_row , 8 ] = homework . student_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . student_score )
sheet1 [ count_row , 9 ] = homework . respond_to? ( " score " ) ? homework . score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . score ) : l ( :label_without_score )
sheet1 [ count_row , 10 ] = format_time ( homework . created_at )
count_row += 1
end
elsif @homework . homework_type == 2 #编程作业
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 ) ,
2015-09-17 17:20:29 +08:00
l ( :excel_t_score ) , l ( :excel_ta_score ) , l ( :excel_s_score ) , l ( :excel_n_score ) , l ( :excel_f_score ) , l ( :excel_commit_time ) ] )
2015-07-23 10:33:54 +08:00
count_row = 1
items . each do | homework |
sheet1 [ count_row , 0 ] = homework . user . id
sheet1 [ count_row , 1 ] = homework . user . lastname . to_s + homework . user . firstname . to_s
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 . teacher_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . teacher_score )
sheet1 [ count_row , 7 ] = homework . teaching_asistant_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . teaching_asistant_score )
2015-09-17 17:20:29 +08:00
sheet1 [ count_row , 8 ] = homework . system_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . system_score )
sheet1 [ count_row , 9 ] = homework . student_score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . student_score )
sheet1 [ count_row , 10 ] = homework . respond_to? ( " score " ) ? homework . score . nil? ? l ( :label_without_score ) : format ( " %.2f " , homework . score ) : l ( :label_without_score )
sheet1 [ count_row , 11 ] = format_time ( homework . created_at )
2015-07-23 10:33:54 +08:00
count_row += 1
end
2015-05-28 11:07:28 +08:00
end
book . write xls_report
xls_report . string
end
2015-06-30 15:30:51 +08:00
#缺评列表转换为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 |
2015-06-30 16:36:37 +08:00
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
2015-06-30 15:30:51 +08:00
count_row += 1
end
book . write xls_report
xls_report . string
end
2015-06-30 16:36:37 +08:00
#匿评列表转换为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
2015-08-28 12:04:49 +08:00
2015-09-07 23:47:14 +08:00
def find_or_save_student_work ( is_test )
2015-09-09 00:43:54 +08:00
student_work = StudentWork . where ( homework_common_id : @homework . id , user_id : User . current . id ) . first
2015-08-28 12:04:49 +08:00
if student_work . nil?
@homework . student_works . build (
name : params [ :title ] ,
description : params [ :src ] ,
2015-09-07 23:47:14 +08:00
user_id : User . current . id ,
is_test : is_test
2015-08-28 12:04:49 +08:00
)
unless @homework . save
2015-09-09 00:43:54 +08:00
logger . debug @homework . errors . full_messages
2015-08-28 12:04:49 +08:00
else
2015-09-10 11:34:10 +08:00
student_work = StudentWork . where ( homework_common_id : @homework . id , user_id : User . current . id ) . first
2015-08-28 12:04:49 +08:00
end
end
student_work
end
def test_realtime ( student_work , src )
2015-08-28 15:08:07 +08:00
url = " #{ Redmine :: Configuration [ 'judge_server' ] } api/realtime_test.json "
2015-08-28 12:04:49 +08:00
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
2015-09-17 11:41:24 +08:00
#成绩计算
2015-09-17 14:16:13 +08:00
def set_final_score homework , student_work
2015-09-17 11:41:24 +08:00
if homework && homework . homework_detail_manual
if homework . homework_type == 1 #匿评作业
if homework . teacher_priority == 1 #教师优先
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
elsif student_work . student_score . nil?
student_work . final_score = student_work . teaching_asistant_score
else
ta_proportion = homework . homework_detail_manual . ta_proportion
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
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 = homework . homework_detail_manual . ta_proportion
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 #教师优先
if student_work . teacher_score
student_work . final_score = student_work . teacher_score
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 = homework . homework_detail_programing . ta_proportion + homework . homework_detail_manual . ta_proportion / 2
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ ta_proportion } " )
2015-09-17 11:41:24 +08:00
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 = homework . homework_detail_programing . ta_proportion + ( 1 . 0 - homework . homework_detail_manual . ta_proportion - homework . homework_detail_programing . ta_proportion ) / 2
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ ta_proportion } " )
2015-09-17 11:41:24 +08:00
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
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ homework . homework_detail_programing . ta_proportion } " )
2015-09-17 11:41:24 +08:00
final_ts_score = BigDecimal . new ( " #{ student_work . teaching_asistant_score } " ) * BigDecimal . new ( " #{ homework . homework_detail_manual . ta_proportion } " )
final_st_score = BigDecimal . new ( " #{ student_work . student_score } " ) * ( BigDecimal . new ( '1.0' ) - BigDecimal . new ( " #{ homework . homework_detail_programing . ta_proportion } " ) - BigDecimal . new ( " #{ homework . homework_detail_manual . ta_proportion } " ) )
final_score = final_sy_score + final_ts_score + final_st_score
student_work . final_score = format ( " %.2f " , final_score . to_f )
end
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 = homework . homework_detail_programing . ta_proportion + homework . homework_detail_manual . ta_proportion / 2
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ ta_proportion } " )
2015-09-17 11:41:24 +08:00
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 = homework . homework_detail_programing . ta_proportion + ( 1 . 0 - homework . homework_detail_manual . ta_proportion - homework . homework_detail_programing . ta_proportion ) / 2
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ ta_proportion } " )
2015-09-17 11:41:24 +08:00
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
2015-09-18 09:32:25 +08:00
final_sy_score = BigDecimal . new ( " #{ student_work . system_score || 0 } " ) * BigDecimal . new ( " #{ homework . homework_detail_programing . ta_proportion } " )
2015-09-17 11:41:24 +08:00
final_ts_score = BigDecimal . new ( " #{ student_work . teaching_asistant_score } " ) * BigDecimal . new ( " #{ homework . homework_detail_manual . ta_proportion } " )
final_st_score = BigDecimal . new ( " #{ student_work . student_score } " ) * ( BigDecimal . new ( '1.0' ) - BigDecimal . new ( " #{ homework . homework_detail_programing . ta_proportion } " ) - BigDecimal . new ( " #{ homework . homework_detail_manual . ta_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
end
end
2015-05-19 17:12:43 +08:00
end