#encoding utf-8 class PollController < ApplicationController before_filter :find_poll_and_course, :only => [:edit,:update,:destroy,:show,:statistics_result,:create_poll_question,:commit_poll,:commit_answer,:publish_poll,:publish_notice,:end_notice,:cancel_publish,:poll_result, :close_poll,:export_poll,:save_poll,:update_question_num, :student_poll_list, :poll_setting, :set_public, :add_to_exercise_bank] before_filter :find_container, :only => [:new,:create, :index] # before_filter :is_logged, :only => [:index, :show, :poll_result,:new,:create,:edit,:update,:destroy,:publish_poll,:cancel_publish,:publish_notice,:close_poll,:export_poll,:commit_answer,:commit_poll,:statistics_result,:save_poll,:set_public] before_filter :is_member_of_course, :only => [:show,:poll_result] before_filter :is_course_teacher, :only => [:new,:create,:edit,:update,:destroy,:publish_poll,:cancel_publish,:publish_notice,:close_poll,:export_poll,:save_poll,:set_public] before_filter :require_login, :only => [:student_poll_list, :show] include PollHelper include ApplicationHelper def index if @course.is_public == 0 && !(User.current.member_of_course?(@course)||User.current.admin?) render_403 return end @is_teacher = User.current.allowed_to?(:as_teacher,@course) if @is_teacher polls = @course.polls.order("IF(ISNULL(publish_time),0,1), publish_time DESC, created_at DESC") elsif User.current.member_of_course?(@course) # 课堂成员显示为发布的和已发布的 member = @course.members.where(:user_id => User.current.id).first if member.try(:course_group_id).to_i == 0 polls = @course.polls.where("publish_time <= '#{Time.now}' and unified_setting = 1").order("IF(ISNULL(publish_time),0,1),publish_time DESC, created_at DESC") else # 已分班的成员 not_poll_ids = @course.poll_group_settings.where("course_group_id = #{member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)") not_poll_ids = not_poll_ids.blank? ? "(-1)" : "(" + not_poll_ids.map(&:poll_id).join(",") + ")" # 已分班,但是成员不再 polls = @course.polls.where("publish_time <= '#{Time.now}' and id not in #{not_poll_ids}").order("IF(ISNULL(publish_time),0,1),publish_time DESC, created_at DESC") end else polls = @course.polls.where("publish_time <= '#{Time.now}'").order("IF(ISNULL(publish_time),0,1),publish_time DESC, created_at DESC") end if params[:type] @type = params[:type] polls = polls.where(:polls_status => params[:type]) end @search = params[:search] ? params[:search].to_s.strip : "" if params[:search] polls = polls.where("polls_name like '%#{@search}%'") end @polls = paginateHelper polls, 15 #分页 @left_nav_type = 6 respond_to do |format| format.js format.html{render :layout => 'base_courses'} end end def show @is_teacher = User.current.allowed_to?(:as_teacher,@course) =begin if @poll.polls_status != 2 && !(User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) render_403 return end =end unless @is_teacher @user = User.current @poll_user = PollUser.where("user_id=? and poll_id=?", User.current.id, @poll.id).first if @poll_user.nil? @poll_user = PollUser.create(:user_id => User.current.id, :poll_id => @poll.id, :start_at => Time.now, :commit_status => 0) elsif @poll_user.start_at.nil? @poll_user.update_attributes(:start_at => Time.now) end @can_edit_poll = can_edit_poll @poll, @poll_user @percent = get_percent(@poll,User.current) if !@can_edit_poll && @poll_user.commit_status == 0 @poll_user.update_attributes(:end_at => @poll.end_time, :commit_status => 1) end else @user = User.find params[:user_id] @poll_user = PollUser.where("user_id=? and poll_id=?", params[:user_id], @poll.id).first @can_edit_poll = false end respond_to do |format| format.html {render :layout => 'base_edu'} end end def new @poll = Poll.new respond_to do |format| format.html{render :layout => 'base_edu'} end end def create if params[:poll] poll = Poll.new(:polls_name => params[:poll][:polls_name], :polls_description => params[:poll][:polls_description], :user_id => User.current.id, :polls_type => 'Course', :course_id => params[:course_id], :show_result => 1, :polls_status => 1) if poll.save create_polls_list poll @poll = poll respond_to do |format| format.js end end end end def edit respond_to do |format| format.html{render :layout => 'base_edu'} end end def update @poll.polls_name = params[:poll][:polls_name] @poll.polls_description = params[:poll][:polls_description] if @poll.save respond_to do |format| format.js end else render_404 end end def destroy if @poll && @poll.destroy redirect_to poll_index_url(:course_id => @course.id) end end def student_poll_list @order,@b_sort,@name,@group,@status = params[:order] || "end_at",params[:sort] || "desc",params[:name].to_s.strip || "", params[:poll_group], params[:poll_status] @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? @member = @course.members.where(:user_id => User.current.id).first # 判断学生是否有权限查看(问卷未发布、问卷已发布但不是统一设置的未分班学生、分班设置的问卷未发布) if User.current.member_of_course?(@course) && !@is_teacher if @poll.publish_time.nil? || @poll.publish_time > Time.now || (!@poll.unified_setting && (@member.course_group_id == 0 || @poll.poll_group_settings.where("course_group_id = #{@member.try(:course_group_id)} and (publish_time > '#{Time.now}' or publish_time is null)").count > 0)) render_403 return end end student_id = @course.student.blank? ? "(-1)" : "(" + @course.student.map{|student| student.student_id}.join(",") + ")" if @poll.polls_status < 2 @poll_users_list = @poll.poll_users.where("0=1") elsif @poll.unified_setting @poll_users_list = @poll.poll_users else user_ids = @course.members.where(:course_group_id => @poll.poll_group_settings.where("publish_time < '#{Time.now}'").pluck(:course_group_id)).map(&:user_id) @poll_users_list = @poll.poll_users.where(:user_id => user_ids) end @group_teacher = @is_teacher && @member.present? && @member.teacher_course_groups.count > 0 if @group || @group_teacher group_ids = @group || @member.teacher_course_groups.pluck(:course_group_id) group_students = @course.members.where(:course_group_id => group_ids).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 student_in_group = '(' + group_students.map{ |member| member.user_id }.join(',') + ')' end @poll_users_list = @poll_users_list.where("poll_users.user_id in #{student_in_group}") else @poll_users_list = @poll_users_list.where("poll_users.user_id in #{student_id}") end if @poll_users_list.size != 0 if @order == "student_id" @poll_users_list = @poll_users_list.includes(:user => {:user_extensions => []}).order("user_extensions.student_id #{@b_sort}") else @poll_users_list = @poll_users_list.includes(:user => {:user_extensions => []}).order("#{@order} #{@b_sort}") end end unless @status.blank? @poll_users_list = @poll_users_list.where(:commit_status => @status) end @poll_users_list = search_work_member @poll_users_list, @name @tab = params[:tab].nil? ? 1 : params[:tab].to_i @score = @b_sort == "desc" ? "asc" : "desc" @poll_count = @poll_users_list.count @is_new = params[:is_new] ? true : false @has_commit_count = @poll.poll_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 @page = (params['page'] || 1).to_i @poll_users_list = paginateHelper @poll_users_list, @limit respond_to do |format| format.js format.html{render :layout => 'base_edu'} end end def statistics_result poll_questions = @poll.poll_questions member = @course.members.where(:user_id => User.current.id).first if member.present? && member.teacher_course_groups.count > 0 group_ids = member.teacher_course_groups.pluck(:course_group_id) group_students = @course.members.where(:course_group_id => group_ids).joins("join users on members.user_id = users.id").select{|m| m.roles.to_s.include?("Student")} @user_ids = @poll.poll_users.where(:commit_status => 1, :user_id => group_students.map(&:user_id)).map(&:user_id) else @user_ids = @poll.poll_users.where(:commit_status => 1).map(&:user_id) end @poll_questions = paginateHelper poll_questions, 10 respond_to do |format| format.js end end def poll_setting if @poll.polls_status == 1 && @course.course_groups.count > 1 @poll.unified_setting = params[:unified_setting] ? true :false end if @poll.unified_setting params_publish_time = params[:poll_publish_time] params_end_time = params[:poll_end_time] min_publish_time = params_publish_time max_end_time = params_end_time else # 获取最小发布时间和最大截止时间,赋值给homework params_publish_time = params[:poll_publish_time_group] params_end_time = params[:poll_end_time_group] min_publish_time = @poll.publish_time ? (format_time @poll.publish_time).to_s : "" max_end_time = @poll.end_time ? (format_time @poll.end_time).to_s : "" if params[:poll_end_time_group] max_end_time = "" params[:poll_end_time_group].each_with_index do |end_time, index| if end_time != "" if max_end_time == "" max_end_time = end_time end if end_time > max_end_time max_end_time = end_time end end end end if params[:poll_publish_time_group] params[:poll_publish_time_group].each_with_index do |publish_time, index| if publish_time != "" if min_publish_time == "" min_publish_time = publish_time end if publish_time < min_publish_time min_publish_time = publish_time end end end end end if params_publish_time && min_publish_time != "" @poll.publish_time = min_publish_time @poll.end_time = max_end_time if @poll.publish_time < Time.now and @poll.polls_status == 1 @poll.polls_status = 2 create_poll_user = 1 if @poll.course_acts.size == 0 @poll.course_acts << CourseActivity.new(:user_id => @poll.user_id,:course_id => @poll.course_id) end end elsif params_publish_time && min_publish_time == "" create_poll_user = 1 @poll.polls_status = 2 @poll.publish_time = Time.now @poll.end_time = Time.at(((1.month.since.to_i)/3600.0).ceil * 3600) if @poll.course_acts.size == 0 @poll.course_acts << CourseActivity.new(:user_id => @poll.user_id,:course_id => @poll.course_id) end else @poll.end_time = max_end_time if params_end_time end # 不统一设置且分班数大于一则更新分组设置 if !@poll.unified_setting && @course.course_groups.count > 1 @course.course_groups.each_with_index do |group, index| poll_group_setting = @poll.poll_group_settings.where(:course_group_id => group.id).first unless poll_group_setting poll_group_setting = PollGroupSetting.create(:poll_id => @poll.id, :course_group_id => group.id, :course_id => @course.id) end end group_id = [] @poll.poll_group_settings.where("publish_time is null or publish_time > '#{Time.now}'").joins(:course_group).reorder("CONVERT(course_groups.name USING gbk) COLLATE gbk_chinese_ci ASC").each_with_index do |setting, index| if params[:poll_publish_time_group] && min_publish_time != "" if params[:poll_publish_time_group][index] && params[:poll_publish_time_group][index] != "" setting.update_column(:publish_time, params[:poll_publish_time_group][index]) end elsif params[:poll_publish_time_group] && min_publish_time == "" setting.update_column(:publish_time, Time.now) group_id << setting.course_group_id end end @poll.poll_group_settings.where("end_time is null or end_time > '#{Time.now}'").joins(:course_group).reorder("CONVERT(course_groups.name USING gbk) COLLATE gbk_chinese_ci ASC").each_with_index do |setting, index| if params[:poll_end_time_group] && max_end_time != "" if params[:poll_end_time_group][index] && params[:poll_end_time_group][index] != "" setting.update_column(:end_time, params[:poll_end_time_group][index]) end elsif params[:poll_end_time_group] && max_end_time == "" setting.update_column(:end_time, Time.at(((1.month.since.to_i)/3600.0).ceil * 3600)) end end # 统一设置则删除分组设置 elsif @poll.unified_setting @poll.poll_group_settings.destroy_all end @poll.show_result = params[:show_result] ? 1 : 0 @poll.un_anonymous = params[:un_anonymous] ? 1 : 0 if @poll.save if create_poll_user.present? if group_id.present? && group_id.size != 0 if group_id.size == @course.course_groups.count create_polls_tiding @poll, @course.student else members = @course.members.where(:course_group_id => group_id) create_polls_tiding @poll, members end else create_polls_tiding @poll, @course.student end end redirect_to student_poll_list_poll_path(@poll) end end def get_poll_totalcount poll_question @total_questions_count = poll_question.poll_votes.count end def get_poll_everycount poll_answer @every_answer_count = poll_answer.poll_votes.count end def update_question_num @poll_question = PollQuestion.find params[:ques_id] poll_questions = @poll.poll_questions if @poll_question if params[:opr] == 'up' && @poll_question.question_number > 1 @before_que = poll_questions.where("question_number = #{@poll_question.question_number - 1}").first if @before_que && @poll_question.update_attribute('question_number', @poll_question.question_number - 1) @before_que.update_attribute('question_number', @before_que.question_number + 1) end elsif params[:opr] == 'down' && @poll_question.question_number < poll_questions.count @after_que = poll_questions.where("question_number = #{@poll_question.question_number + 1}").first if @after_que && @poll_question.update_attribute('question_number', @poll_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 create_poll_question @last_question = @poll.poll_questions.last question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title] option = { :is_necessary => (params[:is_necessary] == "1" ? 1 : 0), :question_title => question_title, :question_type => params[:question_type] || 1, :question_number => @poll.poll_questions.count + 1, :max_choices => params[:max_choices].to_i || 0, :min_choices => params[:min_choices].to_i || 0 } @poll_questions = @poll.poll_questions.new option if params[:question_answer] for i in 1..params[:question_answer].count answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1] question_option = { :answer_position => i, :answer_text => answer } @poll_questions.poll_answers.new question_option end end if params[:question_other_answer] question_option = { :answer_position => params[:question_answer].count + 1, :answer_text => '' } @poll_questions.poll_answers.new question_option end # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1 if params[:quest_id] != "0" insert_poll = PollQuestion.find params[:quest_id] if insert_poll @is_insert = true ques_num = insert_poll.question_number @poll.poll_questions.where("question_number > #{ques_num}").update_all(" question_number = question_number + 1") @poll_question_num = ques_num @poll_questions.question_number = ques_num + 1 end end if @poll_questions.save respond_to do |format| format.js end end end #修改题目 def update_poll_question @poll_question = PollQuestion.find params[:poll_question] @poll = @poll_question.poll @poll_question.question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title] @poll_question.max_choices = params[:max_choices].to_i || 0 @poll_question.min_choices = params[:min_choices].to_i || 0 ################处理选项 if params[:question_answer] @poll_question.poll_answers.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 = @poll_question.poll_answers.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.answer_position = i question.answer_text = answer question.save else question_option = { :answer_position => i, :answer_text => answer } @poll_question.poll_answers.new question_option end end if params[:question_other_answer] question = @poll_question.poll_answers.where("answer_text = ''").first unless question question_option = { :answer_position => params[:question_answer].count + 1, :answer_text => '' } @poll_question.poll_answers.new question_option end else question = @poll_question.poll_answers.where("answer_text = ''").first if question question.destroy end end end @poll_question.save respond_to do |format| format.js end end #删除题目 def delete_poll_question @poll_question = PollQuestion.find params[:poll_question] @poll = @poll_question.poll @poll.poll_questions.where("question_number>?",@poll_question.question_number).update_all("question_number = question_number - 1") if @poll_question && @poll_question.destroy respond_to do |format| format.js end end end def publish_notice if @poll.publish_time @status = 1 else @status = 0 end if @course.course_groups.count > 1 if @poll.unified_setting @groups = @course.course_groups else @groups = @course.course_groups.where(:id => @poll.poll_group_settings.where("publish_time is null or publish_time > '#{Time.now}'").map(&:course_group_id)) end @all_groups = @groups @groups = paginateHelper @groups, 5 end end #发布问卷 def publish_poll if @poll.polls_status == 1 if params[:group_ids] if @course.course_groups.where(:id => params[:group_ids].split(",")).count == @course.course_groups.count @poll.poll_group_settings.destroy_all @poll.update_attribute("unified_setting", true) # 发消息 create_polls_tiding @poll, @course.student else @poll.update_attribute("unified_setting", false) @course.course_groups.each do |group| poll_group_setting = @poll.poll_group_settings.where(:course_group_id => group.id).first unless poll_group_setting PollGroupSetting.create(:poll_id => @poll.id, :course_group_id => group.id, :course_id => @course.id, :publish_time => @poll.publish_time, :end_time => @poll.end_time) end end @poll.poll_group_settings.where(:course_group_id => params[:group_ids].split(",")).update_all(:publish_time => Time.now) @poll.poll_group_settings.where(:course_group_id => params[:group_ids].split(","), :end_time => nil).update_all(:end_time => Time.at(((1.month.since.to_i)/3600.0).ceil * 3600)) # 发消息 members = @course.members.where(:course_group_id => params[:group_ids].split(",")) create_polls_tiding @poll, members end else @poll.poll_group_settings.destroy_all # 发消息 create_polls_tiding @poll, @course.student end @poll.polls_status = 2 @poll.publish_time = Time.now if @poll.end_time.nil? @poll.end_time = Time.at(((1.month.since.to_i)/3600.0).ceil * 3600) elsif PollGroupSetting.where("poll_id = #{@poll.id} and end_time is not null").count > 0 @poll.update_attribute("end_time", PollGroupSetting.where("poll_id = #{@poll.id} and end_time is not null").map(&:end_time).max) end if @poll.save # create_polls_list @poll if @poll.course_acts.size == 0 @poll.course_acts << CourseActivity.new(:user_id => @poll.user_id,:course_id => @poll.course_id) end end else @poll.poll_group_settings.where(:course_group_id => params[:group_ids].split(",")).update_all(:publish_time => Time.now) @poll.poll_group_settings.where(:course_group_id => params[:group_ids].split(","), :end_time => nil).update_all(:end_time => Time.at(((1.month.since.to_i)/3600.0).ceil * 3600)) if PollGroupSetting.where("poll_id = #{@poll.id} and end_time is not null").count > 0 @poll.update_attribute("end_time", PollGroupSetting.where("poll_id = #{@poll.id} and end_time is not null").map(&:end_time).max) end members = @course.members.where(:course_group_id => params[:group_ids].split(",")) create_polls_tiding @poll, members end if @poll.end_time > Time.now && @poll.polls_status > 2 @poll.update_attribute("polls_status", 2) end redirect_to student_poll_list_poll_path(@poll) end def end_notice if @course.course_groups.count > 1 unless @poll.unified_setting @groups = @course.course_groups.where(:id => @poll.poll_group_settings.where("publish_time < '#{Time.now}' and end_time > '#{Time.now}'").map(&:course_group_id)) @all_groups = @groups @groups = paginateHelper @groups, 5 end end end #关闭问卷 def close_poll time = Time.now poll_users = @poll.poll_users.where("0=1") # if @poll.polls_status == 2 && @poll.end_time > Time.now if params[:group_ids] # @poll.poll_group_settings.where(:course_group_id => params[:group_id]).where("publish_time > '#{Time.now}' or publish_time is null").update_all(:publish_time => time) @poll.poll_group_settings.where(:course_group_id => params[:group_ids].split(",")).update_all(:end_time => time) poll_users = @poll.poll_users.where(:user_id => @course.members.where(:course_group_id => params[:group_ids].split(",")).map(&:user_id)) @poll.update_attribute("end_time", PollGroupSetting.where("poll_id = #{@poll.id} and end_time is not null").map(&:end_time).max) if @poll.end_time > Time.now && @poll.polls_status > 2 @poll.update_attribute("polls_status", 2) elsif @poll.end_time <= Time.now && @poll.polls_status == 2 @poll.update_attribute("polls_status", 3) end elsif @poll.unified_setting poll_users = @poll.poll_users @poll.update_attributes(:polls_status => 3, :end_time => time) end poll_users.each do |poll_user| if poll_user.commit_status == 0 && !poll_user.start_at.nil? poll_user.update_attributes(:commit_status => 1, :end_at => Time.now) end end # end redirect_to student_poll_list_poll_path(@poll) end #保存问卷 def save_poll @poll.show_result = params[:show_result].to_i if @poll.save respond_to do |format| format.js end end end #提交答案 def commit_answer pq = PollQuestion.find(params[:poll_question_id]) poll_user = PollUser.where(:poll_id => @poll.id, :user_id => User.current.id).first if (poll_user && poll_user.commit_status == 1) || @poll.end_time < Time.now render :json => {:text => "Over"} return end if pq.question_type == 1 #单选题 pv = PollVote.find_by_poll_question_id_and_user_id(params[:poll_question_id],User.current.id) if pv.nil? #尚未答该题,添加答案 pv = PollVote.new pv.user_id = User.current.id pv.poll_question_id = params[:poll_question_id] end #修改该题对应答案 pv.poll_answer_id = params[:poll_answer_id] pv.vote_text = params[:vote_text] ? params[:vote_text] : "" if pv.save #保存成功返回成功信息及当前以答题百分比 @percent = get_percent(@poll,User.current) render :json => {:text => "ok" ,:percent => format("%.2f" ,@percent)} else #返回失败信息 render :json => {:text => "failure"} end elsif pq.question_type == 2 #多选题 pv = PollVote.find_by_poll_answer_id_and_user_id(params[:poll_answer_id],User.current.id) if pv.nil? #尚未答该题,添加答案 count = PollVote.where("poll_question_id = #{params[:poll_question_id].to_i} and user_id = #{User.current.id}").count if pq.max_choices != 0 && count >= pq.max_choices render :json => {:text => "over"} else pv = PollVote.new pv.user_id = User.current.id pv.poll_question_id = params[:poll_question_id] pv.poll_answer_id = params[:poll_answer_id] pv.vote_text = params[:vote_text] if params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => "ok",:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end else #pv不为空,则当前选项之前已被选择,再次点击则是不再选择该项,故删除该答案 if params[:vote_text] pv.vote_text = params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => "ok",:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end else if pv.delete @percent = get_percent(@poll,User.current) render :json => {:text => "false" ,:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end end elsif pq.question_type == 3 #单行文本 pv = PollVote.find_by_poll_question_id_and_user_id(params[:poll_question_id],User.current.id) if pv.nil? #pv为空之前尚未答题,添加答案 if params[:vote_text].nil? || params[:vote_text].blank? #用户提交空答案,视作不作答 @percent = get_percent(@poll,User.current) render :json => {:text => "",:percent => format("%.2f" ,@percent)} else #添加答案 pv = PollVote.new pv.user_id = User.current.id pv.poll_question_id = params[:poll_question_id] pv.vote_text = params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => pv.vote_text,:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end else #pv不为空说明用户之前已作答 if params[:vote_text].nil? || params[:vote_text].blank? #用户提交空答案,视为删除答案 if pv.delete @percent = get_percent(@poll,User.current) render :json => {:text => "",:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end else #用户修改答案 pv.vote_text = params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => pv.vote_text,:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end end elsif pq.question_type == 4 #多行文本题 pv = PollVote.find_by_poll_question_id_and_poll_answer_id_and_user_id(params[:poll_question_id],params[:poll_answer_id],User.current.id) if pv.nil? #pv为空之前尚未答题,添加答案 if params[:vote_text].nil? || params[:vote_text].blank? #用户提交空答案,视作不作答 @percent = get_percent(@poll,User.current) render :json => {:text => "",:percent => format("%.2f" ,@percent)} else #添加答案 pv = PollVote.new pv.user_id = User.current.id pv.poll_question_id = params[:poll_question_id] pv.poll_answer_id = params[:poll_answer_id] pv.vote_text = params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => pv.vote_text,:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end else #pv不为空说明用户之前已作答 if params[:vote_text].nil? || params[:vote_text].blank? #用户提交空答案,视为删除答案 if pv.delete @percent = get_percent(@poll,User.current) render :json => {:text => "",:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end else #用户修改答案 pv.vote_text = params[:vote_text] if pv.save @percent = get_percent(@poll,User.current) render :json => {:text => pv.vote_text,:percent => format("%.2f" ,@percent)} else render :json => {:text => "failure"} end end end else render :json => {:text => "failure"} end end #提交问卷 def commit_poll @uncomplete_question = get_uncomplete_question(@poll,User.current) if @uncomplete_question.count < 1 pu = @poll.poll_users.where(:user_id => User.current.id).first pu.commit_status = 1 pu.end_at = Time.now if pu.save @status = 0 #提交成功 tid_str = "" member = @course.members.where(:user_id => User.current.id).first teachers = tiding_teachers @course, member teachers.find_each do |mem| tid_str += "," if tid_str != "" tid_str += "(#{mem.user_id}, #{User.current.id}, #{@poll.id}, 'Poll', #{@poll.id}, 'CommitPoll', #{@course.id}, 'Course', 0, 'Poll', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')" end tid_sql = "insert into tidings (user_id, trigger_user_id, container_id, container_type, parent_container_id, parent_container_type, belong_container_id, belong_container_type, viewed, tiding_type, created_at, updated_at) values" + tid_str ActiveRecord::Base.connection.execute tid_sql else @status = 2 #未知错误 end else @status = 1 #有未做得必答题 end respond_to do |format| format.js end end def import_poll @poll = Poll.find(params[:to_id]) question_num = @poll.poll_questions.select("max(question_number) question_number").first.question_number import_poll = Poll.find(params[:import_id]) import_poll.poll_questions.each_with_index do |question,index| option = { :is_necessary => question.is_necessary, :question_title => question.question_title, :question_type => question.question_type, :question_number => question_num + index+1 } poll_questions = @poll.poll_questions.new option for i in 1..question.poll_answers.count answer = question.poll_answers[i-1][:answer_text] question_option = { :answer_position => i, :answer_text => answer } poll_questions.poll_answers.new question_option end @poll.poll_questions << poll_questions end if @poll.save @poll = Poll.find(params[:to_id]) respond_to do |format| format.js end end end def cancel_publish ActiveRecord::Base.transaction do @poll.poll_users.destroy_all PollVote.where(:poll_question_id => @poll.poll_questions.pluck(:id)).destroy_all @poll.update_attributes(:polls_status => 1, :publish_time => nil, :end_time => nil, :unified_setting => 1) @poll.poll_group_settings.destroy_all @poll.course_acts.destroy_all @poll.tidings.destroy_all create_polls_list @poll end redirect_to student_poll_list_poll_path(@poll) end #显示某个学生某份问卷的填写结果 def poll_result @poll_questions = @poll.poll_questions @left_nav_type = 7 respond_to do |format| format.html{render :layout => 'base_courses'} end end def set_public if User.current.admin? || User.current.allowed_to?(:as_teacher, @course) @poll.update_attributes(:is_public => true) end end def add_to_exercise_bank exercise_bank = User.current.exercise_banks.where(:container_id => @poll.id, :container_type => "Poll").first if exercise_bank.present? exercise_bank.update_attributes(:name => @poll.polls_name, :description => @poll.polls_description, :course_list_id => @poll.course.try(:course_list_id)) question_bank = QuestionBank.where(:container_id => exercise_bank.id, :container_type => exercise_bank.container_type).first question_bank.update_attributes(:name => exercise_bank.name, :course_list_id => exercise_bank.course_list_id) if question_bank.present? exercise_bank.exercise_bank_questions.destroy_all else exercise_bank = ExerciseBank.new(:name => @poll.polls_name, :description => @poll.polls_description, :user_id => User.current.id, :is_public => 0, :course_list_id => @poll.course.try(:course_list_id), :container_id => @poll.id, :container_type => "Poll", :quotes => 1) if exercise_bank.save QuestionBank.create(:name => exercise_bank.name, :container_id => exercise_bank.id, :container_type => exercise_bank.container_type, :quotes => exercise_bank.quotes, :user_id => exercise_bank.user_id, :is_public => exercise_bank.is_public, :course_list_id => exercise_bank.course_list_id) end end @poll.poll_questions.each do |q| option = { :question_title => q[:question_title], :question_type => q[:question_type] || 1, :is_necessary => q[:is_necessary], :question_number => q[:question_number], :max_choices => q[:max_choices], :min_choices => q[:min_choices] } exercise_bank_question = exercise_bank.exercise_bank_questions.new option for i in 1..q.poll_answers.count choice_option = { :choice_position => i, :choice_text => q.poll_answers[i-1][:answer_text] } exercise_bank_question.exercise_bank_choices.new choice_option end end exercise_bank.save end #导出问卷 def export_poll poll_questions = @poll.poll_questions respond_to do |format| format.xls { send_data(poll_to_xls(poll_questions), :type => "text/excel;charset=utf-8; header=present", :filename => filename_for_content_disposition("#{@poll.polls_name}.xls") ) } end end # 将题库的问卷导出来 def other_poll @search = params[:search] ? params[:search].to_s.strip.downcase : "" if(params[:type].blank? || params[:type] == "1") #我的题库 @polls = User.current.exercise_banks.where(:container_type => "Poll") elsif params[:type] == "2" #公共题库 @polls = ExerciseBank.where(:container_type => "Poll", :is_public => true) end @type = params[:type] || "1" if @search.present? course_list_ids = CourseList.where("name like '%#{@search}%'").map(&:id) course_list_ids = course_list_ids.length == 0 ? "(-1)" : "("+ course_list_ids.join(",") +")" @polls = @polls.where("name like '%#{@search}%' or course_list_id in #{course_list_ids}").reorder("created_at desc") else @polls = @polls.reorder("created_at desc") end @course_id = params[:course_id] @polls = paginateHelper @polls,8 @page = params[:page].nil? ? 1 : params['page'].to_i poll_count = @polls.count @total_pages = (poll_count / 8.0).ceil respond_to do |format| format.js end end # 将问卷导入本课程 def import_other_poll course_id = params[:course_id] course = Course.find(course_id) if params[:poll_id] poll = ExerciseBank.find(params[:poll_id]) @poll = quote_poll_bank poll, course if @poll redirect_to student_poll_list_poll_path(@poll, :tab => 4) end end end private def remove_invalid_poll(course) polls = Poll.where("polls_type = 'Course' and course_id = #{course.id} and polls_name = ''") unless polls.empty? polls.each do |poll| if poll.poll_questions.empty? poll.destroy end end end end def find_poll_and_course @poll = Poll.find params[:id] @course = Course.find @poll.course_id rescue Exception => e render_404 end def find_container @course = Course.find params[:course_id] rescue Exception => e render_404 end def is_logged redirect_to signin_path unless User.current.logged? end def is_member_of_course render_403 unless(@course && (User.current.member_of_course?(@course) || User.current.admin?)) end def is_course_teacher @is_teacher = User.current.allowed_to?(:as_teacher,@course) render_403 unless(@course && @is_teacher) end #获取未完成的题目 def get_uncomplete_question poll,user necessary_questions = poll.poll_questions.where("#{PollQuestion.table_name}.is_necessary = 1") uncomplete_question = [] necessary_questions.each do |question| answers = get_user_answer(question,user) if question.question_type != 4 if answers.nil? || answers.count < 1 uncomplete_question << question end else if answers.nil? || answers.count < question.poll_answers.count uncomplete_question << question end end # if answers.nil? || answers.count < 1 # uncomplete_question << question # end end uncomplete_question end #获取用户对某个问题的答案 def get_user_answer(question,user) user_answer = question.poll_votes.where("#{PollVote.table_name}.user_id = #{user.id}") user_answer end def get_complete_question(poll,user) questions = poll.poll_questions.includes(:poll_votes) complete_question = [] questions.each do |question| answers = question.poll_votes.select{|e| e.user_id == user.id} if !(answers.empty? || answers.count < 1) complete_question << question end # if question.question_type != 4 # if !(answers.nil? || answers.count < 1) # complete_question << question # end # else # end end complete_question end def get_percent poll,user if poll.poll_questions.count == 0 return 0 else complete_count = get_complete_question(poll,user).count all_count = poll.poll_questions.where("question_type != 4").count # poll.poll_questions.where("question_type = 4").each do |pq| # all_count += pq.poll_answers.count # end return (complete_count.to_f / all_count.to_f)*100 end end #PollUser记录用户是否已提交问卷有对应的记录则已提交,没有则新建一个 def get_poll_user poll_id,user_id pu = PollUser.find_by_poll_id_and_user_id(poll_id,user_id) if pu.nil? pu = PollUser.new end pu end #将poll中题目转换为Excel def poll_to_xls poll_questions xls_report = StringIO.new book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet :name => "poll" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 count_row = 0 member = @course.members.where(:user_id => User.current.id).first if member.present? && member.teacher_course_groups.count > 0 group_ids = member.teacher_course_groups.pluck(:course_group_id) group_students = @course.members.where(:course_group_id => group_ids).joins("join users on members.user_id = users.id").select{|m| m.roles.to_s.include?("Student")} poll_users = @poll.poll_users.where(:commit_status => 1, :user_id => group_students.map(&:user_id)) else poll_users = @poll.poll_users.where(:commit_status => 1) end poll_questions.each do |poll_question| if poll_question.question_type == 1 || poll_question.question_type == 2 sheet1.row(count_row).default_format = blue sheet1[count_row,0]= l(:label_poll_question_num,:num => poll_question.question_number) sheet1[count_row + 1,0] = l(:label_poll_subtotal) sheet1[count_row + 2,0] = l(:label_poll_proportion) poll_question.poll_answers.each_with_index do |poll_answer,i| sheet1[count_row, i + 1] = poll_answer.answer_text == "" ? l(:label_poll_other) : poll_answer.answer_text.gsub(/<\/?.*?>/,"").gsub(/ /," ") sheet1[count_row + 1, i + 1] = poll_answer.poll_votes.where(:user_id => poll_users.map(&:user_id)).count sheet1[count_row + 2, i + 1] = statistics_result_percentage(poll_answer.poll_votes.where(:user_id => poll_users.map(&:user_id)).count, total_answer(poll_question.id, poll_users.map(&:user_id))).to_s + "%" end sheet1[count_row + 3,0] = l(:label_poll_valid_commit) sheet1[count_row + 3,1] = total_answer(poll_question.id, poll_users.map(&:user_id)) count_row += 5 else sheet1.row(count_row).default_format = blue sheet1[count_row,0] = l(:label_poll_question_num,:num => poll_question.question_number) sheet1[count_row,1] = poll_question.question_title count_row += 1 if poll_question.question_type == 3 poll_question.poll_votes.where(:user_id => poll_users.map(&:user_id)).each do |poll_vote| sheet1[count_row,0] = poll_vote.vote_text.gsub(/<\/?.*?>/,"").gsub(/ /," ") count_row += 1 end count_row += 1 else count = 0 poll_question.poll_answers.reorder("answer_position asc").each_with_index do |poll_answer,i| sheet1.row(count_row).default_format = blue sheet1[count_row, i] = poll_answer.answer_text.gsub(/<\/?.*?>/,"").gsub(/ /," ") count = poll_question.poll_votes.where(:poll_answer_id => poll_answer.id, :user_id => poll_users.map(&:user_id)).count > count ? poll_question.poll_votes.where(:poll_answer_id => poll_answer.id, :user_id => poll_users.map(&:user_id)).count : count poll_question.poll_votes.where(:poll_answer_id => poll_answer.id, :user_id => poll_users.map(&:user_id)).each_with_index do |poll_vote, j| sheet1[count_row + j + 1,i] = poll_vote.vote_text.gsub(/<\/?.*?>/,"").gsub(/ /," ") end end count_row = count_row + count + 2 end end end sheet1.row(count_row).default_format = blue sheet1[count_row ,0] = l(:label_bidding_number) if @poll.un_anonymous sheet1[count_row, 1] = l(:label_bidding_user_studentname) current_index = 2 else current_index = 1 end poll_questions.each do |poll_question| if poll_question.question_type == 4 poll_question.poll_answers.reorder("answer_position asc").each do |ans| sheet1[count_row ,current_index] = poll_question.question_title + "(#{ans.answer_text})" current_index += 1 end else sheet1[count_row ,current_index] = poll_question.question_title current_index += 1 end end count_row += 1 poll_users.reorder("end_at desc").each_with_index do |poll_user, index| user = poll_user.user sheet1[count_row ,0] = index + 1 if @poll.un_anonymous sheet1[count_row, 1] = user.show_real_name current_index = 2 else current_index = 1 end poll_questions.each_with_index do |poll_question, i| if poll_question.question_type == 1 || poll_question.question_type == 2 sheet1[count_row ,current_index] = user.poll_votes.where(:poll_question_id => poll_question.id).map{|poll_vote| (poll_vote.poll_answer.answer_text != "" ? poll_vote.poll_answer.answer_text.gsub(/<\/?.*?>/,"").gsub(/ /," ") : l(:label_other_answer) + " (" + poll_vote.vote_text.to_s + ") ") if poll_vote.poll_answer}.join(";") current_index += 1 elsif poll_question.question_type == 3 sheet1[count_row ,current_index] = user.poll_votes.where(:poll_question_id => poll_question.id).map{|poll_vote| poll_vote.vote_text.gsub(/<\/?.*?>/,"").gsub(/ /," ")}.join(";") current_index += 1 else poll_question.poll_answers.reorder("answer_position asc").each do |ans| poll_vote = user.poll_votes.where(:poll_question_id => poll_question.id, :poll_answer_id => ans.id).first sheet1[count_row ,current_index] = poll_vote.nil? ? "" : poll_vote.vote_text current_index += 1 end end end count_row += 1 end book.write xls_report xls_report.string end end