2015-12-31 10:28:58 +08:00
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 #分页
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
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 ]
2016-06-12 14:20:55 +08:00
@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
2015-12-31 10:28:58 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
2016-12-16 14:05:14 +08:00
exercise_end = @exercise . end_time . nil? ? false : @exercise . end_time > Time . now
2015-12-31 10:28:58 +08:00
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
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
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
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
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 ]
2016-12-06 15:02:32 +08:00
@exercise . show_result = params [ :exercise ] [ :show_result ] . blank? ? 1 : params [ :exercise ] [ :show_result ]
2015-12-31 10:28:58 +08:00
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
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
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 " )
2016-11-17 17:04:00 +08:00
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 } " )
2015-12-31 10:28:58 +08:00
@show_all = true ;
2016-11-17 17:04:00 +08:00
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 )
2015-12-31 10:28:58 +08:00
else
@exercise_users_list = [ ]
end
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
respond_to do | format |
format . html
2016-01-07 16:43:03 +08:00
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 ) )
}
2015-12-31 10:28:58 +08:00
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 )
2016-07-05 10:06:46 +08:00
if @exercise . publish_time . nil? || @exercise . publish_time < = Time . now
2015-12-31 10:28:58 +08:00
@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
2016-11-17 17:04:00 +08:00
cur_exercise_user . update_attributes ( :status = > 1 , :commit_status = > 1 )
2015-12-31 10:28:58 +08:00
# 答题过程中需要统计完成量
@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
2016-07-22 15:32:37 +08:00
@left_nav_type = 8
2015-12-31 10:28:58 +08:00
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
2016-11-15 16:57:07 +08:00
#导入试卷的弹框
def other_exercise
# 查作者是我,或者作者是当前课程的老师,且不在当前课程内的试卷 进行导入
2016-11-17 09:06:44 +08:00
@order , @b_sort = params [ :order ] || " created_at " , params [ :sort ] || " desc "
@r_sort = @b_sort == " desc " ? " asc " : " desc "
2016-11-15 16:57:07 +08:00
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(',') + ")"
2016-11-17 09:06:44 +08:00
@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 } " )
2016-11-15 16:57:07 +08:00
@course_id = params [ :course_id ]
2016-11-17 09:06:44 +08:00
@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
2016-11-15 16:57:07 +08:00
respond_to do | format |
format . js
end
end
2015-12-31 10:28:58 +08:00
private
2016-01-07 16:43:03 +08:00
#测验列表转换为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
2016-01-08 10:37:10 +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_class ) , l ( :excel_f_score ) , l ( :excel_commit_time ) ] )
2016-01-07 16:43:03 +08:00
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
2016-01-08 10:37:10 +08:00
sheet1 [ count_row , 5 ] = " "
sheet1 [ count_row , 6 ] = exercise . score
sheet1 [ count_row , 7 ] = format_time ( exercise . created_at )
2016-01-07 16:43:03 +08:00
count_row += 1
end
book . write xls_report
xls_report . string
end
2015-12-31 10:28:58 +08:00
# 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
2015-11-13 16:40:39 +08:00
end