class HomeworkCommonController < ApplicationController require 'net/http' require 'json' require "base64" layout "base_courses" include StudentWorkHelper before_filter :find_course, :only => [:index,:new,:create] before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy,:start_evaluation_set,:set_evaluation_attr,:score_rule_set] before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment,:start_evaluation_set,:set_evaluation_attr,:score_rule_set] before_filter :member_of_course, :only => [:index] def index @new_homework = HomeworkCommon.new @new_homework.homework_detail_manual = HomeworkDetailManual.new @new_homework.course = @course @page = params[:page] ? params[:page].to_i + 1 : 0 @homeworks = @course.homework_commons.order("created_at desc").limit(10).offset(@page * 10) @is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course)) @is_student = User.current.logged? && (User.current.admin? || (User.current.member_of_course?(@course) && !@is_teacher)) @is_new = params[:is_new] respond_to do |format| format.js format.html end end #新建作业,在个人作业列表创建作业 def new render_404 end #新建作业,在个人作业列表创建作业 def create redirect_to user_homeworks_user_path(User.current.id) end def edit @user = User.current @is_in_course = params[:is_in_course].to_i respond_to do |format| format.html{render :layout => 'new_base_user'} end end def update if params[:homework_common] @homework.name = params[:homework_common][:name] @homework.description = params[:homework_common][:description] @homework.end_time = params[:homework_common][:end_time] || Time.now @homework.course_id = params[:course_id] homework_detail_manual = @homework.homework_detail_manual || HomeworkDetailManual.new homework_detail_manual.evaluation_start = params[:evaluation_start].blank? ? @homework.end_time + 7 : params[:evaluation_start] homework_detail_manual.evaluation_end = params[:evaluation_end].blank? ? homework_detail_manual.evaluation_start + 7 : params[:evaluation_end] @homework.save_attachments(params[:attachments]) render_attachment_warning_if_needed(@homework) #编程作业相关属性 if @homework.homework_type == 2 @homework.homework_detail_programing ||= HomeworkDetailPrograming.new @homework_detail_programing = @homework.homework_detail_programing @homework_detail_programing.language = params[:language_type].to_i @homework.homework_tests.delete_all inputs = params[:program][:input] if Array === inputs inputs.each_with_index do |val, i| @homework.homework_tests << HomeworkTest.new( input: val, output: params[:program][:output][i] ) end end end if @homework.save @homework_detail_manual.save if @homework_detail_manual @homework_detail_programing.save if @homework_detail_programing if params[:is_in_course] == "1" redirect_to homework_common_index_path(:course => @course.id) else redirect_to user_homeworks_user_path(User.current.id) end end end end def destroy if @homework.destroy respond_to do |format| format.html { if params[:is_in_course] == "1" redirect_to homework_common_index_path(:course => @course.id) else redirect_to user_homeworks_user_path(User.current.id) end } end end end #开启匿评 #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启,4:没有开启匿评的权限 def start_anonymous_comment @statue = 4 and return unless User.current.admin? || User.current.allowed_to?(:as_teacher,@course) @statue = 5 and return if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") if @homework_detail_manual.comment_status == 1 student_works = @homework.student_works if student_works && student_works.size >= 2 student_works.each_with_index do |work, index| user = work.user n = @homework_detail_manual.evaluation_num n = n < student_works.size ? n : student_works.size - 1 assigned_homeworks = get_assigned_homeworks(student_works, n, index) assigned_homeworks.each do |h| student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) student_works_evaluation_distributions.save end end @homework_detail_manual.update_column('comment_status', 2) @statue = 1 # 匿评开启消息邮件通知 send_message_anonymous_comment(@homework, m_status = 2) Mailer.send_mail_anonymous_comment_open(@homework).deliver else @statue = 2 end else @statue = 3 end end #关闭匿评 def stop_anonymous_comment @homework_detail_manual.update_column('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 student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * @homework_detail_manual.absence_penalty : 0 student_work.save end # 匿评关闭消息邮件通知 send_message_anonymous_comment(@homework, m_status = 3) Mailer.send_mail_anonymous_comment_close(@homework).deliver respond_to do |format| format.js end end # 开启/关闭匿评消息通知 def send_message_anonymous_comment(homework, m_status ) # status 标记匿评状态 1为关闭 0为开启 course = homework.course course.members.each do |m| @homework.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => m_status) end end #提示 def alert_anonymous_comment @cur_size = 0 @totle_size = 0 if @homework_detail_manual.comment_status == 1 @totle_size = @course.student.count @cur_size = @homework.student_works.size elsif @homework_detail_manual.comment_status == 2 @homework.student_works.map { |work| @totle_size += work.student_works_evaluation_distributions.count} @cur_size = 0 @homework.student_works.map { |work| @cur_size += work.student_works_scores.where(:reviewer_role => 3).count} end @percent = format("%.2f",(@cur_size.to_f / ( @totle_size == 0 ? 1 : @totle_size)) * 100) respond_to do |format| format.js end end def programing_test test = {language:params[:language],src:Base64.encode64(params[:src]),input:[params[:input]],output:[params[:output]]} @index = params[:index] uri = URI('http://192.168.80.21:8080/api/realtime.json') body = test.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 result = JSON.parse(res.body) @err_msg = result["compile_error_msg"] result["results"].each do |re| @result = re["status"] end end #启动匿评参数设置 def start_evaluation_set end #设置匿评参数 def set_evaluation_attr if @homework_detail_manual unless params[:evaluation_start].to_s == @homework_detail_manual.evaluation_start.to_s @homework_detail_manual.evaluation_start = params[:evaluation_start] end unless @homework_detail_manual.evaluation_end.to_s == params[:evaluation_end].to_s @homework_detail_manual.evaluation_end = params[:evaluation_end] end @homework_detail_manual.evaluation_num = params[:evaluation_num] @homework_detail_manual.save end end #评分设置 def score_rule_set end private #获取课程 def find_course @course = Course.find params[:course] rescue render_404 end #获取作业 def find_homework @homework = HomeworkCommon.find params[:id] @homework_detail_manual = @homework.homework_detail_manual @homework_detail_programing = @homework.homework_detail_programing @course = @homework.course rescue render_404 end #是不是课程的老师 def teacher_of_course render_403 unless User.current.allowed_to?(:as_teacher,@course) || User.current.admin? end #当前用户是不是课程的成员 def member_of_course render_403 unless @course.is_public || User.current.member_of_course?(@course) || User.current.admin? end def get_assigned_homeworks(student_works, n, index) student_works += student_works student_works[index + 1 .. index + n] end end