class StudentWorkController < ApplicationController layout "base_courses" include StudentWorkHelper require 'bigdecimal' before_filter :find_homework, :only => [:new, :index, :create] 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] def index @order,@b_sort,@name = params[:order] || "final_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 if @show_all if @homework.homework_type == 1 || @is_teacher || User.current.admin? @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name else my_work = @homework.student_works.where(:user_id => User.current.id) if my_work.empty? @stundet_works = [] else @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name end end else #学生 if @homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 @stundet_works = @homework.student_works.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) @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id} end end @homework_commons = @course.homework_commons.order("created_at desc") @score = @b_sort == "desc" ? "asc" : "desc" respond_to do |format| format.html format.xls { send_data(homework_to_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_homework_list)}.xls") } end end def new student_work = @homework.student_works.where("user_id = ?",User.current.id).first if student_work.nil? @stundet_work = StudentWork.new respond_to do |format| format.html end else render_403 end end def create if params[:student_work] stundet_work = StudentWork.new stundet_work.name = params[:student_work][:name] stundet_work.description = params[:student_work][:description] stundet_work.project_id = params[:student_work][:project_id] stundet_work.homework_common_id = @homework.id stundet_work.user_id = User.current.id stundet_work.save_attachments(params[:attachments]) render_attachment_warning_if_needed(stundet_work) if stundet_work.save 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 end def edit respond_to do |format| format.html end end def update 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 end def show @score = student_work_score @work,User.current @is_teacher = User.current.allowed_to?(:as_teacher,@course) respond_to do |format| format.js end end def destroy if @work.destroy respond_to do |format| format.html { redirect_to student_work_index_url(:homework => @homework.id) } end end end #添加评分,已评分则为修改评分 def add_score render_403 and return if User.current == @work.user #不可以匿评自己的作品 @is_teacher = User.current.allowed_to?(:as_teacher,@course) #老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分 render_403 and return unless @is_teacher || (@homework.homework_type == 1 && @homework.homework_detail_manual.comment_status == 2) @score = student_work_score @work,User.current 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] @is_new = false else @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 role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name User.current.admin? ? @score.reviewer_role = 1 : @score.reviewer_role = get_role_by_name(role) @is_new = true end @score.save_attachments(params[:attachments]) render_attachment_warning_if_needed(@score) if @score.save case @score.reviewer_role when 1 #教师评分:最后一个教师评分为最终评分 @work.teacher_score = @score.score @work.final_score = @score.score when 2 #教辅评分 教辅评分显示平均分 @work.teaching_asistant_score = @work.student_works_scores.where(:reviewer_role => 2).average(:score).try(:round, 2).to_f if @work.teacher_score.nil? if @work.student_score.nil? @work.final_score = @work.teaching_asistant_score else final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}") final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")) final_score = final_ta_score + final_s_score @work.final_score = format("%.2f",final_score.to_f) end end when 3 #学生评分 学生评分显示平均分 @work.student_score = @work.student_works_scores.where(:reviewer_role => 3).average(:score).try(:round, 2).to_f if @work.teacher_score.nil? if @work.teaching_asistant_score.nil? @work.final_score = @work.student_score else final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}") final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")) final_score = final_ta_score + final_s_score @work.final_score = format("%.2f",final_score.to_f) end end end if @work.save respond_to do |format| format.js end end end end #添加评分的回复 def add_score_reply @score = StudentWorksScore.find params[:score_id] @jour = @score.journals_for_messages.new(:user_id => User.current.id,:notes =>params[:message], :reply_id => 0) 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 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 private #获取作业 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.id == @work.user_id || User.current.admin?) && (@homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 ) end #根据条件过滤作业结果 def search_homework_member homeworks,name 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) } select_homework end 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 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.final_score.nil? ? l(:label_without_score) : format("%.2f",homework.final_score) sheet1[count_row,10] = format_time(homework.created_at) count_row += 1 end book.write xls_report xls_report.string end end