You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

exercise_controller.rb 34 kB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
10 years ago
​
10 years ago
​
​
​
10 years ago
10 years ago
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. class ExerciseController < ApplicationController
  2. layout "base_courses"
  3. before_filter :find_exercise_and_course, :only => [:create_exercise_question, :edit, :update, :show, :destroy,
  4. :commit_exercise, :commit_answer,:publish_exercise,:republish_exercise,
  5. :show_student_result,:student_exercise_list]
  6. before_filter :find_course, :only => [:index,:new,:create]
  7. include ExerciseHelper
  8. def index
  9. publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
  10. publish_exercises.each do |exercise|
  11. exercise.update_column('exercise_status', 2)
  12. course = exercise.course
  13. course.members.each do |m|
  14. exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  15. end
  16. end
  17. if @course.is_public == 0 && !(User.current.member_of_course?(@course)||User.current.admin?)
  18. render_403
  19. return
  20. end
  21. remove_invalid_exercise(@course)
  22. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  23. if @is_teacher || User.current.admin?
  24. exercises = @course.exercises.order("created_at asc")
  25. else
  26. exercises = @course.exercises.where("exercise_status <> 1").order("created_at asc")
  27. end
  28. @exercises = paginateHelper exercises,20 #分页
  29. @left_nav_type = 8
  30. respond_to do |format|
  31. format.html
  32. end
  33. end
  34. def show
  35. publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
  36. publish_exercises.each do |exercise|
  37. exercise.update_column('exercise_status', 2)
  38. course = exercise.course
  39. course.members.each do |m|
  40. exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  41. end
  42. end
  43. unless User.current.member_of_course?(@course) || User.current.admin?
  44. render_403
  45. return
  46. end
  47. @exercise = Exercise.find params[:id]
  48. @exercise.course_messages.each do |message|
  49. if User.current.id == message.user_id && message.viewed == 0
  50. message.update_attributes(:viewed => true) if message.viewed == 0
  51. end
  52. end
  53. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  54. exercise_end = @exercise.end_time > Time.now
  55. if @exercise.time == -1
  56. @can_edit_excercise = exercise_end
  57. else
  58. @can_edit_excercise = !has_commit_exercise?(@exercise.id,User.current.id)&& exercise_end
  59. end
  60. unless @is_teacher
  61. @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
  62. if @exercise_user.nil?
  63. eu = ExerciseUser.create(:user_id => User.current.id, :exercise_id => @exercise.id, :start_at => Time.now, :status => false)
  64. @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
  65. end
  66. score = calculate_student_score(@exercise, User.current)
  67. @exercise_user.update_attributes(:score => score)
  68. end
  69. # @percent = get_percent(@exercise,User.current)
  70. @exercise_questions = @exercise.exercise_questions
  71. @left_nav_type = 8
  72. respond_to do |format|
  73. format.html {render :layout => 'base_courses'}
  74. end
  75. #end
  76. end
  77. def new
  78. option = {
  79. :exercise_name => "",
  80. :course_id => @course.id,
  81. :exercise_status => 1,
  82. :user_id => User.current.id,
  83. :time => "",
  84. :end_time => "",
  85. :publish_time => "",
  86. :exercise_description => "",
  87. :show_result => 1
  88. }
  89. @exercise = Exercise.create option
  90. if @exercise
  91. redirect_to edit_exercise_url @exercise.id
  92. end
  93. end
  94. def create
  95. if params[:exercise]
  96. exercise = Exercise.find(params[:exercise_id]) if params[:exercise_id]
  97. exercise ||= Exercise.new
  98. exercise.exercise_name = params[:exercise][:exercise_name]
  99. exercise.exercise_description = params[:exercise][:exercise_description]
  100. exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
  101. exercise.publish_time = params[:exercise][:publish_time]
  102. exercise.user_id = User.current.id
  103. exercise.time = params[:exercise][:time]
  104. exercise.course_id = params[:course_id]
  105. exercise.exercise_status = 1
  106. if exercise.save
  107. @exercise = exercise
  108. respond_to do |format|
  109. format.js
  110. end
  111. end
  112. end
  113. end
  114. def edit
  115. @left_nav_type = 8
  116. respond_to do |format|
  117. format.html{render :layout => 'base_courses'}
  118. end
  119. end
  120. def update
  121. @exercise.exercise_name = params[:exercise][:exercise_name]
  122. @exercise.exercise_description = params[:exercise][:exercise_description]
  123. @exercise.time = params[:exercise][:time].blank? ? -1 : params[:exercise][:time]
  124. @exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
  125. @exercise.publish_time = params[:exercise][:publish_time]
  126. @exercise.show_result = params[:exercise][:show_result].blank? ? 1 : params[:exercise][:show_result]
  127. if @exercise.save
  128. respond_to do |format|
  129. format.js
  130. end
  131. else
  132. render_404
  133. end
  134. end
  135. def destroy
  136. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  137. if @exercise && @exercise.destroy
  138. if @is_teacher
  139. exercises = Exercise.where("course_id =?", @course.id)
  140. else
  141. exercises = Exercise.where("course_id =? and exercise_status =?", @course.id, 2)
  142. end
  143. @exercises = paginateHelper exercises,20 #分页
  144. respond_to do |format|
  145. format.js
  146. end
  147. end
  148. end
  149. # 统计结果
  150. def statistics_result
  151. @exercise = Exercise.find(params[:id])
  152. exercise_questions = @exercise.exercise_questions
  153. @exercise_questions = paginateHelper exercise_questions, 5
  154. @left_nav_type = 8
  155. respond_to do |format|
  156. format.html{render :layout => 'base_courses'}
  157. end
  158. end
  159. # 添加题目
  160. # question_type 1:单选 2:多选 3:填空题
  161. def create_exercise_question
  162. question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
  163. option = {
  164. :question_title => question_title,
  165. :question_type => params[:question_type] || 1,
  166. :question_number => params[:question_type] == "1"? @exercise.exercise_questions.where("question_type = 1").count + 1 :
  167. (params[:question_type] == "2" ? (@exercise.exercise_questions.where("question_type = 2").count + 1) :
  168. @exercise.exercise_questions.where("question_type = 3").count + 1),
  169. :question_score => params[:question_score]
  170. }
  171. @exercise_questions = @exercise.exercise_questions.new option
  172. # params[:question_answer] 题目选项
  173. if params[:question_answer]
  174. for i in 1..params[:question_answer].count
  175. 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]
  176. question_option = {
  177. :choice_position => i,
  178. :choice_text => answer
  179. }
  180. @exercise_questions.exercise_choices.new question_option
  181. end
  182. end
  183. # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1
  184. if params[:quest_id]
  185. @is_insert = true
  186. if @exercise_questions.question_type == 1
  187. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number + 1")
  188. #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
  189. elsif @exercise_questions.question_type == 2
  190. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number + 1")
  191. else
  192. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number + 1")
  193. end
  194. # @exercise_question_num = params[:quest_num].to_i
  195. @exercise_questions.question_number = params[:quest_num].to_i + 1
  196. end
  197. if @exercise_questions.save
  198. # params[:exercise_choice] 标准答案参数
  199. # 问答题标准答案有三个,单独处理
  200. if @exercise_questions.question_type == 3
  201. for i in 1..params[:exercise_choice].count
  202. standart_answer = ExerciseStandardAnswer.new
  203. standart_answer.exercise_question_id = @exercise_questions.id
  204. standart_answer.answer_text = params[:exercise_choice].values[i-1]
  205. standart_answer.save
  206. end
  207. else
  208. standart_answer = ExerciseStandardAnswer.new
  209. standart_answer.exercise_question_id = @exercise_questions.id
  210. if @exercise_questions.question_type == 1
  211. standart_answer.exercise_choice_id = sigle_selection_standard_answer(params[:exercise_choice])
  212. else
  213. standart_answer.exercise_choice_id = multiselect_standard_answer(params[:exercise_choice])
  214. end
  215. standart_answer.save
  216. end
  217. respond_to do |format|
  218. format.js
  219. end
  220. end
  221. end
  222. # 修改题目
  223. # params[:exercise_question] The id of exercise_question
  224. # params[:question_answer] eg:A、B、C选项
  225. def update_exercise_question
  226. @exercise_question = ExerciseQuestion.find params[:exercise_question]
  227. @exercise_question.question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
  228. @exercise_question.question_score = params[:question_score]
  229. # 处理选项:如果选了某个选项,那么则要删除之前的选项
  230. if params[:question_answer]
  231. @exercise_question.exercise_choices.each do |answer|
  232. answer.destroy unless params[:question_answer].keys.include? answer.id.to_s
  233. end
  234. for i in 1..params[:question_answer].count
  235. question = @exercise_question.exercise_choices.find_by_id params[:question_answer].keys[i-1]
  236. 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]
  237. if question
  238. question.choice_position = i
  239. question.choice_text = answer
  240. question.save
  241. else
  242. question_option = {
  243. :choice_position => i,
  244. :choice_text => answer
  245. }
  246. @exercise_question.exercise_choices.new question_option
  247. end
  248. end
  249. end
  250. # 更新标准答案
  251. if params[:exercise_choice]
  252. if @exercise_question.question_type == 3
  253. # 删除不合理的选项
  254. @exercise_question.exercise_standard_answers.each do |answer|
  255. answer.destroy unless params[:exercise_choice].keys.include? answer.id.to_s
  256. end
  257. for i in 1..params[:exercise_choice].count
  258. # 找到对应的标准答案
  259. question_standart = @exercise_question.exercise_standard_answers.find_by_id params[:exercise_choice].keys[i-1]
  260. # 标准答案值
  261. 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]
  262. if question_standart
  263. question_standart.answer_text = answer_standart
  264. question_standart.save
  265. else
  266. standart_answer_option = {
  267. :answer_text => answer_standart
  268. }
  269. @exercise_question.exercise_standard_answers.new standart_answer_option
  270. end
  271. end
  272. else
  273. answer_standart = @exercise_question.exercise_standard_answers.first
  274. answer_standart.exercise_choice_id = @exercise_question.question_type == 1 ? sigle_selection_standard_answer(params[:exercise_choice]) : multiselect_standard_answer(params[:exercise_choice])
  275. answer_standart.save
  276. end
  277. @exercise_question.save
  278. respond_to do |format|
  279. format.js
  280. end
  281. end
  282. end
  283. # 删除题目
  284. def delete_exercise_question
  285. @exercise_question = ExerciseQuestion.find params[:exercise_question]
  286. @exercise = @exercise_question.exercise
  287. if @exercise_question.question_type == 1
  288. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number - 1")
  289. #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
  290. elsif @exercise_question.question_type == 2
  291. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number - 1")
  292. else
  293. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number - 1")
  294. end
  295. # @exercise_question_num = params[:quest_num].to_i
  296. # @exercise_questions.question_number = params[:quest_num].to_i - 1
  297. #
  298. # exercise_questions = @exercise.exercise_questions.where("question_number > #{@exercise_question.question_number}")
  299. # exercise_questions.each do |question|
  300. # question.question_number -= 1
  301. # question.save
  302. # end
  303. if @exercise_question && @exercise_question.destroy
  304. respond_to do |format|
  305. format.js
  306. end
  307. end
  308. end
  309. # 发布试卷
  310. def publish_exercise
  311. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  312. @index = params[:index]
  313. @exercise.exercise_status = 2
  314. @exercise.publish_time = Time.now
  315. if @exercise.save
  316. @exercise.course.members.each do |m|
  317. @exercise.course_messages << CourseMessage.create(:user_id =>m.user_id, :course_id => @exercise.course.id, :viewed => false,:status=>2)
  318. end
  319. #redirect_to exercise_index_url(:course_id=> @course.id)
  320. respond_to do |format|
  321. format.js
  322. end
  323. end
  324. end
  325. # 重新发布试卷
  326. # 重新发布的时候会删除所有的答题
  327. def republish_exercise
  328. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  329. @index = params[:index]
  330. @exercise.exercise_questions.each do |exercise_question|
  331. exercise_question.exercise_answers.destroy_all
  332. end
  333. @exercise.course_messages.destroy_all
  334. @exercise.exercise_users.destroy_all
  335. @exercise.exercise_status = 1
  336. @exercise.publish_time = nil
  337. @exercise.save
  338. respond_to do |format|
  339. format.js
  340. end
  341. end
  342. def student_exercise_list
  343. =begin
  344. if @exercise.end_time <= Time.now
  345. @course.student.each do |student|
  346. if ExerciseUser.where("user_id = ? && exercise_id = ?",student.student_id,@exercise.id).empty?
  347. ExerciseUser.create(:user_id => student.student_id, :exercise_id => @exercise.id, :start_at => @exercise.end_time, :status => true,:score=>0)
  348. end
  349. s_score = calculate_student_score(@exercise, student.student)
  350. exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", student.student_id, @exercise.id).first
  351. exercise_user.update_attributes(:score => s_score)
  352. end
  353. end
  354. =end
  355. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  356. @all_exercises = @course.exercises.where("exercise_status > 1").order("created_at desc")
  357. student_id = @course.student.blank? ? "(-1)" : "(" + @course.student.map{|student| student.student_id}.join(",") + ")"
  358. @exercise_count = @exercise.exercise_users.where("score is not NULL and user_id in #{student_id}").count
  359. if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id} and user_id in #{student_id}").empty? && @exercise.end_time <= Time.now)
  360. @exercise_users_list = @exercise.exercise_users.where("score is not NULL and user_id in #{student_id}")
  361. @show_all = true;
  362. elsif !@exercise.exercise_users.where("user_id = #{User.current.id} and user_id in #{student_id}").empty? && @exercise.end_time > Time.now
  363. @exercise_users_list = @exercise.exercise_users.where("user_id = ? and score is not NULL and user_id in #{student_id}",User.current.id)
  364. else
  365. @exercise_users_list = []
  366. end
  367. @left_nav_type = 8
  368. respond_to do |format|
  369. format.html
  370. format.xls {
  371. 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"
  372. send_data(exercise_to_xls(@exercise_users_list), :type => "text/excel;charset=utf-8; header=present",
  373. :filename => filename_for_content_disposition(filename))
  374. }
  375. end
  376. end
  377. # 学生提交答卷,选中答案的过程中提交
  378. def commit_answer
  379. eq = ExerciseQuestion.find(params[:exercise_question_id])
  380. # 已提交过的且是限时的则不允许答题
  381. if (has_commit_exercise?(@exercise.id,User.current.id) && (!User.current.admin?) && @exercise.time != -1) || @exercise.end_time < Time.now
  382. render :json => {:text => "failure"}
  383. return
  384. end
  385. if eq.question_type == 1
  386. # 单选题
  387. ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id],User.current.id)
  388. if ea.nil?
  389. # 尚未答该题,添加答案
  390. ea = ExerciseAnswer.new
  391. ea.user_id = User.current.id
  392. ea.exercise_question_id = params[:exercise_question_id]
  393. end
  394. #修改该题对应答案
  395. ea.exercise_choice_id = params[:exercise_choice_id]
  396. if ea.save
  397. # 保存成功返回成功信息及当前以答题百分比
  398. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  399. if uncomplete_question.count < 1
  400. complete = 1;
  401. else
  402. complete = 0;
  403. end
  404. @percent = get_percent(@exercise,User.current)
  405. render :json => {:text => "ok" ,:complete => complete,:percent => format("%.2f" ,@percent)}
  406. else
  407. #返回失败信息
  408. render :json => {:text => "failure"}
  409. end
  410. elsif eq.question_type == 2
  411. #多选题
  412. ea = ExerciseAnswer.find_by_exercise_choice_id_and_user_id(params[:exercise_choice_id],User.current.id)
  413. if ea.nil?
  414. #尚未答该题,添加答案
  415. ea = ExerciseAnswer.new
  416. ea.user_id = User.current.id
  417. ea.exercise_question_id = params[:exercise_question_id]
  418. ea.exercise_choice_id = params[:exercise_choice_id]
  419. if ea.save
  420. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  421. if uncomplete_question.count < 1
  422. complete = 1;
  423. else
  424. complete = 0;
  425. end
  426. @percent = get_percent(@exercise,User.current)
  427. render :json => {:text => "ok",:complete => complete,:percent => format("%.2f" ,@percent)}
  428. else
  429. render :json => {:text => "failure"}
  430. end
  431. else
  432. #pv不为空,则当前选项之前已被选择,再次点击则是不再选择该项,故删除该答案
  433. if ea.delete
  434. @percent = get_percent(@exercise, User.current)
  435. render :json => {:text => "false" ,:percent => format("%.2f" , @percent)}
  436. else
  437. render :json => {:text => "failure"}
  438. end
  439. end
  440. elsif eq.question_type == 3
  441. #单行文本,多行文本题
  442. ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id], User.current.id)
  443. if ea.nil?
  444. # ea为空之前尚未答题,添加答案
  445. if params[:answer_text].nil? || params[:answer_text].blank?
  446. #用户提交空答案,视作不作答
  447. @percent = get_percent(@exercise,User.current)
  448. render :json => {:text => "",:percent => format("%.2f", @percent)}
  449. else
  450. #添加答案
  451. ea = ExerciseAnswer.new
  452. ea.user_id = User.current.id
  453. ea.exercise_question_id = params[:exercise_question_id]
  454. ea.answer_text = params[:answer_text]
  455. if ea.save
  456. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  457. if uncomplete_question.count < 1
  458. complete = 1;
  459. else
  460. complete = 0;
  461. end
  462. @percent = get_percent(@exercise,User.current)
  463. render :json => {:text => ea.answer_text,:complete => complete,:percent => format("%.2f",@percent)}
  464. else
  465. render :json => {:text => "failure"}
  466. end
  467. end
  468. else
  469. # ea不为空说明用户之前已作答
  470. if params[:answer_text].nil? || params[:answer_text].blank?
  471. # 用户提交空答案,视为删除答案
  472. if ea.delete
  473. @percent = get_percent(@exercise,User.current)
  474. render :json => {:text => "",:percent => format("%.2f", @percent)}
  475. else
  476. render :json => {:text => "failure"}
  477. end
  478. else
  479. #用户修改答案
  480. ea.answer_text = params[:answer_text]
  481. if ea.save
  482. @percent = get_percent(@exercise,User.current)
  483. render :json => {:text => ea.answer_text,:percent => format("%.2f", @percent)}
  484. else
  485. render :json => {:text => "failure"}
  486. end
  487. end
  488. end
  489. else
  490. render :json => {:text => "failure"}
  491. end
  492. end
  493. # 提交问卷
  494. def commit_exercise
  495. # 老师不需要提交
  496. if User.current.allowed_to?(:as_teacher,@course)
  497. if @exercise.publish_time.nil? || @exercise.publish_time <= Time.now
  498. @exercise.update_attributes(:show_result => params[:show_result])
  499. @exercise.update_attributes(:exercise_status => 2)
  500. @exercise.update_attributes(:publish_time => Time.now)
  501. course = @exercise.course
  502. course.members.each do |m|
  503. @exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  504. end
  505. redirect_to exercise_url(@exercise)
  506. return
  507. elsif @exercise.publish_time > Time.now
  508. @exercise.update_attributes(:show_result => params[:show_result])
  509. redirect_to exercise_url(@exercise)
  510. return
  511. end
  512. @exercise.update_attributes(:show_result => params[:show_result])
  513. redirect_to exercise_url(@exercise)
  514. # REDO: 提示提交成功
  515. else
  516. # 更新提交状态
  517. cur_exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", User.current, @exercise.id).first
  518. cur_exercise_user.update_attributes(:status => 1, :commit_status => 1)
  519. # 答题过程中需要统计完成量
  520. @uncomplete_question = get_uncomplete_question(@exercise, User.current)
  521. # 获取改学生的考试得分
  522. @score = calculate_student_score(@exercise, User.current)
  523. # @score = 100
  524. if @uncomplete_question.count < 1
  525. # 查看是否有已提交记录
  526. cur_exercise_user.score = @score
  527. if cur_exercise_user.save
  528. #redirect_to poll_index_path(:polls_group_id => @course.id,:polls_type => 'Course')
  529. @status = 0 #提交成功
  530. else
  531. @status = 2 #未知错误
  532. end
  533. else
  534. @status = 1 #有未做得必答题
  535. end
  536. @save = params[:save].to_i if params[:save]
  537. respond_to do |format|
  538. format.js
  539. end
  540. end
  541. end
  542. #查看学生的答卷情况
  543. def show_student_result
  544. @user = User.find params[:user_id]
  545. @can_edit_excercise = false
  546. @exercise_questions = @exercise.exercise_questions
  547. score = calculate_student_score(@exercise, @user)
  548. eu = get_exercise_user(@exercise.id, @user.id)
  549. eu.update_attributes(:score => score)
  550. @exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", @user.id, @exercise.id).first
  551. @left_nav_type = 8
  552. respond_to do |format|
  553. format.html {render :layout => 'base_courses'}
  554. end
  555. end
  556. # 计算学生得分
  557. def calculate_student_score(exercise, user)
  558. score = 0
  559. score1 = 0
  560. score2 = 0
  561. score3 = 0
  562. exercise_qustions = exercise.exercise_questions
  563. exercise_qustions.each do |question|
  564. answer = get_user_answer(question, user)
  565. standard_answer = get_user_standard_answer(question, user)
  566. unless answer.empty?
  567. # 问答题有多个答案
  568. if question.question_type == 3 && !standard_answer.empty?
  569. if standard_answer.include?(answer.first.answer_text)
  570. score1 = score1+ question.question_score unless question.question_score.nil?
  571. end
  572. elsif question.question_type == 1 && !standard_answer.nil?
  573. if answer.first.exercise_choice.choice_position == standard_answer.exercise_choice_id
  574. score2 = score2 + question.question_score unless question.question_score.nil?
  575. end
  576. elsif question.question_type == 2 && !standard_answer.nil?
  577. arr = get_mulscore(question, user)
  578. if arr.to_i == standard_answer.exercise_choice_id
  579. score3 = score3 + question.question_score unless question.question_score.nil?
  580. end
  581. # ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
  582. # arr = []
  583. # ecs.each do |ec|
  584. # arr << ec.exercise_choice.choice_position
  585. # end
  586. # arr.sort
  587. # arr = arr.join("")
  588. # if arr.to_i == standard_answer.exercise_choice_id
  589. # score3 = score + question.question_score unless question.question_score.nil?
  590. # end
  591. end
  592. end
  593. end
  594. score = score1 + score2 + score3
  595. end
  596. #导入试卷的弹框
  597. def other_exercise
  598. # 查作者是我,或者作者是当前课程的老师,且不在当前课程内的试卷 进行导入
  599. @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
  600. @r_sort = @b_sort == "desc" ? "asc" : "desc"
  601. courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
  602. course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
  603. #none_courses = User.current.courses.where("is_delete = 1 or #{Course.table_name}.id = #{params[:course_id].to_i}")
  604. #none_course_ids = none_courses.empty? ? "(-1)" : "(" + none_courses.map { |course| course.id}.join(',') + ")"
  605. @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}")
  606. @course_id = params[:course_id]
  607. @is_remote = true
  608. @ex_count = @exercises.count
  609. @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
  610. @offset ||= @ex_pages.offset
  611. @exercises = paginateHelper @exercises,10
  612. respond_to do |format|
  613. format.js
  614. end
  615. end
  616. #搜索导入页面的试卷
  617. def search_exercises
  618. @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
  619. @r_sort = @b_sort == "desc" ? "asc" : "desc"
  620. search = params[:name].to_s.strip.downcase
  621. courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
  622. course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
  623. @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}")
  624. @is_remote = true
  625. @ex_count = @exercises.count
  626. @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
  627. @offset ||= @ex_pages.offset
  628. @exercises = paginateHelper @exercises,10
  629. @course_id = params[:course_id]
  630. respond_to do |format|
  631. format.js
  632. end
  633. end
  634. #将选择的试卷导入到班级
  635. def import_other_exercise
  636. course_id = params[:course_id]
  637. @course = Course.find(course_id)
  638. params[:exercise_id].each_with_index do |ex,i|
  639. exercise = Exercise.find(ex)
  640. option = {
  641. :exercise_name => exercise.exercise_name,
  642. :exercise_status => 1,
  643. :user_id => User.current.id,
  644. :show_result => 1,
  645. :course_id => @course.id,
  646. :time => exercise.time,
  647. :exercise_description => exercise.exercise_description
  648. }
  649. @exercise = Exercise.create option
  650. exercise.exercise_questions.each do |q|
  651. option = {
  652. :question_title => q[:question_title],
  653. :question_type => q[:question_type] || 1,
  654. :question_number => q[:question_number],
  655. :question_score => q[:question_score]
  656. }
  657. @exercise_question = @exercise.exercise_questions.new option
  658. for i in 1..q.exercise_choices.count
  659. choice_option = {
  660. :choice_position => i,
  661. :choice_text => q.exercise_choices[i-1][:choice_text]
  662. }
  663. @exercise_question.exercise_choices.new choice_option
  664. end
  665. for i in 1..q.exercise_standard_answers.count
  666. standard_answer_option = {
  667. :exercise_choice_id => q.exercise_standard_answers[i-1][:exercise_choice_id],
  668. :answer_text => q.exercise_standard_answers[i-1][:answer_text]
  669. }
  670. @exercise_question.exercise_standard_answers.new standard_answer_option
  671. end
  672. end
  673. @exercise.save
  674. end
  675. respond_to do |format|
  676. format.js
  677. end
  678. end
  679. private
  680. #测验列表转换为excel
  681. def exercise_to_xls items
  682. xls_report = StringIO.new
  683. book = Spreadsheet::Workbook.new
  684. sheet1 = book.create_worksheet :name => "exercise"
  685. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  686. sheet1.row(0).default_format = blue
  687. 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)])
  688. count_row = 1
  689. items.each do |exercise|
  690. sheet1[count_row,0]=exercise.user.id
  691. sheet1[count_row,1] = exercise.user.lastname.to_s + exercise.user.firstname.to_s
  692. sheet1[count_row,2] = exercise.user.login
  693. sheet1[count_row,3] = exercise.user.user_extensions.student_id
  694. sheet1[count_row,4] = exercise.user.mail
  695. sheet1[count_row,5] = ""
  696. sheet1[count_row,6] = exercise.score
  697. sheet1[count_row,7] = format_time(exercise.created_at)
  698. count_row += 1
  699. end
  700. book.write xls_report
  701. xls_report.string
  702. end
  703. # ExerciseUser记录用户是否已提交问卷有对应的记录则已提交,没有则新建一个
  704. def get_exercise_user exercise_id,user_id
  705. eu = ExerciseUser.find_by_exercise_id_and_user_id(exercise_id,user_id)
  706. if eu.nil?
  707. eu = ExerciseUser.new
  708. end
  709. eu
  710. end
  711. # 获取当前学生回答问题的答案
  712. def get_user_answer(question,user)
  713. # user_answer = ExerciseAnswer.where("user_id=? and exercise_question_id=?", user.id, question.id).first
  714. user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
  715. user_answer
  716. end
  717. # 获取问题的标准答案
  718. def get_user_standard_answer(question,user)
  719. if question.question_type == 3
  720. standard_answer =[]
  721. question.exercise_standard_answers.each do |answer|
  722. standard_answer << answer.answer_text
  723. end
  724. else
  725. standard_answer = question.exercise_standard_answers.first
  726. end
  727. standard_answer
  728. end
  729. # 是否完成了答题
  730. def get_complete_question(exercise,user)
  731. questions = exercise.exercise_questions
  732. complete_question = []
  733. questions.each do |question|
  734. answers = get_user_answer(question,user)
  735. if !(answers.nil? || answers.count < 1)
  736. complete_question << question
  737. end
  738. end
  739. complete_question
  740. end
  741. # 获取答题百分比
  742. def get_percent exercise,user
  743. complete_count = get_complete_question(exercise,user).count
  744. if exercise.exercise_questions.count == 0
  745. return 0
  746. else
  747. return (complete_count.to_f / exercise.exercise_questions.count.to_f)*100
  748. end
  749. end
  750. def remove_invalid_exercise(course)
  751. exercises = course.exercises.where("exercise_name=?","")
  752. unless exercises.empty?
  753. exercises.each do |exercise|
  754. if exercise.exercise_questions.empty?
  755. exercise.destroy
  756. end
  757. end
  758. end
  759. end
  760. def find_exercise_and_course
  761. @exercise = Exercise.find params[:id]
  762. @course = Course.find @exercise.course_id
  763. rescue Exception => e
  764. render_404
  765. end
  766. def find_course
  767. @course = Course.find params[:course_id]
  768. rescue Exception => e
  769. render_404
  770. end
  771. end

软件技术创新是当今国家整体创新能力的重要基础和发展引擎。近年来,大众参与的软件创新与创业活动已经成为网络时代软件开发和应用的新形态,正在快速改变着全球软件创新模式和软件产业格局。 ...