@ -2,38 +2,39 @@ class StudentWorkController < ApplicationController
layout " base_courses "
include StudentWorkHelper
require 'bigdecimal'
before_filter :find_homework , :only = > [ :new , :index , :create , :student_work_absence_penalty ]
before_filter :find_homework , :only = > [ :new , :index , :create , :student_work_absence_penalty , :absence_penalty_list , :evaluation_list ]
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 ]
before_filter :author_of_work , :only = > [ :edit , :update , :destroy ]
before_filter :teacher_of_course , :only = > [ :student_work_absence_penalty , :absence_penalty_list , :evaluation_list ]
def index
@order , @b_sort , @name = params [ :order ] || " final_ score" , params [ :sort ] || " desc " , params [ :name ] || " "
@order , @b_sort , @name = params [ :order ] || " score" , params [ :sort ] || " desc " , params [ :name ] || " "
@is_teacher = User . current . allowed_to? ( :as_teacher , @course )
#老师 || 非匿评作业 || 匿评结束 显示所有的作品
@show_all = @is_teacher || @homework . homework_type != 1 || @homework . homework_detail_manual . comment_status == 3
@show_all = @is_teacher || @homework . homework_type != 1 || @homework . homework_detail_manual . comment_status == 3 || User . current . admin?
if @show_all
if @homework . homework_type == 1 || @is_teacher || User . current . admin?
if @homework . homework_type == 1 || @is_teacher || User . current . admin? #超级管理员 || 老师 || 匿评结束 显示所有的作品
if @order == " name "
@stundet_works = search_homework_member @homework . student_works . joins( :user ) . order ( " users.lastname #{ @b_sort } , users.firstname #{ @b_sort } " ) , @name
@stundet_works = search_homework_member @homework . student_works . select( " *,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . joins( :user ) . order ( " users.lastname #{ @b_sort } , users.firstname #{ @b_sort } " ) , @name
else
@stundet_works = search_homework_member @homework . student_works . order( " #{ @order } #{ @b_sort } " ) , @name
@stundet_works = search_homework_member @homework . student_works . select( " *,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . order( " #{ @order } #{ @b_sort } " ) , @name
end
else
my_work = @homework . student_works . where( :user_id = > User . current . id )
else #剩余情况: 学生 && 非匿评作业 如果未提交作品,只能看到自己的,提交了作品,能看到所有作品
my_work = @homework . student_works . select( " *,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
if @order == " name "
@stundet_works = search_homework_member @homework . student_works . joins( :user ) . order ( " users.lastname #{ @b_sort } , users.firstname #{ @b_sort } " ) , @name
@stundet_works = search_homework_member @homework . student_works . select( " *,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . joins( :user ) . order ( " users.lastname #{ @b_sort } , users.firstname #{ @b_sort } " ) , @name
else
@stundet_works = search_homework_member @homework . student_works . order( " #{ @order } #{ @b_sort } " ) , @name
@stundet_works = search_homework_member @homework . student_works . select( " *,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score " ) . order( " #{ @order } #{ @b_sort } " ) , @name
end
end
end
else #学生
if @homework . homework_detail_manual . comment_status == 1 #未开启匿评,只显示我的作品
@stundet_works = @homework . student_works . where( :user_id = > User . current . id )
@stundet_works = @homework . student_works . select( " *,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 #匿评列表,显示匿评作品和我的作品
@is_evaluation = true
my_work = @homework . student_works . where ( :user_id = > User . current . id )
@ -41,6 +42,7 @@ class StudentWorkController < ApplicationController
end
end
@homework_commons = @course . homework_commons . order ( " created_at desc " )
@homework_commons = @course . homework_commons . order ( " created_at desc " )
@score = @b_sort == " desc " ? " asc " : " desc "
respond_to do | format |
format . html
@ -72,6 +74,11 @@ class StudentWorkController < ApplicationController
stundet_work . homework_common_id = @homework . id
stundet_work . user_id = User . current . id
stundet_work . save_attachments ( params [ :attachments ] )
if Time . parse ( @homework . end_time . to_s ) . strftime ( " %Y-%m-%d " ) < Time . parse ( Time . now . to_s ) . strftime ( " %Y-%m-%d " )
stundet_work . late_penalty = @homework . late_penalty
else
stundet_work . late_penalty = 0
end
render_attachment_warning_if_needed ( stundet_work )
if stundet_work . save
respond_to do | format |
@ -241,25 +248,61 @@ class StudentWorkController < ApplicationController
end
end
# 评价 列表显示
# 缺 评列表显示
def student_work_absence_penalty
render_403 unless User . current . allowed_to? ( :as_teacher , @course )
order = params [ :order ] || " desc "
work_ids = " ( " + @homework . student_works . map ( & :id ) . join ( " , " ) + " ) "
@stundet_works = StudentWork . find_by_sql ( " SELECT *,(all_count - has_count) AS absence FROM(
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}")
) AS table_1
ORDER BY absence #{order}")
end
@order = order == " desc " ? " asc " : " desc "
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 {
send_data ( absence_penalty_list_xls ( @stundet_works ) , :type = > " text/excel;charset=utf-8; header=present " ,
:filename = > " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @course . time . to_s + @course . term } _ #{ @homework . name } #{ l ( :excel_absence_list ) } .xls " )
}
end
end
#导出匿评列表
def evaluation_list
respond_to do | format |
format . xls {
send_data ( evaluation_list_xls ( @homework . student_works ) , :type = > " text/excel;charset=utf-8; header=present " ,
:filename = > " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @course . time . to_s + @course . term } _ #{ @homework . name } #{ l ( :excel_evaluation_list ) } .xls " )
}
end
end
private
#获取作业
def find_homework
@ -280,7 +323,7 @@ class StudentWorkController < ApplicationController
#是不是当前课程的成员
#当前课程成员才可以看到作品列表
def member_of_course
render_403 unless User . current . member_of_course? @course || User . current . admin?
render_403 unless User . current . member_of_course? ( @course ) || User . current . admin?
end
#判断是不是当前作品的提交者
@ -289,6 +332,10 @@ class StudentWorkController < ApplicationController
render_403 unless ( User . current . id == @work . user_id || User . current . admin? ) && ( @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 )
end
#根据条件过滤作业结果
def search_homework_member homeworks , name
name = name . downcase
@ -298,6 +345,7 @@ class StudentWorkController < ApplicationController
select_homework
end
#作品列表转换为excel
def homework_to_xls items
xls_report = StringIO . new
book = Spreadsheet :: Workbook . new
@ -324,4 +372,55 @@ class StudentWorkController < ApplicationController
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
end