|
- class ExerciseController < ApplicationController
- layout "base_courses"
-
- before_filter :find_exercise_and_course, :only => [:create_exercise_question, :edit, :update, :show, :destroy,
- :commit_exercise, :commit_answer,:publish_exercise,:republish_exercise,
- :show_student_result,:student_exercise_list]
- before_filter :find_course, :only => [:index,:new,:create]
- include ExerciseHelper
-
- def index
- publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
- publish_exercises.each do |exercise|
- exercise.update_column('exercise_status', 2)
- course = exercise.course
- course.members.each do |m|
- exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
- end
- end
-
- if @course.is_public == 0 && !(User.current.member_of_course?(@course)||User.current.admin?)
- render_403
- return
- end
- remove_invalid_exercise(@course)
- @is_teacher = User.current.allowed_to?(:as_teacher,@course)
- if @is_teacher || User.current.admin?
- exercises = @course.exercises.order("created_at asc")
- else
- exercises = @course.exercises.where("exercise_status <> 1").order("created_at asc")
- end
- @exercises = paginateHelper exercises,20 #分页
- @left_nav_type = 8
- respond_to do |format|
- format.html
- end
- end
-
- def show
- publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
- publish_exercises.each do |exercise|
- exercise.update_column('exercise_status', 2)
- course = exercise.course
- course.members.each do |m|
- exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
- end
- end
-
- unless User.current.member_of_course?(@course) || User.current.admin?
- render_403
- return
- end
- @exercise = Exercise.find params[:id]
- @exercise.course_messages.each do |message|
- if User.current.id == message.user_id && message.viewed == 0
- message.update_attributes(:viewed => true) if message.viewed == 0
- end
- end
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- exercise_end = @exercise.end_time.nil? ? false : @exercise.end_time > Time.now
- if @exercise.time == -1
- @can_edit_excercise = exercise_end
- else
- @can_edit_excercise = !has_commit_exercise?(@exercise.id,User.current.id)&& exercise_end
- end
- unless @is_teacher
- @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
- if @exercise_user.nil?
- eu = ExerciseUser.create(:user_id => User.current.id, :exercise_id => @exercise.id, :start_at => Time.now, :status => false)
- @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
- end
- score = calculate_student_score(@exercise, User.current)
- @exercise_user.update_attributes(:score => score)
- end
- # @percent = get_percent(@exercise,User.current)
- @exercise_questions = @exercise.exercise_questions
- @left_nav_type = 8
- respond_to do |format|
- format.html {render :layout => 'base_courses'}
- end
- #end
- end
-
- def new
- option = {
- :exercise_name => "",
- :course_id => @course.id,
- :exercise_status => 1,
- :user_id => User.current.id,
- :time => "",
- :end_time => "",
- :publish_time => "",
- :exercise_description => "",
- :show_result => 1
- }
- @exercise = Exercise.create option
- if @exercise
- redirect_to edit_exercise_url @exercise.id
- end
- end
-
- def create
- if params[:exercise]
- exercise = Exercise.find(params[:exercise_id]) if params[:exercise_id]
- exercise ||= Exercise.new
- exercise.exercise_name = params[:exercise][:exercise_name]
- exercise.exercise_description = params[:exercise][:exercise_description]
- exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
- exercise.publish_time = params[:exercise][:publish_time]
- exercise.user_id = User.current.id
- exercise.time = params[:exercise][:time]
- exercise.course_id = params[:course_id]
- exercise.exercise_status = 1
- if exercise.save
- @exercise = exercise
- respond_to do |format|
- format.js
- end
- end
- end
- end
-
- def edit
- @left_nav_type = 8
- respond_to do |format|
- format.html{render :layout => 'base_courses'}
- end
- end
-
- def update
- @exercise.exercise_name = params[:exercise][:exercise_name]
- @exercise.exercise_description = params[:exercise][:exercise_description]
- @exercise.time = params[:exercise][:time].blank? ? -1 : params[:exercise][:time]
- @exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
- @exercise.publish_time = params[:exercise][:publish_time]
- @exercise.show_result = params[:exercise][:show_result].blank? ? 1 : params[:exercise][:show_result]
- if @exercise.save
- respond_to do |format|
- format.js
- end
- else
- render_404
- end
- end
-
- def destroy
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- if @exercise && @exercise.destroy
- if @is_teacher
- exercises = Exercise.where("course_id =?", @course.id)
- else
- exercises = Exercise.where("course_id =? and exercise_status =?", @course.id, 2)
- end
- @exercises = paginateHelper exercises,20 #分页
- respond_to do |format|
- format.js
- end
- end
- end
-
- # 统计结果
- def statistics_result
- @exercise = Exercise.find(params[:id])
- exercise_questions = @exercise.exercise_questions
- @exercise_questions = paginateHelper exercise_questions, 5
- @left_nav_type = 8
- respond_to do |format|
- format.html{render :layout => 'base_courses'}
- end
- end
-
- # 添加题目
- # question_type 1:单选 2:多选 3:填空题
- def create_exercise_question
- question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
- option = {
- :question_title => question_title,
- :question_type => params[:question_type] || 1,
- :question_number => params[:question_type] == "1"? @exercise.exercise_questions.where("question_type = 1").count + 1 :
- (params[:question_type] == "2" ? (@exercise.exercise_questions.where("question_type = 2").count + 1) :
- @exercise.exercise_questions.where("question_type = 3").count + 1),
- :question_score => params[:question_score]
- }
- @exercise_questions = @exercise.exercise_questions.new option
- # params[:question_answer] 题目选项
- if params[:question_answer]
- for i in 1..params[:question_answer].count
- answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
- question_option = {
- :choice_position => i,
- :choice_text => answer
- }
- @exercise_questions.exercise_choices.new question_option
- end
- end
- # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1
- if params[:quest_id]
- @is_insert = true
- if @exercise_questions.question_type == 1
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number + 1")
- #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
- elsif @exercise_questions.question_type == 2
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number + 1")
- else
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number + 1")
- end
- # @exercise_question_num = params[:quest_num].to_i
- @exercise_questions.question_number = params[:quest_num].to_i + 1
- end
- if @exercise_questions.save
- # params[:exercise_choice] 标准答案参数
- # 问答题标准答案有三个,单独处理
- if @exercise_questions.question_type == 3
- for i in 1..params[:exercise_choice].count
- standart_answer = ExerciseStandardAnswer.new
- standart_answer.exercise_question_id = @exercise_questions.id
- standart_answer.answer_text = params[:exercise_choice].values[i-1]
- standart_answer.save
- end
- else
- standart_answer = ExerciseStandardAnswer.new
- standart_answer.exercise_question_id = @exercise_questions.id
- if @exercise_questions.question_type == 1
- standart_answer.exercise_choice_id = sigle_selection_standard_answer(params[:exercise_choice])
- else
- standart_answer.exercise_choice_id = multiselect_standard_answer(params[:exercise_choice])
- end
- standart_answer.save
- end
- respond_to do |format|
- format.js
- end
- end
-
- end
-
- # 修改题目
- # params[:exercise_question] The id of exercise_question
- # params[:question_answer] eg:A、B、C选项
- def update_exercise_question
- @exercise_question = ExerciseQuestion.find params[:exercise_question]
- @exercise_question.question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
- @exercise_question.question_score = params[:question_score]
- # 处理选项:如果选了某个选项,那么则要删除之前的选项
- if params[:question_answer]
- @exercise_question.exercise_choices.each do |answer|
- answer.destroy unless params[:question_answer].keys.include? answer.id.to_s
- end
- for i in 1..params[:question_answer].count
- question = @exercise_question.exercise_choices.find_by_id params[:question_answer].keys[i-1]
- answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
- if question
- question.choice_position = i
- question.choice_text = answer
- question.save
- else
- question_option = {
- :choice_position => i,
- :choice_text => answer
- }
- @exercise_question.exercise_choices.new question_option
- end
- end
- end
- # 更新标准答案
- if params[:exercise_choice]
- if @exercise_question.question_type == 3
- # 删除不合理的选项
- @exercise_question.exercise_standard_answers.each do |answer|
- answer.destroy unless params[:exercise_choice].keys.include? answer.id.to_s
- end
- for i in 1..params[:exercise_choice].count
- # 找到对应的标准答案
- question_standart = @exercise_question.exercise_standard_answers.find_by_id params[:exercise_choice].keys[i-1]
- # 标准答案值
- answer_standart = (params[:exercise_choice].values[i-1].nil? || params[:exercise_choice].values[i-1].empty?) ? l(:label_new_answer) : params[:exercise_choice].values[i-1]
- if question_standart
- question_standart.answer_text = answer_standart
- question_standart.save
- else
- standart_answer_option = {
- :answer_text => answer_standart
- }
- @exercise_question.exercise_standard_answers.new standart_answer_option
- end
- end
- else
- answer_standart = @exercise_question.exercise_standard_answers.first
- answer_standart.exercise_choice_id = @exercise_question.question_type == 1 ? sigle_selection_standard_answer(params[:exercise_choice]) : multiselect_standard_answer(params[:exercise_choice])
- answer_standart.save
- end
- @exercise_question.save
- respond_to do |format|
- format.js
- end
- end
- end
-
- # 删除题目
- def delete_exercise_question
- @exercise_question = ExerciseQuestion.find params[:exercise_question]
- @exercise = @exercise_question.exercise
-
- if @exercise_question.question_type == 1
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number - 1")
- #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
- elsif @exercise_question.question_type == 2
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number - 1")
- else
- ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number - 1")
- end
- # @exercise_question_num = params[:quest_num].to_i
- # @exercise_questions.question_number = params[:quest_num].to_i - 1
- #
- # exercise_questions = @exercise.exercise_questions.where("question_number > #{@exercise_question.question_number}")
- # exercise_questions.each do |question|
- # question.question_number -= 1
- # question.save
- # end
- if @exercise_question && @exercise_question.destroy
- respond_to do |format|
- format.js
- end
- end
- end
-
- # 发布试卷
- def publish_exercise
- @is_teacher = User.current.allowed_to?(:as_teacher,@course)
- @index = params[:index]
- @exercise.exercise_status = 2
- @exercise.publish_time = Time.now
- if @exercise.save
- @exercise.course.members.each do |m|
- @exercise.course_messages << CourseMessage.create(:user_id =>m.user_id, :course_id => @exercise.course.id, :viewed => false,:status=>2)
- end
- #redirect_to exercise_index_url(:course_id=> @course.id)
- respond_to do |format|
- format.js
- end
- end
- end
-
- # 重新发布试卷
- # 重新发布的时候会删除所有的答题
- def republish_exercise
- @is_teacher = User.current.allowed_to?(:as_teacher,@course)
- @index = params[:index]
- @exercise.exercise_questions.each do |exercise_question|
- exercise_question.exercise_answers.destroy_all
- end
- @exercise.course_messages.destroy_all
- @exercise.exercise_users.destroy_all
- @exercise.exercise_status = 1
- @exercise.publish_time = nil
- @exercise.save
- respond_to do |format|
- format.js
- end
- end
-
- def student_exercise_list
- =begin
- if @exercise.end_time <= Time.now
- @course.student.each do |student|
- if ExerciseUser.where("user_id = ? && exercise_id = ?",student.student_id,@exercise.id).empty?
- ExerciseUser.create(:user_id => student.student_id, :exercise_id => @exercise.id, :start_at => @exercise.end_time, :status => true,:score=>0)
- end
-
- s_score = calculate_student_score(@exercise, student.student)
- exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", student.student_id, @exercise.id).first
- exercise_user.update_attributes(:score => s_score)
- end
- end
- =end
- @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
- @all_exercises = @course.exercises.where("exercise_status > 1").order("created_at desc")
- student_id = @course.student.blank? ? "(-1)" : "(" + @course.student.map{|student| student.student_id}.join(",") + ")"
- @exercise_count = @exercise.exercise_users.where("score is not NULL and user_id in #{student_id}").count
- if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id} and user_id in #{student_id}").empty? && @exercise.end_time <= Time.now)
- @exercise_users_list = @exercise.exercise_users.where("score is not NULL and user_id in #{student_id}")
- @show_all = true;
- elsif !@exercise.exercise_users.where("user_id = #{User.current.id} and user_id in #{student_id}").empty? && @exercise.end_time > Time.now
- @exercise_users_list = @exercise.exercise_users.where("user_id = ? and score is not NULL and user_id in #{student_id}",User.current.id)
- else
- @exercise_users_list = []
- end
- @left_nav_type = 8
- respond_to do |format|
- format.html
- format.xls {
- filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@exercise.exercise_name}#{l(:excel_exercise_list)}.xls"
- send_data(exercise_to_xls(@exercise_users_list), :type => "text/excel;charset=utf-8; header=present",
- :filename => filename_for_content_disposition(filename))
- }
- end
- end
-
- # 学生提交答卷,选中答案的过程中提交
- def commit_answer
- eq = ExerciseQuestion.find(params[:exercise_question_id])
- # 已提交过的且是限时的则不允许答题
- if (has_commit_exercise?(@exercise.id,User.current.id) && (!User.current.admin?) && @exercise.time != -1) || @exercise.end_time < Time.now
- render :json => {:text => "failure"}
- return
- end
- if eq.question_type == 1
- # 单选题
- ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id],User.current.id)
- if ea.nil?
- # 尚未答该题,添加答案
- ea = ExerciseAnswer.new
- ea.user_id = User.current.id
- ea.exercise_question_id = params[:exercise_question_id]
- end
- #修改该题对应答案
- ea.exercise_choice_id = params[:exercise_choice_id]
- if ea.save
- # 保存成功返回成功信息及当前以答题百分比
- uncomplete_question = get_uncomplete_question(@exercise, User.current)
- if uncomplete_question.count < 1
- complete = 1;
- else
- complete = 0;
- end
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => "ok" ,:complete => complete,:percent => format("%.2f" ,@percent)}
- else
- #返回失败信息
- render :json => {:text => "failure"}
- end
- elsif eq.question_type == 2
- #多选题
- ea = ExerciseAnswer.find_by_exercise_choice_id_and_user_id(params[:exercise_choice_id],User.current.id)
- if ea.nil?
- #尚未答该题,添加答案
- ea = ExerciseAnswer.new
- ea.user_id = User.current.id
- ea.exercise_question_id = params[:exercise_question_id]
- ea.exercise_choice_id = params[:exercise_choice_id]
- if ea.save
- uncomplete_question = get_uncomplete_question(@exercise, User.current)
- if uncomplete_question.count < 1
- complete = 1;
- else
- complete = 0;
- end
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => "ok",:complete => complete,:percent => format("%.2f" ,@percent)}
- else
- render :json => {:text => "failure"}
- end
- else
- #pv不为空,则当前选项之前已被选择,再次点击则是不再选择该项,故删除该答案
- if ea.delete
- @percent = get_percent(@exercise, User.current)
- render :json => {:text => "false" ,:percent => format("%.2f" , @percent)}
- else
- render :json => {:text => "failure"}
- end
- end
- elsif eq.question_type == 3
- #单行文本,多行文本题
- ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id], User.current.id)
- if ea.nil?
- # ea为空之前尚未答题,添加答案
- if params[:answer_text].nil? || params[:answer_text].blank?
- #用户提交空答案,视作不作答
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => "",:percent => format("%.2f", @percent)}
- else
- #添加答案
- ea = ExerciseAnswer.new
- ea.user_id = User.current.id
- ea.exercise_question_id = params[:exercise_question_id]
- ea.answer_text = params[:answer_text]
- if ea.save
- uncomplete_question = get_uncomplete_question(@exercise, User.current)
- if uncomplete_question.count < 1
- complete = 1;
- else
- complete = 0;
- end
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => ea.answer_text,:complete => complete,:percent => format("%.2f",@percent)}
- else
- render :json => {:text => "failure"}
- end
- end
- else
- # ea不为空说明用户之前已作答
- if params[:answer_text].nil? || params[:answer_text].blank?
- # 用户提交空答案,视为删除答案
- if ea.delete
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => "",:percent => format("%.2f", @percent)}
- else
- render :json => {:text => "failure"}
- end
- else
- #用户修改答案
- ea.answer_text = params[:answer_text]
- if ea.save
- @percent = get_percent(@exercise,User.current)
- render :json => {:text => ea.answer_text,:percent => format("%.2f", @percent)}
- else
- render :json => {:text => "failure"}
- end
- end
- end
-
- else
- render :json => {:text => "failure"}
- end
- end
-
- # 提交问卷
- def commit_exercise
- # 老师不需要提交
- if User.current.allowed_to?(:as_teacher,@course)
- if @exercise.publish_time.nil? || @exercise.publish_time <= Time.now
- @exercise.update_attributes(:show_result => params[:show_result])
- @exercise.update_attributes(:exercise_status => 2)
- @exercise.update_attributes(:publish_time => Time.now)
- course = @exercise.course
- course.members.each do |m|
- @exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
- end
- redirect_to exercise_url(@exercise)
- return
- elsif @exercise.publish_time > Time.now
- @exercise.update_attributes(:show_result => params[:show_result])
- redirect_to exercise_url(@exercise)
- return
- end
- @exercise.update_attributes(:show_result => params[:show_result])
- redirect_to exercise_url(@exercise)
- # REDO: 提示提交成功
- else
- # 更新提交状态
- cur_exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", User.current, @exercise.id).first
- cur_exercise_user.update_attributes(:status => 1, :commit_status => 1)
- # 答题过程中需要统计完成量
- @uncomplete_question = get_uncomplete_question(@exercise, User.current)
- # 获取改学生的考试得分
- @score = calculate_student_score(@exercise, User.current)
- # @score = 100
- if @uncomplete_question.count < 1
- # 查看是否有已提交记录
- cur_exercise_user.score = @score
- if cur_exercise_user.save
- #redirect_to poll_index_path(:polls_group_id => @course.id,:polls_type => 'Course')
- @status = 0 #提交成功
- else
- @status = 2 #未知错误
- end
- else
- @status = 1 #有未做得必答题
- end
- @save = params[:save].to_i if params[:save]
- respond_to do |format|
- format.js
- end
- end
- end
-
- #查看学生的答卷情况
- def show_student_result
- @user = User.find params[:user_id]
- @can_edit_excercise = false
- @exercise_questions = @exercise.exercise_questions
- score = calculate_student_score(@exercise, @user)
- eu = get_exercise_user(@exercise.id, @user.id)
- eu.update_attributes(:score => score)
- @exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", @user.id, @exercise.id).first
- @left_nav_type = 8
- respond_to do |format|
- format.html {render :layout => 'base_courses'}
- end
- end
-
- # 计算学生得分
- def calculate_student_score(exercise, user)
- score = 0
- score1 = 0
- score2 = 0
- score3 = 0
- exercise_qustions = exercise.exercise_questions
- exercise_qustions.each do |question|
- answer = get_user_answer(question, user)
- standard_answer = get_user_standard_answer(question, user)
- unless answer.empty?
- # 问答题有多个答案
- if question.question_type == 3 && !standard_answer.empty?
- if standard_answer.include?(answer.first.answer_text)
- score1 = score1+ question.question_score unless question.question_score.nil?
- end
- elsif question.question_type == 1 && !standard_answer.nil?
- if answer.first.exercise_choice.choice_position == standard_answer.exercise_choice_id
- score2 = score2 + question.question_score unless question.question_score.nil?
- end
- elsif question.question_type == 2 && !standard_answer.nil?
- arr = get_mulscore(question, user)
- if arr.to_i == standard_answer.exercise_choice_id
- score3 = score3 + question.question_score unless question.question_score.nil?
- end
- # ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
- # arr = []
- # ecs.each do |ec|
- # arr << ec.exercise_choice.choice_position
- # end
- # arr.sort
- # arr = arr.join("")
- # if arr.to_i == standard_answer.exercise_choice_id
- # score3 = score + question.question_score unless question.question_score.nil?
- # end
- end
- end
- end
- score = score1 + score2 + score3
- end
-
- #导入试卷的弹框
- def other_exercise
- # 查作者是我,或者作者是当前课程的老师,且不在当前课程内的试卷 进行导入
- @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
- @r_sort = @b_sort == "desc" ? "asc" : "desc"
- courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
- course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
- #none_courses = User.current.courses.where("is_delete = 1 or #{Course.table_name}.id = #{params[:course_id].to_i}")
- #none_course_ids = none_courses.empty? ? "(-1)" : "(" + none_courses.map { |course| course.id}.join(',') + ")"
- @exercises = Exercise.where("(user_id = #{User.current.id} or course_id in #{course_ids}) and course_id != #{params[:course_id].to_i}").order("#{@order} #{@b_sort}")
- @course_id = params[:course_id]
- @is_remote = true
- @ex_count = @exercises.count
- @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
- @offset ||= @ex_pages.offset
- @exercises = paginateHelper @exercises,10
- respond_to do |format|
- format.js
- end
- end
-
- #搜索导入页面的试卷
- def search_exercises
- @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
- @r_sort = @b_sort == "desc" ? "asc" : "desc"
- search = params[:name].to_s.strip.downcase
- courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
- course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
- @exercises = Exercise.where("(user_id = #{User.current.id} or course_id in #{course_ids}) and course_id != #{params[:course_id].to_i} and exercise_name like '%#{search}%'").order("#{@order} #{@b_sort}")
- @is_remote = true
- @ex_count = @exercises.count
- @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
- @offset ||= @ex_pages.offset
- @exercises = paginateHelper @exercises,10
- @course_id = params[:course_id]
- respond_to do |format|
- format.js
- end
- end
-
- #将选择的试卷导入到班级
- def import_other_exercise
- course_id = params[:course_id]
- @course = Course.find(course_id)
- params[:exercise_id].each_with_index do |ex,i|
- exercise = Exercise.find(ex)
- option = {
- :exercise_name => exercise.exercise_name,
- :exercise_status => 1,
- :user_id => User.current.id,
- :show_result => 1,
- :course_id => @course.id,
- :time => exercise.time,
- :exercise_description => exercise.exercise_description
- }
- @exercise = Exercise.create option
-
- exercise.exercise_questions.each do |q|
- option = {
- :question_title => q[:question_title],
- :question_type => q[:question_type] || 1,
- :question_number => q[:question_number],
- :question_score => q[:question_score]
- }
- @exercise_question = @exercise.exercise_questions.new option
-
- for i in 1..q.exercise_choices.count
- choice_option = {
- :choice_position => i,
- :choice_text => q.exercise_choices[i-1][:choice_text]
- }
- @exercise_question.exercise_choices.new choice_option
- end
-
- for i in 1..q.exercise_standard_answers.count
- standard_answer_option = {
- :exercise_choice_id => q.exercise_standard_answers[i-1][:exercise_choice_id],
- :answer_text => q.exercise_standard_answers[i-1][:answer_text]
- }
- @exercise_question.exercise_standard_answers.new standard_answer_option
- end
- end
- @exercise.save
- end
- respond_to do |format|
- format.js
- end
- end
-
- private
- #测验列表转换为excel
- def exercise_to_xls items
- xls_report = StringIO.new
- book = Spreadsheet::Workbook.new
- sheet1 = book.create_worksheet :name => "exercise"
- 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_class),l(:excel_f_score),l(:excel_commit_time)])
- count_row = 1
- items.each do |exercise|
- sheet1[count_row,0]=exercise.user.id
- sheet1[count_row,1] = exercise.user.lastname.to_s + exercise.user.firstname.to_s
- sheet1[count_row,2] = exercise.user.login
- sheet1[count_row,3] = exercise.user.user_extensions.student_id
- sheet1[count_row,4] = exercise.user.mail
- sheet1[count_row,5] = ""
- sheet1[count_row,6] = exercise.score
- sheet1[count_row,7] = format_time(exercise.created_at)
- count_row += 1
- end
- book.write xls_report
- xls_report.string
- end
-
- # ExerciseUser记录用户是否已提交问卷有对应的记录则已提交,没有则新建一个
- def get_exercise_user exercise_id,user_id
- eu = ExerciseUser.find_by_exercise_id_and_user_id(exercise_id,user_id)
- if eu.nil?
- eu = ExerciseUser.new
- end
- eu
- end
-
- # 获取当前学生回答问题的答案
- def get_user_answer(question,user)
- # user_answer = ExerciseAnswer.where("user_id=? and exercise_question_id=?", user.id, question.id).first
- user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
- user_answer
- end
-
- # 获取问题的标准答案
- def get_user_standard_answer(question,user)
- if question.question_type == 3
- standard_answer =[]
- question.exercise_standard_answers.each do |answer|
- standard_answer << answer.answer_text
- end
- else
- standard_answer = question.exercise_standard_answers.first
- end
- standard_answer
- end
- # 是否完成了答题
- def get_complete_question(exercise,user)
- questions = exercise.exercise_questions
- complete_question = []
- questions.each do |question|
- answers = get_user_answer(question,user)
- if !(answers.nil? || answers.count < 1)
- complete_question << question
- end
- end
- complete_question
- end
-
- # 获取答题百分比
- def get_percent exercise,user
- complete_count = get_complete_question(exercise,user).count
- if exercise.exercise_questions.count == 0
- return 0
- else
- return (complete_count.to_f / exercise.exercise_questions.count.to_f)*100
- end
- end
-
- def remove_invalid_exercise(course)
- exercises = course.exercises.where("exercise_name=?","")
- unless exercises.empty?
- exercises.each do |exercise|
- if exercise.exercise_questions.empty?
- exercise.destroy
- end
- end
- end
- end
-
- def find_exercise_and_course
- @exercise = Exercise.find params[:id]
- @course = Course.find @exercise.course_id
- rescue Exception => e
- render_404
- end
-
- def find_course
- @course = Course.find params[:course_id]
- rescue Exception => e
- render_404
- end
- end
|