You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/lib/tasks/exercise_publish.rake

251 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#coding=utf-8
namespace :exercise_publish do
desc "publish exercise and end exercise"
def get_mulscore(question, user)
ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
arr = []
ecs.each do |ec|
arr << ec.exercise_choice.choice_position
end
#arr = arr.sort
str = arr.sort.join("")
return str
end
def tran_base64_decode64 str
if str.blank?
str
else
s_size = str.size % 4
if s_size != 0
str += "=" * (4 - s_size)
end
Base64.decode64(str.tr("-_", "+/")).force_encoding("utf-8")
end
end
#计算试卷的总分和试卷的答题状态
# def calculate_student_score(exercise,user)
# score1 = 0.0 #选择题/判断题
# score2 = 0.0 #填空题
# score5 = 0.0 #实训题
# ques_stand = [] #问题是否正确
# exercise_questions = exercise.exercise_questions
# exercise_questions.each do |q|
# if q.question_type != 5
# answers_content = q.exercise_answers.search_answer_users("user_id",user.id) #学生的答案
# else
# answers_content = q.exercise_shixun_answers.search_shixun_answers("user_id",user.id) #学生的答案
# end
# if q.question_type <= 2 #为选择题或判断题时
# answer_choice_array = []
# answers_content.each do |a|
# answer_choice_array.push(a.exercise_choice.choice_position) #学生答案的位置
# end
# user_answer_content = answer_choice_array.sort
# standard_answer = q.exercise_standard_answers.pluck(:exercise_choice_id).sort #该问题的标准答案,可能有多个
# if user_answer_content == standard_answer #答案一致,多选或单选才给分,答案不对不给分
# if standard_answer.count > 0
# multi_each_score = (q.question_score / standard_answer.count) #当多选答案正确时每个answer的分数均摊。
# else
# multi_each_score = 0.0
# end
# answers_content.update_all(:score => multi_each_score)
# score1 = score1 + q.question_score
# end
# elsif q.question_type == 3 #填空题
# null_standard_answer = q.exercise_standard_answers
# standard_answer_array = null_standard_answer.select(:exercise_choice_id,:answer_text)
# standard_answer_ids = standard_answer_array.pluck(:exercise_choice_id).reject(&:blank?).uniq #标准答案的exercise_choice_id数组
# standard_answer_count = standard_answer_ids.count
# if standard_answer_count > 0 #存在标准答案时才有分数
# each_standard_score = (q.question_score.to_f / standard_answer_count).round(1) #每一空的得分
# else
# each_standard_score = 0.0
# end
# if q.is_ordered
# answers_content.each do |u|
# i_standard_answer = standard_answer_array.where(exercise_choice_id:u.exercise_choice_id).pluck(:answer_text).reject(&:blank?).map!(&:downcase) #该选项的全部标准答案
# if i_standard_answer.include?(u.answer_text.downcase) #该空的标准答案包含用户的答案才有分数
# u.update_attribute("score",each_standard_score)
# score2 = score2 + each_standard_score
# end
# end
# else
# st_answer_text = standard_answer_array.pluck(:answer_text).reject(&:blank?).map!(&:downcase)
# answers_content.each do |u|
# u_answer_text = u.answer_text.downcase
# if st_answer_text.include?(u_answer_text) #只要标准答案包含用户的答案,就有分数。同时,下一次循环时,就会删除该标准答案。防止用户的相同答案获分
# u.update_attribute("score",each_standard_score)
# score2 = score2 + each_standard_score
# st_answer_text.delete(u_answer_text)
# end
# end
# end
# elsif q.question_type == 5 #实训题时,主观题这里不评分
# q.exercise_shixun_challenges.each do |exercise_cha|
# game = Game.user_games(user.id,exercise_cha.challenge_id).first #当前用户的关卡
# if game.present?
# exercise_cha_score = 0
# answer_status = 0
# cha_path = challenge_path exercise_cha.challenge.path
# if game.status == 2 && game.final_score >= 0
# exercise_cha_score = game.real_score exercise_cha.question_score #每一关卡的得分
# answer_status = 1
# end
# if exercise_cha.exercise_shixun_answers.search_shixun_answers("user_id",user.id).blank? #把关卡的答案存入试卷的实训里
# game_challenge = game.game_codes.search_challenge_path(cha_path).first
# if game_challenge.present?
# game_code = game_challenge
# code = game_code.try(:new_code)
# else
# code = git_fle_content(exercise_cha.shixun.repo_path,cha_path)
# end
# sx_option = {
# :exercise_question_id => q.id,
# :exercise_shixun_challenge_id => exercise_cha.id,
# :user_id => user.id,
# :score => exercise_cha_score,
# :answer_text => code,
# :status => answer_status
# }
# ex_shixun_answer = ExerciseShixunAnswer.new(sx_option)
# ex_shixun_answer.save!
# end
# score5 += exercise_cha_score
# end
# end
# end
# user_scores = answers_content.score_reviewed.pluck(:score).sum
# if user_scores > 0
# stand_answer = 1
# else
# stand_answer = 0
# end
# ques_option = {
# "q_id":q.id, #该问题的id
# "q_type":q.question_type,
# "q_position":q.question_number, #该问题的位置
# "stand_status":stand_answer, #该问题是否正确,1为正确0为错误
# "user_score":user_scores #每个问题的总得分
# }
# ques_stand.push(ques_option)
# end
# total_score = score1 + score2 + score5
# {
# "total_score":total_score,
# "stand_status":ques_stand
# }
# end
task :publish => :environment do
Rails.logger.info("log--------------------------------exercise_publish start")
puts "--------------------------------exercise_publish start"
exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
exercises.each do |exercise|
exercise.update_column('exercise_status', 2)
course = exercise.course
tid_str = ""
course.teachers.find_each do |member|
tid_str += "," if tid_str != ""
tid_str += "(#{member.user_id}, #{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
if exercise.unified_setting
course.student.find_each do |student|
tid_str += "," if tid_str != ""
tid_str += "(#{student.student_id}, #{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
end
if tid_str != ""
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
end
if exercise.exercise_users.count == 0
str = ""
course.student.find_each do |student|
str += "," if str != ""
str += "(#{student.user_id}, #{exercise.id}, 0, '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
if str != ""
sql = "insert into exercise_users (user_id, exercise_id, commit_status, created_at, updated_at) values" + str
ActiveRecord::Base.connection.execute sql
end
end
if exercise.course_acts.size == 0
exercise.course_acts << CourseActivity.new(:user_id => exercise.user_id,:course_id => exercise.course_id)
end
end
# 分组设置发布时间的测验
exercise_group_settings = ExerciseGroupSetting.where("publish_time < ? and publish_time > ?", Time.now + 1800, Time.now - 1800)
exercise_group_settings.each do |exercise_group|
exercise = exercise_group.exercise
if exercise.present?
course = exercise.course
exercise.update_attributes(:exercise_status => 2) if exercise.exercise_status == 1
tid_str = ""
members = course.students.where(:course_group_id => exercise_group.course_group_id)
members.find_each do |member|
tid_str += "," if tid_str != ""
tid_str += "(#{member.user_id},#{exercise.user_id}, #{exercise.id}, 'Exercise', #{exercise.id}, 'ExercisePublish', #{course.id}, 'Course', 0, 'Exercise', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')"
end
if tid_str != ""
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
end
end
end
Rails.logger.info("log--------------------------------exercise_publish end")
puts "--------------------------------exercise_publish end"
end
task :end => :environment do
# include ExercisesHelper
# include ApplicationController
exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now)
exercises.each do |exercise|
course = exercise.course
exercise.update_column('exercise_status', 3)
exercise.exercise_users.each do |exercise_user|
if exercise_user.commit_status == 0 && !exercise_user.start_at.nil?
exercise_user.update_attributes(:commit_status => 1, :end_at => Time.now, :status => true)
s_score = calculate_student_score(exercise, exercise_user.user)[:total_score]
exercise_user.update_attributes(:objective_score => s_score, :score => (s_score + (exercise_user.subjective_score && exercise_user.subjective_score > 0 ? exercise_user.subjective_score : 0)))
if exercise_user.user.exercise_answers.where(:exercise_question_id => exercise.exercise_questions.where(:question_type => 4).map(&:id)).empty?
exercise_user.update_attributes(:subjective_score => 0)
end
end
end
end
all_exercises = Exercise.where("end_time > ? and exercise_status = 2",Time.now)
exercise_ids = all_exercises.blank? ? "(-1)" : "(" + all_exercises.map(&:id).join(",") + ")"
ExerciseGroupSetting.where("end_time <= '#{Time.now}' and exercise_id in #{exercise_ids}").each do |exercise_setting|
exercise = exercise_setting.exercise
users = exercise.course.students.where(:course_group_id => exercise_setting.course_group_id)
exercise_users = exercise.exercise_users.where(:user_id => users.map(&:user_id))
exercise_users.each do |exercise_user|
if exercise_user.commit_status == 0 && !exercise_user.start_at.nil?
exercise_user.update_attributes(:commit_status => 1, :end_at => Time.now, :status => true)
s_score = calculate_student_score(exercise, exercise_user.user)[:total_score]
exercise_user.update_attributes(:objective_score => s_score, :score => (s_score + (exercise_user.subjective_score && exercise_user.subjective_score > 0 ? exercise_user.subjective_score : 0)))
if exercise_user.user.exercise_answers.where(:exercise_question_id => exercise.exercise_questions.where(:question_type => 4).map(&:id)).empty?
exercise_user.update_attributes(:subjective_score => 0)
end
end
end
end
Rails.logger.info("log--------------------------------exercise_end completed")
end
end