diff --git a/app/controllers/exercise_controller.rb b/app/controllers/exercise_controller.rb index 4c6023265..6fe639260 100644 --- a/app/controllers/exercise_controller.rb +++ b/app/controllers/exercise_controller.rb @@ -1,115 +1,109 @@ +#encoding: utf-8 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, - :send_to_course, :get_student_uncomplete_question, :edit_question_score] + :send_to_course, :get_student_uncomplete_question, :edit_question_score, :setting, :set_public, + :ex_setting] 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") + #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") else - exercises = @course.exercises.where("exercise_status <> 1").order("created_at asc") + exercises = @course.exercises.where("exercise_status <> 1").order("created_at desc") end - @exercises = paginateHelper exercises,20 #分页 + 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}%'") + end + @exercises = paginateHelper exercises,15 #分页 @left_nav_type = 8 respond_to do |format| + format.js format.html end end def show - publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now) - publish_exercises.each do |exercise| - exercise.update_column('exercise_status', 2) - course = exercise.course - course.members.each do |m| - exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2) - end - end - unless User.current.member_of_course?(@course) || User.current.admin? render_403 return end - @exercise = Exercise.find params[:id] @exercise.course_messages.each do |message| if User.current.id == message.user_id && message.viewed == 0 message.update_attributes(:viewed => true) if message.viewed == 0 end end @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? - exercise_end = @exercise.end_time.nil? ? false : @exercise.end_time > Time.now - if @exercise.time == -1 - @can_edit_excercise = exercise_end - else - @can_edit_excercise = !has_commit_exercise?(@exercise.id,User.current.id)&& exercise_end - end + unless @is_teacher @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first if @exercise_user.nil? eu = ExerciseUser.create(:user_id => User.current.id, :exercise_id => @exercise.id, :start_at => Time.now, :status => false) @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first + elsif @exercise_user.start_at.nil? + @exercise_user.update_attributes(:start_at => Time.now) + end + + 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 #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))) + else + @can_edit_excercise = false end # @percent = get_percent(@exercise,User.current) - @exercise_questions = @exercise.exercise_questions - @left_nav_type = 8 + #@exercise_questions = @exercise.exercise_questions respond_to do |format| - format.html {render :layout => 'base_courses'} + format.html {render :layout => 'base_edu'} 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 + # 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'} end end def create if params[:exercise] - exercise = Exercise.find(params[:exercise_id]) if params[:exercise_id] - exercise ||= Exercise.new + 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.time = -1 exercise.exercise_status = 1 if exercise.save @exercise = exercise @@ -121,21 +115,15 @@ class ExerciseController < ApplicationController end def edit - @left_nav_type = 8 respond_to do |format| - format.html{render :layout => 'base_courses'} - end + format.html{render :layout => 'base_edu'} + end end def update @exercise.exercise_name = params[:exercise][:exercise_name] @exercise.exercise_description = params[:exercise][:exercise_description] - @exercise.time = params[:exercise][:time].blank? ? -1 : params[:exercise][:time] - @exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1) - @exercise.publish_time = params[:exercise][:publish_time] - @exercise.show_result = params[:show_result] ? 1 : 0 - @exercise.question_random = params[:question_random] ? 0 : 1 - @exercise.choice_random = params[:choice_random] ? 0 : 1 + if @exercise.save respond_to do |format| format.js @@ -148,15 +136,34 @@ class ExerciseController < ApplicationController 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 + 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] + @exercise.time = -1 + @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) end end @@ -178,10 +185,7 @@ class ExerciseController < ApplicationController 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) : - (params[:question_type] == "3" ? (@exercise.exercise_questions.where("question_type = 3").count + 1) : - @exercise.exercise_questions.where("question_type = 4").count + 1)), + :question_number => @exercise.exercise_questions.count + 1, :question_score => params[:question_score] } @exercise_questions = @exercise.exercise_questions.new option @@ -197,20 +201,23 @@ class ExerciseController < ApplicationController end end # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1 - if params[:quest_id] + if params[:quest_id] != "0" @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") - 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") + 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 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] 标准答案参数 @@ -327,16 +334,17 @@ class ExerciseController < ApplicationController @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") - 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 + 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 # @exercise_question_num = params[:quest_num].to_i # @exercise_questions.question_number = params[:quest_num].to_i - 1 # @@ -358,12 +366,12 @@ class ExerciseController < ApplicationController exercise_questions = @exercise.exercise_questions if @exercise_question if params[:opr] == 'up' && @exercise_question.question_number > 1 - @before_que = exercise_questions.where("question_type = #{@exercise_question.question_type} and question_number = #{@exercise_question.question_number - 1}").first + @before_que = exercise_questions.where("question_number = #{@exercise_question.question_number - 1}").first 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 - @after_que = exercise_questions.where("question_type = #{@exercise_question.question_type} and question_number = #{@exercise_question.question_number + 1}").first + @after_que = exercise_questions.where("question_number = #{@exercise_question.question_number + 1}").first 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 @@ -470,77 +478,68 @@ class ExerciseController < ApplicationController 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 - @name,@select_group = params[:name].to_s.strip || "",params[:group] + @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] @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? - if @is_teacher - @all_exercises = @course.exercises.order("created_at desc") - else - @all_exercises = @course.exercises.where("exercise_status > 1").order("created_at desc") - end + student_id = @course.student.blank? ? "(-1)" : "(" + @course.student.map{|student| student.student_id}.join(",") + ")" - if @select_group - if @select_group == "0" - none_group_students = @course.members.select{ |member| member.course_group_id == 0 } - if none_group_students.empty? - student_in_group = '(0)' - else - student_in_group = '(' + none_group_students.map{ |member| member.user_id }.join(',') + ')' - end - elsif @select_group == "-1" - all_group_students = @course.members.select{ |member| member.course_group_id } - if all_group_students.empty? - student_in_group = '(0)' - else - student_in_group = '(' + all_group_students.map{ |member| member.user_id }.join(',') + ')' - end + 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)' else - course_group = CourseGroup.find_by_id(@select_group) - group_students = course_group.users - if group_students.empty? - student_in_group = '(0)' - else - student_in_group = '(' + group_students.map{ |user| user.id }.join(',') + ')' - end + student_in_group = '(' + group_students.map{ |member| member.user_id }.join(',') + ')' end - if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time <= Time.now) - @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id in #{student_id} and user_id in #{student_in_group}"), @name + + 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}") @show_all = true; - elsif !@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time > Time.now - @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id = ? and user_id in #{student_id} and user_id in #{student_in_group}",User.current.id), @name + 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) else @exercise_users_list = [] end else - if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time <= Time.now) - @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id in #{student_id}"), @name + 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}") @show_all = true; - elsif !@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time > Time.now - @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id = ? and user_id in #{student_id}",User.current.id), @name + elsif User.current.member_of_course?(@course) + @exercise_users_list = @exercise.exercise_users.where("user_id = ? and user_id in #{student_id}",User.current.id) else @exercise_users_list = [] end end - @exercise_count = @exercise.exercise_users.where("commit_status = 1 and user_id in #{student_id}").count - @left_nav_type = 8 + + 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 respond_to do |format| format.js - format.html + format.html{render :layout => 'base_edu'} 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" + filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@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)) } @@ -690,11 +689,11 @@ class ExerciseController < ApplicationController else # 更新提交状态 cur_exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", User.current, @exercise.id).first - cur_exercise_user.update_attributes(:status => 1, :commit_status => 1) - if @exercise.time && @exercise.time != -1 + cur_exercise_user.update_attributes(:status => 1, :commit_status => 1, :end_at => Time.now) + #if @exercise.time && @exercise.time != -1 score = calculate_student_score(@exercise, User.current) - cur_exercise_user.update_attributes(:score => score) - end + cur_exercise_user.update_attributes(:objective_score => score, :score => score + (cur_exercise_user.subjective_score > 0 ? cur_exercise_user.subjective_score : 0)) + #end # 答题过程中需要统计完成量 #@uncomplete_question = get_uncomplete_question(@exercise, User.current) # 获取改学生的考试得分 @@ -748,16 +747,20 @@ class ExerciseController < ApplicationController #查看学生的答卷情况 def show_student_result - @user = User.find params[:user_id] - @can_edit_excercise = false - @exercise_questions = @exercise.exercise_questions - #score = calculate_student_score(@exercise, @user) - #eu = get_exercise_user(@exercise.id, @user.id) - #eu.update_attributes(:score => score) - @exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", @user.id, @exercise.id).first - @left_nav_type = 8 - respond_to do |format| - format.html {render :layout => 'base_courses'} + @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 end end @@ -937,7 +940,7 @@ class ExerciseController < ApplicationController else name = name.downcase select_exercises = exercises.select{ |exercise| - exercise.user[:login].to_s.downcase.include?(name) || 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) + 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) } end select_exercises diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 122d74478..43523a130 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -33,6 +33,18 @@ module ApplicationHelper extend Forwardable def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter + # 作品列表的提交状态 + def list_work_status status + case status + when 0 + str = "未提交" + when 1 + str = "按时提交" + when 2 + str = "延时提交" + end + end + # 定义当前关卡是否有权开启下一关 # :实训若发布了,必须通过当前关卡才能查看下一关 # :未发布的实训,除了最后一关,其它的关卡都可以进入下一关 @@ -546,7 +558,7 @@ module ApplicationHelper style = 'edu-filter-btn-red' when '评阅中' style = 'edu-filter-btn-green' - when '已结束' + when '已结束', '已截止' style = 'edu-filter-btn-end' when '已开启补交' style = 'edu-filter-btn-late' @@ -568,9 +580,10 @@ module ApplicationHelper # 未评阅 def had_unevaluate_count homework_common - count = StudentWorksScore.find_by_sql("SELECT count(distinct student_work_id) as count FROM student_works_scores sws, student_works sw, homework_commons hc where hc.id =#{homework_common.id} and sw.homework_common_id=hc.id and sw.is_delete = 0 and sws.student_work_id = sw.id and sws.user_id=#{User.current.id};").first.try(:count).to_i - student_count = homework_common.course.student.count - return student_count - count + #count = StudentWorksScore.find_by_sql("SELECT count(distinct student_work_id) as count FROM student_works_scores sws, student_works sw, homework_commons hc where hc.id =#{homework_common.id} and sw.homework_common_id=hc.id and sw.is_delete = 0 and sws.student_work_id = sw.id and sws.user_id=#{User.current.id};").first.try(:count).to_i + has_comment = User.current.student_works_scores.where(:student_work_id => homework_common.student_works.map(&:id), :reviewer_role => [1, 2]).group_by(&:student_work_id).count + student_count = homework_common.student_works.count + return student_count - has_comment end # 该阶段还有多长时间结束/距下一阶段还有多长时间 @@ -616,6 +629,28 @@ module ApplicationHelper result end + # 试卷:该阶段还有多长时间结束/距下一阶段还有多长时间 + def exercise_curr_time exercise + result = {} + status = "" + time = "" + case exercise.exercise_status + when 1 + status = "未发布" + when 2 + if exercise.end_time && exercise.end_time >= Time.now + status = "提交中" + time = how_much_time(exercise.end_time) + end + when 3 + status = "已截止" + time = format_time exercise.end_time + end + result[:status] = status + result[:time] = time + result + end + # 公共分页 def paginator_list objs, objs_count, limit, is_remote @is_remote = is_remote @@ -4760,9 +4795,19 @@ def get_work_index(hw,is_teacher) return index end +def get_ex_index(exercise, course, is_teacher) + if is_teacher + exercises = course.exercises.order("created_at asc") + else + exercises = course.exercises.where("exercise_status > 0").order("created_at asc") + end + ex_ids = exercises.map{|ex| ex.id} if !exercises.blank? + index = ex_ids.index(exercise.id) + return index +end + def get_hw_index(hw,is_teacher,type=0) homework_commons = hw.course.homework_commons - Rails.logger.info("----------------------------------------------"+hw.course.to_s) if is_teacher if type != 0 homeworks = homework_commons.where("homework_commons.homework_type = #{type}").order("created_at asc") @@ -4776,7 +4821,6 @@ def get_hw_index(hw,is_teacher,type=0) homeworks = homework_commons.where("publish_time <= '#{Time.now}'").order("created_at asc") end end - Rails.logger.info("----------------------------------------------"+homeworks.count.to_s) hw_ids = homeworks.map{|hw| hw.id} if !homeworks.blank? index = hw_ids.index(hw.id) return index diff --git a/app/helpers/exercise_helper.rb b/app/helpers/exercise_helper.rb index 28dd0b260..203ffd327 100644 --- a/app/helpers/exercise_helper.rb +++ b/app/helpers/exercise_helper.rb @@ -1,6 +1,44 @@ # encoding: utf-8 module ExerciseHelper + def un_commit_num exercise + course = exercise.course + exercise.exercise_users.where(:commit_status => 0, :user_id => course.student.map(&:student_id)).count + end + + def has_commit_num exercise + course = exercise.course + exercise.exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count + end + + def un_comment_num exercise + course = exercise.course + exercise.exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id), :subjective_score => -1).count + end + + def has_comment_num exercise + course = exercise.course + exercise.exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id)).count - exercise.exercise_users.where(:commit_status => 1, :user_id => course.student.map(&:student_id), :subjective_score => -1).count + end + + def answer_is_correct eq, user + is_correct = false + case eq.question_type + when 1 + answer = get_user_answer(eq, user) + standard_answer = get_user_standard_answer(eq, user) + is_correct = !answer.empty? && !standard_answer.empty? && answer.first.exercise_choice.choice_position == standard_answer.first.exercise_choice_id + when 2 + standard_answer = get_user_standard_answer(eq, user) + is_correct = !standard_answer.empty? && get_mulscore(eq, user).to_i == standard_answer.first.exercise_choice_id + when 3 + answer = get_user_answer(eq, user) + standard_answer = get_user_standard_answer(eq, user) + is_correct = !answer.empty? && !standard_answer.empty? && standard_answer.include?(answer.first.answer_text) + end + is_correct + end + # 单选 def sigle_selection_standard_answer(params) size = params.ord - 96 @@ -160,6 +198,17 @@ module ExerciseHelper uncomplete_question end + def question_commit_status question, user + status = "" + case question.question_type + when 3, 4 + get_anwser_vote_text(question.id,user.id) == "" ? status = "未答" : status = "" + when 1, 2 + get_user_answer(question,user).empty? ? status = "未答" : status = "" + end + status + end + #获取文本题答案 def get_anwser_vote_text(question_id,user_id) pv = ExerciseAnswer.find_by_exercise_question_id_and_user_id(question_id,user_id) diff --git a/app/helpers/owner_type_helper.rb b/app/helpers/owner_type_helper.rb index 3239d9d8e..b4fb514c9 100644 --- a/app/helpers/owner_type_helper.rb +++ b/app/helpers/owner_type_helper.rb @@ -16,4 +16,5 @@ module OwnerTypeHelper STUDENTWORK = 15 HOMEWORKBANK = 16 SUBJECT = 17 + EXERCISEQUESTION = 18 end \ No newline at end of file diff --git a/app/helpers/student_work_helper.rb b/app/helpers/student_work_helper.rb index b016bbf61..9b3c17a95 100644 --- a/app/helpers/student_work_helper.rb +++ b/app/helpers/student_work_helper.rb @@ -85,18 +85,6 @@ module StudentWorkHelper str end - # 作品列表的提交状态 - def list_work_status status - case status - when 0 - str = "未提交" - when 1 - str = "按时提交" - when 2 - str = "延时提交" - end - end - # 作品的助教评分模式 def ta_score_mode homework mode = homework.homework_detail_manual.ta_mode == 1 ? '平均' : '复审' diff --git a/app/models/exercise_question.rb b/app/models/exercise_question.rb index 5189b0274..c6a4f40df 100644 --- a/app/models/exercise_question.rb +++ b/app/models/exercise_question.rb @@ -1,3 +1,4 @@ +#encoding: utf-8 class ExerciseQuestion < ActiveRecord::Base include Redmine::SafeAttributes @@ -5,4 +6,17 @@ class ExerciseQuestion < ActiveRecord::Base has_many :exercise_choices, :order => "#{ExerciseChoice.table_name}.choice_position",:dependent => :destroy has_many :exercise_answers, :dependent => :destroy has_many :exercise_standard_answers, :dependent => :destroy + + def question_type_name + case self.question_type + when 1 + "单选题" + when 2 + "多选题" + when 3 + "填空题" + when 4 + "简答题" + end + end end diff --git a/app/models/students_for_course.rb b/app/models/students_for_course.rb index 95157f2da..662d57bd2 100644 --- a/app/models/students_for_course.rb +++ b/app/models/students_for_course.rb @@ -10,7 +10,7 @@ class StudentsForCourse < ActiveRecord::Base validates_uniqueness_of :student_id, :scope => :course_id after_destroy :delete_student_works, :delete_course_homework_statistic - after_create :recovery_student_works, :create_student_works + after_create :recovery_student_works, :create_student_works, :create_exercise_users #退出班级或删除学生时隐藏学生的作品 def delete_student_works @@ -58,6 +58,27 @@ class StudentsForCourse < ActiveRecord::Base end end + # 加入班级时创建已发布试卷的作品 + def create_exercise_users + course = self.course + str = "" + exercises = course.exercises.where("exercise_status > 0") + if exercises.count != 0 + exercises.each do |ex| + if ex.exercise_users.where("user_id = #{self.student_id}").count == 0 + if str != "" + str += "," + end + str += "(#{ex.id},#{self.student_id}, 0, '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" + end + end + if str != "" + sql = "insert into exercise_users (exercise_id, user_id, commit_status, created_at, updated_at) values" + str + ActiveRecord::Base.connection.execute sql + end + end + end + #加入班级时创建一条记录 def create_course_homework_statistic # if CourseHomeworkStatistics.where(:user_id => self.student_id, :course_id => self.course_id).count == 0 diff --git a/app/views/exercise/_edit_MC.html.erb b/app/views/exercise/_edit_MC.html.erb index 9dbb510b2..6d49b607d 100644 --- a/app/views/exercise/_edit_MC.html.erb +++ b/app/views/exercise/_edit_MC.html.erb @@ -21,6 +21,47 @@ } +
简答题
+ + ++ 温馨提示:[简答题]属于主观题需要人工评分,未作答的情况下系统将自动评分 + 参考答案仅作为人工评分的参考 + 保存 + 取消 +
+填空题
++ edu-filter-cir-grey mr5 font-12 fl" data-remote="true">全部 + <% if @is_teacher %> + edu-filter-cir-grey mr5 font-12 fl" data-remote="true">未发布 + <% end %> + edu-filter-cir-grey mr5 font-12 fl" data-remote="true">提交中 + edu-filter-cir-grey mr5 font-12 fl" data-remote="true">已截止 + + +
+<%= exercise.exercise_description.nil? ? "" :exercise.exercise_description.html_safe%>- -
+ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > <%= link_to @exercise.exercise_name, student_exercise_list_exercise_path(@exercise) %> > <%= @exercise_user.user.show_real_name %> +
++ <% unless @exercise.is_public %> + + <% end %> + <%= @exercise.exercise_name %> +
- <% mc_question_list = exercise.exercise_questions.where("question_type=1") %> - <% mcq_question_list = exercise.exercise_questions.where("question_type=2") %> - <% single_question_list = exercise.exercise_questions.where("question_type=3") %> - <% multi_question_list = exercise.exercise_questions.where("question_type=4") %> - <% if exercise.question_random == 1 %> - <% mc_question_list = mc_question_list.shuffle %> - <% mcq_question_list = mcq_question_list.shuffle %> - <% single_question_list = single_question_list.shuffle %> - <% multi_question_list =multi_question_list.shuffle %> - <% end %> -| - - | -
| - - | -
答题情况
-<%= @exercise.try(:exercise_description).html_safe%>+
第<%= i + 1 %>题:[<%= exercise_question.question_type_name %>]<%= exercise_question.question_score %>分
+<%= exercise_question.question_title %>+ <% case exercise_question.question_type %> + <% when 1 %> +
+ 交卷 +
++ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > <%= link_to @exercise.exercise_name, student_exercise_list_exercise_path(@exercise) %> > <%= @exercise_user.user.show_real_name %> +
++ <% unless @exercise.is_public %> + + <% end %> + <%= @exercise.exercise_name %> +
+ + <%= link_to "返回", student_exercise_list_exercise_path(@exercise), :class => "fr font-12 mr15 mt3 color-grey" %> +<%= @exercise.try(:exercise_description).html_safe%>+
总分:<%= @exercise_user.score.nil? ? "--" : format("%.1f",@exercise_user.score)%>分
+第<%= exercise_question.question_number %>题:[<%= exercise_question.question_type_name %>]<%= exercise_question.question_score %>分<%= question_commit_status exercise_question, @exercise_user.user %>
+ <% if exercise_question.question_type != 4 %> + <% is_correct = answer_is_correct(exercise_question, user) %> +<%= is_correct ? exercise_question.question_score : 0 %>分
+ <% else %> + <% answer = get_user_answer(exercise_question, user)%> +mr3"><%= answer.empty? ? 0 : (answer.first.score == -1 ? "未批" : answer.first.score) %><%= answer.empty? ? "分" : (answer.first.score == -1 ? "" : "分") %>
<% end %> - <%# time = exercise_user.end_at - exercise_user.start_at %><%= exercise.exercise_description.nil? ? "" :exercise.exercise_description.html_safe%>- -
<%= exercise_question.question_title %>
-| - - | -
<%= exercise_question.question_title %>+ <% case exercise_question.question_type %> + <% when 1 %> +
<%= exercise_question.question_title %>
+ <% if @is_teacher || @exercise.answer_open %> +| - - | -
<%= exercise_question.question_title %>
+ <% if @is_teacher || @exercise.answer_open %> +<%= get_anwser_vote_text(exercise_question.id,user.id).html_safe %>+ <% end %> + <% if @is_teacher || @exercise.answer_open %> +
候选答案<%= convert_to_chi_num(index+1) %>:<%= exercise_choice.answer_text%>
<% end %><%= get_anwser_vote_text(exercise_question.id,user.id).html_safe %>+ <% end %> + <% if exercise_question.exercise_standard_answers.count > 0 && (@is_teacher || @exercise.answer_open) %> +
参考答案
+<%= exercise_question.exercise_standard_answers.first.answer_text%>+
<%= exercise_question.exercise_standard_answers.first.answer_text%>-
+ 创建于<%=time_from_now exercise.created_at %> + 更新于<%=time_from_now exercise.updated_at %> + <%= exercise.exercise_users.where("commit_status = 1").count %>已答 + <%= exercise.course.student.count - exercise.exercise_users.where("commit_status = 1").count %>未答 + <%# count = exercise.exercise_users.where("commit_status = 1 and subjective_score = -1").count %> + <%= un_commit_num exercise %>未评 + <%= ex_curr_status[:time] %> + <% if exercise.try(:exercise_status) == 0 && exercise.publish_time %> + 将于 <%= format_time(exercise.publish_time).to_s %> 发布 + <% end %> +
+单选题
+ + + ++ 保存 +
+<% end %> \ No newline at end of file diff --git a/app/views/exercise/_new_multi.html.erb b/app/views/exercise/_new_multi.html.erb index 1baef7772..2ed014967 100644 --- a/app/views/exercise/_new_multi.html.erb +++ b/app/views/exercise/_new_multi.html.erb @@ -1,38 +1,39 @@ -<%= form_for(ExerciseQuestion.new, +<% if exercise.id %> + <%= form_for(ExerciseQuestion.new, :html => { :multipart => true }, :url=>create_exercise_question_exercise_path(exercise.id), :remote=>true ) do |f| %> -简答题
+ + ++ 温馨提示:[简答题]属于主观题需要人工评分,未作答的情况下系统将自动评分 + 参考答案仅作为人工评分的参考 + 保存 + 取消 +
+<%= exercise_question.question_title %>
-<%= exercise_question.question_title %>+
<%= exercise_question.question_title %>
-<%= exercise_question.question_title %>+
<%= exercise.exercise_description.nil? ? "" :exercise.exercise_description.html_safe%>- - -
<%= @exercise.try(:exercise_description).nil? ? "" : @exercise.try(:exercise_description).html_safe%>+
<%= exercise_question.question_title %>
+第<%= exercise_question.question_number%>题:[简答题]<%= exercise_question.question_score %>分
++ <% if exercise_question.question_number < @exercise.exercise_questions.count %> + + <% end %> + <% unless exercise_question.question_number == 1 %> + + <% end %> + + + +
+<%= exercise_question.question_title %>+
参考答案
+<%= exercise_question.exercise_standard_answers.count > 0 ? exercise_question.exercise_standard_answers.first.answer_text : "无"%>
<%= exercise_question.exercise_standard_answers.first.answer_text%>-
<%= exercise_question.question_title %>
+第<%= exercise_question.question_number%>题:[填空题]<%= exercise_question.question_score %>分
++ <% if exercise_question.question_number < @exercise.exercise_questions.count %> + + <% end %> + <% unless exercise_question.question_number == 1 %> + + <% end %> + + + +
<%= exercise_question.question_title %>+
候选答案<%= convert_to_chi_num(index+1) %>:<%= exercise_choice.answer_text%>
<% end %><%= @exercise_count %> 个检索结果(学生:<%= @course.student.count %>人)
+| 序号 | +姓名 | +学号 | +提交状态 | +提交时间 | +客观题得分 | +主观题教师评分 | + +最终成绩 | +操作 | +
|---|---|---|---|---|---|---|---|---|
| <%= (@page - 1) * @limit + index + 1 %> | ++ <%= link_to exercise.user.show_real_name, user_path(exercise.user),:class=>"color-grey3" %> + | +"> + <%= exercise.user.user_extensions.nil? ? "--" : exercise.user.user_extensions.student_id %> + | ++ <%= (list_work_status exercise.commit_status).html_safe %> + | +<%= exercise.commit_status == 0 ? '--' : format_time(exercise.end_at) %> | ++ <%= exercise.objective_score == -1 ? "--" : format("%.1f",exercise.objective_score)%> + | ++ <%= exercise.subjective_score == -1 ? "--" : format("%.1f",exercise.subjective_score)%> + | + + + + + + + + + ++ <%= exercise.score.nil? ? "--" : format("%.1f",exercise.score)%> + <%# unless exercise.score.nil? %> + + + + + + + + + + <%# end %> + | ++ <% if exercise.commit_status > 0 %> + <% if @is_teacher %> + <%= link_to '评阅', show_student_result_exercise_path(@exercise,:user_id => exercise.user_id), :target => "_blank" %> + <% else %> + <%= link_to '查看', exercise.commit_status == 1 ? exercise_path(@exercise,:user_id => exercise.user_id) : show_student_result_exercise_path(@exercise,:user_id => exercise.user_id), :target => "_blank" %> + <% end %> + <% else %> + -- + <% end %> + | +
客观题由系统自动评分:
- 单选题、多选题、填空题
主观题需要人工评分,但未作答时系统
自动评零分:
问答题
-
+ 单选题 <%= @exercise.exercise_questions.where("question_type=1").count %> 题,共 <%= current_score[1] %> 分 + 多选题 <%= @exercise.exercise_questions.where("question_type=2").count %> 题,共 <%= current_score[2] %> 分 + 填空题 <%= @exercise.exercise_questions.where("question_type=3").count %> 题,共 <%= current_score[3] %> 分 + 简答题 <%= @exercise.exercise_questions.where("question_type=4").count %> 题,共 <%= current_score[4] %> 分 +
+ + 合计 <%= @exercise.exercise_questions.count %> 题,共 <%= current_score[0] %> 分 ++ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > <%= link_to @exercise.exercise_name, student_exercise_list_exercise_path(@exercise) %> > 编辑 +
+编辑试卷
+ <%= link_to "返回", student_exercise_list_exercise_path(@exercise), :class => "fr font-12 color-grey mr15 mt5" %> + <%= link_to "设置", setting_exercise_path(@exercise), :class => "fr font-12 mr15 mt5 color-grey" %> +试卷列表
+ <% if @is_teacher %> + + 新建 + + + <% end %> ++ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > 新建 +
+新建试卷
+ <%= link_to "返回", exercise_index_path(:course_id => @course.id), :class => "fr font-12 color-grey mr15 mt5" %> ++ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > #<%= get_ex_index(@exercise, @course, @is_teacher) + 1 %> +
++ + <%= @exercise.exercise_name %> +
+ <%= link_to "返回", student_exercise_list_exercise_path(@exercise), :class => "fr font-12 mr15 mt3 color-grey" %> +发布设置
+ <% if @is_teacher %> + 编辑 + <% end %> +发布之前,学生不会收到试卷
+答题设置
+公开设置
+发布设置
+发布之前,学生不会收到试卷
+答题设置
+公开设置
++ + <%= link_to @course.name, course_path(@course) %> > <%= link_to "试卷列表", exercise_index_path(:course_id => @course.id) %> > #<%= get_ex_index(@exercise, @course, @is_teacher) + 1 %> +
++ <% unless @exercise.is_public %> + <% end %> + <%= @exercise.exercise_name %> +
+ <%= link_to "返回", exercise_index_path(:course_id => @course.id), :class => "fr font-12 mr15 mt3 color-grey" %> + <% if @is_teacher %> + <%= link_to "设置", setting_exercise_path(@exercise), :class => "fr font-12 mr15 mt3 color-grey" %> + <% else %> + + <%= link_to "查看设置", setting_exercise_path(@exercise), :class => "fr font-12 mr15 mt3 color-grey" %> + <% end %> ++ <% ex_user = @exercise.exercise_users.where(:user_id => User.current).first %> + <% if ex_user %> + <% if ex_user.commit_status > 0 %> + 你已提交 + <%= link_to '查看答题', ex_user.commit_status == 1 ? exercise_path(@exercise,:user_id => User.current.id) : show_student_result_exercise_path(@exercise,:user_id => User.current.id), :class => "white-btn orange-btn fr" %> + <% else %> + 你未提交 + <% if @exercise.exercise_status == 2 %> + <%= link_to (ex_user.start_at.nil? ? "开始答题" : "继续答题"), exercise_path(@exercise,:user_id => User.current.id), :class => "white-btn orange-btn fr" %> + <% end %> + <% end %> + <% end %> +
++ (<%= @has_commit_count %>人已交) + <% if @exercise.exercise_status == 2 && @exercise.end_time > Time.now %> + <% end_time = @exercise.end_time.to_time.to_i %> + 答题剩余时间:<%= (end_time - Time.now.to_i) / (24*60*60) %>天<%= ((end_time - Time.now.to_i) % (24*60*60)) / (60*60)%>小时<%= (((end_time - Time.now.to_i) % (24*60*60)) % (60*60)) / 60%>分 + <% elsif @exercise.exercise_status == 3 %> + 提交已截止 + <% end %> +
+ <% end %> -