2017-09-30 14:36:17 +08:00
#encoding: utf-8
2017-04-07 10:16:13 +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 , :update_question_num ,
2017-09-28 16:51:15 +08:00
:send_to_course , :get_student_uncomplete_question , :edit_question_score , :setting , :set_public ,
:ex_setting ]
2017-04-07 10:16:13 +08:00
before_filter :find_course , :only = > [ :index , :new , :create ]
include ExerciseHelper
def index
if @course . is_public == 0 && ! ( User . current . member_of_course? ( @course ) || User . current . admin? )
render_403
return
end
2017-09-28 16:51:15 +08:00
#remove_invalid_exercise(@course)
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
if @is_teacher
exercises = @course . exercises . order ( " created_at desc " )
2017-04-07 10:16:13 +08:00
else
2017-09-28 16:51:15 +08:00
exercises = @course . exercises . where ( " exercise_status <> 1 " ) . order ( " created_at desc " )
end
if params [ :type ]
@type = params [ :type ]
exercises = exercises . where ( :exercise_status = > params [ :type ] )
end
@search = params [ :search ] ? params [ :search ] . to_s . strip : " "
if params [ :search ]
exercises = exercises . where ( " exercise_name like '% #{ @search } %' " )
2017-04-07 10:16:13 +08:00
end
2017-09-28 16:51:15 +08:00
@exercises = paginateHelper exercises , 15 #分页
2017-04-07 10:16:13 +08:00
@left_nav_type = 8
respond_to do | format |
2017-09-28 16:51:15 +08:00
format . js
2017-04-07 10:16:13 +08:00
format . html
end
end
def show
unless User . current . member_of_course? ( @course ) || User . current . admin?
render_403
return
end
@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?
2017-09-30 14:36:17 +08:00
2017-04-07 10:16:13 +08:00
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
2017-09-29 18:18:38 +08:00
elsif @exercise_user . start_at . nil?
@exercise_user . update_attributes ( :start_at = > Time . now )
2017-04-07 10:16:13 +08:00
end
2017-09-30 14:36:17 +08:00
exercise_end = @exercise . end_time . nil? ? false : @exercise . end_time > Time . now
if @exercise . time == - 1
@can_edit_excercise = exercise_end && @exercise_user . commit_status == 0
else
@can_edit_excercise = ! has_commit_exercise? ( @exercise . id , User . current . id ) && exercise_end
end
2017-04-07 10:16:13 +08:00
#score = calculate_student_score(@exercise, User.current)
#@exercise_user.update_attributes(:objective_score => score, :score => (score + (@exercise_user.subjective_score > 0 ? @exercise_user.subjective_score : 0)))
2017-09-30 14:36:17 +08:00
else
@can_edit_excercise = false
2017-04-07 10:16:13 +08:00
end
# @percent = get_percent(@exercise,User.current)
2017-09-30 14:36:17 +08:00
#@exercise_questions = @exercise.exercise_questions
2017-04-07 10:16:13 +08:00
respond_to do | format |
2017-09-29 18:18:38 +08:00
format . html { render :layout = > 'base_edu' }
2017-04-07 10:16:13 +08:00
end
#end
end
def new
2017-09-28 16:51:15 +08:00
# 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 . new
respond_to do | format |
format . html { render :layout = > 'base_edu' }
2017-04-07 10:16:13 +08:00
end
end
def create
if params [ :exercise ]
2017-09-28 16:51:15 +08:00
exercise = Exercise . new
2017-04-07 10:16:13 +08:00
exercise . exercise_name = params [ :exercise ] [ :exercise_name ]
exercise . exercise_description = params [ :exercise ] [ :exercise_description ]
exercise . user_id = User . current . id
exercise . course_id = params [ :course_id ]
2017-09-29 18:18:38 +08:00
exercise . time = - 1
2017-04-07 10:16:13 +08:00
exercise . exercise_status = 1
if exercise . save
@exercise = exercise
respond_to do | format |
format . js
end
end
end
end
def edit
respond_to do | format |
2017-09-28 16:51:15 +08:00
format . html { render :layout = > 'base_edu' }
2017-09-29 10:20:09 +08:00
end
2017-04-07 10:16:13 +08:00
end
def update
@exercise . exercise_name = params [ :exercise ] [ :exercise_name ]
@exercise . exercise_description = params [ :exercise ] [ :exercise_description ]
2017-09-28 16:51:15 +08:00
2017-04-07 10:16:13 +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
2017-09-28 16:51:15 +08:00
redirect_to exercise_index_path ( :course_id = > @course . id )
end
end
def setting
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
@is_new = params [ :is_new ] ? true : false
respond_to do | format |
format . html { render :layout = > 'base_edu' }
end
end
def ex_setting
@exercise . publish_time = params [ :exercise_publish_time ] if params [ :exercise_publish_time ]
@exercise . end_time = params [ :exercise_end_time ] if params [ :exercise_end_time ]
2017-09-29 18:18:38 +08:00
@exercise . time = - 1
2017-09-28 16:51:15 +08:00
@exercise . question_random = params [ :question_random ] ? 1 : 0
@exercise . choice_random = params [ :choice_random ] ? 1 : 0
@exercise . score_open = params [ :score_open ] ? 1 : 0
@exercise . answer_open = params [ :answer_open ] ? 1 : 0
if @exercise . save
redirect_to student_exercise_list_exercise_path ( @exercise )
end
end
def set_public
if User . current . admin? || User . current . allowed_to? ( :as_teacher , @course )
@exercise . update_attributes ( :is_public = > true )
2017-04-07 10:16:13 +08:00
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 ,
2017-09-29 15:55:37 +08:00
:question_number = > @exercise . exercise_questions . count + 1 ,
2017-04-07 10:16:13 +08:00
: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
2017-09-30 16:10:07 +08:00
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 ]
2017-04-07 10:16:13 +08:00
question_option = {
:choice_position = > i ,
:choice_text = > answer
}
@exercise_questions . exercise_choices . new question_option
end
end
# 如果是插入的话, 那么从插入的这个id以后的question_num都将要+1
2017-09-29 15:55:37 +08:00
if params [ :quest_id ] != " 0 "
2017-04-07 10:16:13 +08:00
@is_insert = true
2017-09-29 15:55:37 +08:00
insert_que = ExerciseQuestion . find params [ :quest_id ]
if insert_que
@exercise . exercise_questions . where ( " question_number>? " , insert_que . question_number ) . update_all ( " question_number = question_number + 1 " )
# if @exercise_questions.question_type == 1
# ExerciseQuestion.where("question_number>?",params[:quest_num].to_i).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")
# elsif @exercise_questions.question_type == 3
# ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number + 1")
# else
# ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 4).update_all(" question_number = question_number + 1")
# end
# @exercise_question_num = params[:quest_num].to_i
@exercise_questions . question_number = insert_que . question_number + 1
2017-04-07 10:16:13 +08:00
end
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
2017-09-30 16:10:07 +08:00
standart_answer . answer_text = params [ :exercise_choice ] . values [ i - 1 ]
2017-04-07 10:16:13 +08:00
standart_answer . save
end
elsif @exercise_questions . question_type == 4
unless params [ :exercise_choice ] == " "
standart_answer = ExerciseStandardAnswer . new
standart_answer . exercise_question_id = @exercise_questions . id
standart_answer . answer_text = params [ :exercise_choice ]
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 ] )
elsif @exercise_questions . question_type == 2
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
elsif @exercise_question . question_type == 4
answer_standart = @exercise_question . exercise_standard_answers . empty? ? nil : @exercise_question . exercise_standard_answers . first
if params [ :exercise_choice ] == " " && ! answer_standart . nil?
answer_standart . destroy
elsif params [ :exercise_choice ] != " " && ! answer_standart . nil?
answer_standart . answer_text = params [ :exercise_choice ]
answer_standart . save
elsif params [ :exercise_choice ] != " " && answer_standart . nil?
standart_answer_option = {
:answer_text = > params [ :exercise_choice ]
}
@exercise_question . exercise_standard_answers . new standart_answer_option
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
@exercise = @exercise_question . exercise
respond_to do | format |
format . js
end
end
end
# 删除题目
def delete_exercise_question
@exercise_question = ExerciseQuestion . find params [ :exercise_question ]
@exercise = @exercise_question . exercise
2017-09-29 15:55:37 +08:00
ExerciseQuestion . where ( " question_number>? " , params [ :quest_num ] . to_i ) . update_all ( " question_number = question_number - 1 " )
# 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")
# elsif @exercise_question.question_type == 3
# ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number - 1")
# else
# ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 4).update_all(" question_number = question_number - 1")
# end
2017-04-07 10:16:13 +08:00
# @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 update_question_num
@exercise_question = ExerciseQuestion . find params [ :ques_id ]
exercise_questions = @exercise . exercise_questions
if @exercise_question
if params [ :opr ] == 'up' && @exercise_question . question_number > 1
2017-09-29 15:55:37 +08:00
@before_que = exercise_questions . where ( " question_number = #{ @exercise_question . question_number - 1 } " ) . first
2017-04-07 10:16:13 +08:00
if @before_que && @exercise_question . update_attribute ( 'question_number' , @exercise_question . question_number - 1 )
@before_que . update_attribute ( 'question_number' , @before_que . question_number + 1 )
end
elsif params [ :opr ] == 'down' && @exercise_question . question_number < exercise_questions . count
2017-09-29 15:55:37 +08:00
@after_que = exercise_questions . where ( " question_number = #{ @exercise_question . question_number + 1 } " ) . first
2017-04-07 10:16:13 +08:00
if @after_que && @exercise_question . update_attribute ( 'question_number' , @exercise_question . question_number + 1 )
@after_que . update_attribute ( 'question_number' , @after_que . question_number - 1 )
end
end
respond_to do | format |
format . js
end
end
end
# 发送试卷
def send_to_course
params [ :course_ids ] . each do | course |
option = {
:exercise_name = > @exercise . exercise_name ,
:exercise_status = > 1 ,
:user_id = > User . current . id ,
:show_result = > 1 ,
:course_id = > course . to_i ,
: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
# 搜索当前用户任教的班级(不包含该试卷所在的班级)
def search_courses
@user = User . current
if ! params [ :name ] . nil?
search = " % #{ params [ :name ] . to_s . strip . downcase } % "
@courses = @user . courses . not_deleted . where ( " courses.id != #{ params [ :course ] . to_i } and ( #{ Course . table_name } .id = #{ params [ :search ] . to_i } or #{ Course . table_name } .name like :p) " , :p = > search ) . reorder ( " created_at desc " ) . select { | course | @user . allowed_to? ( :as_teacher , course ) }
else
@courses = @user . courses . not_deleted . where ( " courses.id != #{ params [ :course ] . to_i } " ) . reorder ( " created_at desc " ) . select { | course | @user . allowed_to? ( :as_teacher , course ) }
end
respond_to do | format |
format . js
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
2017-09-29 10:20:09 +08:00
@order , @b_sort , @name , @group , @comment , @status = params [ :order ] || " end_at " , params [ :sort ] || " desc " , params [ :name ] . to_s . strip || " " , params [ :ex_group ] , params [ :ex_comment ] , params [ :ex_status ]
2017-04-07 10:16:13 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
2017-09-29 10:20:09 +08:00
2017-04-07 10:16:13 +08:00
student_id = @course . student . blank? ? " (-1) " : " ( " + @course . student . map { | student | student . student_id } . join ( " , " ) + " ) "
2017-09-29 10:20:09 +08:00
if @group
group_students = @course . members . where ( :course_group_id = > @group ) . joins ( " join users on members.user_id = users.id " ) . select { | m | m . roles . to_s . include? ( " Student " ) }
if group_students . empty?
student_in_group = '(-1)'
2017-04-07 10:16:13 +08:00
else
2017-09-29 10:20:09 +08:00
student_in_group = '(' + group_students . map { | member | member . user_id } . join ( ',' ) + ')'
2017-04-07 10:16:13 +08:00
end
2017-09-29 10:20:09 +08:00
if @is_teacher || ( ! @exercise . exercise_users . where ( :user_id = > User . current . id , :commit_status = > 1 ) . empty? && @exercise . score_open && @exercise . end_time < = Time . now )
@exercise_users_list = @exercise . exercise_users . where ( " user_id in #{ student_in_group } " ) . order ( " #{ @order } #{ @b_sort } " )
2017-04-07 10:16:13 +08:00
@show_all = true ;
2017-09-29 10:20:09 +08:00
elsif ! @exercise . exercise_users . where ( :user_id = > User . current . id , :commit_status = > 1 ) . empty?
@exercise_users_list = @exercise . exercise_users . where ( " user_id = ? and user_id in #{ student_in_group } " , User . current . id )
2017-04-07 10:16:13 +08:00
else
@exercise_users_list = [ ]
end
else
2017-09-29 10:20:09 +08:00
if @is_teacher || ( ! @exercise . exercise_users . where ( :user_id = > User . current . id , :commit_status = > 1 ) . empty? && @exercise . score_open && @exercise . end_time < = Time . now )
@exercise_users_list = @exercise . exercise_users . where ( " user_id in #{ student_id } " ) . order ( " #{ @order } #{ @b_sort } " )
2017-04-07 10:16:13 +08:00
@show_all = true ;
2017-09-30 14:36:17 +08:00
elsif User . current . member_of_course? ( @course )
2017-09-29 10:20:09 +08:00
@exercise_users_list = @exercise . exercise_users . where ( " user_id = ? and user_id in #{ student_id } " , User . current . id )
2017-04-07 10:16:13 +08:00
else
@exercise_users_list = [ ]
end
end
2017-09-29 10:20:09 +08:00
unless @comment . blank?
if @comment . include? ( '0' )
@exercise_users_list = @exercise_users_list . where ( :subjective_score = > - 1 )
else
@exercise_users_list = @exercise_users_list . where ( " subjective_score != -1 " )
end
end
unless @status . blank?
@exercise_users_list = @exercise_users_list . where ( :commit_status = > @status )
end
@exercise_users_list = search_exercise_member @exercise_users_list , @name
@score = @b_sort == " desc " ? " asc " : " desc "
@exercise_count = @exercise_users_list . count
@has_commit_count = @exercise . exercise_users . where ( :commit_status = > 1 ) . count
@no_group_count = @course . members . where ( :course_group_id = > 0 ) . select { | m | m . roles . to_s . include? ( " Student " ) } . count
@limit = 50
@is_remote = true
@page = ( params [ 'page' ] || 1 ) . to_i
@exercise_pages = Paginator . new @exercise_count , @limit , @page
@offset || = @exercise_pages . offset
@exercise_users_list = paginateHelper @exercise_users_list , @limit
2017-04-07 10:16:13 +08:00
respond_to do | format |
format . js
2017-09-29 10:20:09 +08:00
format . html { render :layout = > 'base_edu' }
2017-04-07 10:16:13 +08:00
format . xls {
2017-09-29 10:20:09 +08:00
filename = " #{ @course . teacher . lastname . to_s + @course . teacher . firstname } _ #{ @course . name } _ #{ @exercise . exercise_name } #{ l ( :excel_exercise_list ) } .xls "
2017-04-07 10:16:13 +08:00
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
is_answer = User . current . exercise_answer . where ( :exercise_question_id = > params [ :exercise_question_id ] . to_i ) . count > 0
@percent = get_percent ( @exercise , User . current )
render :json = > { :text = > " ok " , :complete = > complete , :percent = > format ( " %.2f " , @percent ) , :is_answer = > is_answer }
else
render :json = > { :text = > " failure " }
end
else
#pv不为空, 则当前选项之前已被选择, 再次点击则是不再选择该项, 故删除该答案
if ea . delete
is_answer = User . current . exercise_answer . where ( :exercise_question_id = > params [ :exercise_question_id ] . to_i ) . count > 0
@percent = get_percent ( @exercise , User . current )
render :json = > { :text = > " false " , :percent = > format ( " %.2f " , @percent ) , :is_answer = > is_answer }
else
render :json = > { :text = > " failure " }
end
end
elsif eq . question_type == 3 || eq . question_type == 4
#单行文本,多行文本题
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(: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
# redirect_to exercise_url(@exercise)
# return
# end
# redirect_to exercise_url(@exercise)
# REDO: 提示提交成功
else
# 更新提交状态
cur_exercise_user = ExerciseUser . where ( " user_id =? and exercise_id=? " , User . current , @exercise . id ) . first
2017-09-30 14:36:17 +08:00
cur_exercise_user . update_attributes ( :status = > 1 , :commit_status = > 1 , :end_at = > Time . now )
#if @exercise.time && @exercise.time != -1
2017-04-07 10:16:13 +08:00
score = calculate_student_score ( @exercise , User . current )
2017-09-30 14:36:17 +08:00
cur_exercise_user . update_attributes ( :objective_score = > score , :score = > score + ( cur_exercise_user . subjective_score > 0 ? cur_exercise_user . subjective_score : 0 ) )
#end
2017-04-07 10:16:13 +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 get_student_uncomplete_question
time_limit = @exercise . time == - 1 || @exercise . time . nil?
uncomplete_count = get_uncomplete_question ( @exercise , User . current ) . count
render :json = > { :time_limit = > time_limit , :uncomplete_count = > uncomplete_count }
end
# 主观题打分
def edit_question_score
exercise_user = @exercise . exercise_users . where ( :user_id = > params [ :user_id ] . to_i ) . first
exercise_answer = ExerciseAnswer . where ( :user_id = > params [ :user_id ] . to_i , :exercise_question_id = > params [ :exercise_question_id ] . to_i ) . first
exercise_question = ExerciseQuestion . where ( :id = > params [ :exercise_question_id ] . to_i ) . first
if exercise_user && exercise_answer && exercise_question
score = params [ :score ] . to_i
unless score > exercise_question . question_score || score < 0
exercise_answer . update_attributes ( :score = > score )
exercise_user . update_attributes ( :subjective_score = > calculate_subjective_score ( @exercise , exercise_user . user ) )
exercise_user . update_attributes ( :score = > ( ( exercise_user . objective_score > 0 ? exercise_user . objective_score : 0 ) + ( exercise_user . subjective_score > 0 ? exercise_user . subjective_score : 0 ) ) )
render :json = > { :status = > 1 , :score = > score , :total_score = > exercise_user . score }
else
render :json = > { :status = > 2 }
end
else
render :json = > { :status = > 0 }
end
end
#查看学生的答卷情况
def show_student_result
2017-09-30 14:36:17 +08:00
@is_teacher = User . current . allowed_to? ( :as_teacher , @course ) || User . current . admin?
if @is_teacher || ( User . current . member_of_course? ( @exercise . course ) && @exercise . exercise_status > 2 )
@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
respond_to do | format |
format . html { render :layout = > 'base_edu' }
end
else
render_403
2017-04-07 10:16:13 +08:00
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 calculate_subjective_score exercise , user
score = 0
exercise_questions = exercise . exercise_questions . where ( :question_type = > 4 )
exercise_answers = user . exercise_answer . where ( :exercise_question_id = > exercise_questions . map ( & :id ) )
exercise_answers . each do | ea |
if ea . score != - 1
score += ea . score
end
end
score
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_objective_score ) , l ( :excel_subjective_score ) , l ( :excel_f_score ) , l ( :excel_answer_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 ] = exercise . objective_score == - 1 ? " 0.0 " : format ( " %.1f " , exercise . objective_score )
sheet1 [ count_row , 6 ] = exercise . subjective_score == - 1 ? " 0.0 " : format ( " %.1f " , exercise . subjective_score )
sheet1 [ count_row , 7 ] = exercise . score
sheet1 [ count_row , 8 ] = exercise . commit_status == 0 ? l ( :excel_no_answer ) : format_time ( exercise . created_at )
count_row += 1
end
book . write xls_report
xls_report . string
end
#根据条件过滤作业结果
def search_exercise_member exercises , name
if name == " "
select_exercises = exercises
else
name = name . downcase
select_exercises = exercises . select { | exercise |
2017-09-29 10:20:09 +08:00
exercise . user . user_extensions [ :student_id ] . to_s . downcase . include? ( name ) || ( exercise . user [ :lastname ] . to_s . downcase + exercise . user [ :firstname ] . to_s . downcase ) . include? ( name )
2017-04-07 10:16:13 +08:00
}
end
select_exercises
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