Merge branch 'dev_course' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_course

dev_course
daiao 6 years ago
commit 209d5693bb

@ -5,6 +5,8 @@ class ApplicationController < ActionController::Base
include RenderExpand include RenderExpand
include RenderHelper include RenderHelper
include ControllerRescueHandler include ControllerRescueHandler
include GitHelper
include LoggerHelper
protect_from_forgery prepend: true, unless: -> { request.format.json? } protect_from_forgery prepend: true, unless: -> { request.format.json? }
@ -202,55 +204,6 @@ class ApplicationController < ActionController::Base
# end # end
end end
# 版本库目录空间
def repo_namespace(user_login, shixun_identifier)
"#{user_login}/#{shixun_identifier}.git"
end
# 版本库文件内容,带转码
def git_fle_content(repo_path, path)
begin
content = GitService.file_content(repo_path: repo_path, path: path)["content"]
logger.info("@@@@@@@@@@@@@@@@@@#{content}")
decode_content = nil
if content.present?
content = Base64.decode64(content)
cd = CharDet.detect(content)
logger.info "encoding: #{cd['encoding']} confidence: #{cd['confidence']}"
decode_content =
if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8
content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '})
else
content.force_encoding('UTF-8')
end
end
decode_content
rescue Exception => e
uid_logger_error(e.message)
raise Educoder::TipException.new("文档内容获取异常")
end
end
# 更新文件代码
# content 文件内容message提交描述
def update_file_content(content, repo_path, path, mail, username, message)
GitService.update_file(repo_path: repo_path, file_path: path, message: message,
content: content, author_name: username, author_email: mail)
end
# 版本库Fork功能
def project_fork(container, original_rep_path, username)
raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank?
# 将要生成的仓库名字
new_repo_name = "#{username}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}"
uid_logger("start fork container: repo_name is #{new_repo_name}")
GitService.fork_repository(repo_path: original_rep_path, fork_repository_path: (new_repo_name + ".git"))
container.update_attributes!(:repo_name => new_repo_name)
end
def start_user_session(user) def start_user_session(user)
session[:user_id] = user.id session[:user_id] = user.id
session[:ctime] = Time.now.utc.to_i session[:ctime] = Time.now.utc.to_i
@ -258,6 +211,8 @@ class ApplicationController < ActionController::Base
end end
def user_setup def user_setup
# reacct静态资源加载不需要走这一步
return if params[:controller] == "main"
# Find the current user # Find the current user
User.current = find_current_user User.current = find_current_user
uid_logger("user_step: " + (User.current.logged? ? "#{User.current.try(:login)} (id=#{User.current.try(:id)})" : "anonymous")) uid_logger("user_step: " + (User.current.logged? ? "#{User.current.try(:login)} (id=#{User.current.try(:id)})" : "anonymous"))
@ -330,16 +285,6 @@ class ApplicationController < ActionController::Base
end end
end end
# 以用户id开始的日志定义
def uid_logger(message)
Rails.logger.info("##:#{current_user.try(:id)} --#{message}")
end
# 以用户id开始的日志定义
def uid_logger_error(message)
Rails.logger.error("##:#{current_user.try(:id)} --#{message}")
end
## 输出错误信息 ## 输出错误信息
def error_status(message = nil) def error_status(message = nil)
@status = -1 @status = -1

@ -0,0 +1,52 @@
module GitHelper
extend ActiveSupport::Concern
# 版本库目录空间
def repo_namespace(user_login, shixun_identifier)
"#{user_login}/#{shixun_identifier}.git"
end
# 版本库文件内容,带转码
def git_fle_content(repo_path, path)
begin
content = GitService.file_content(repo_path: repo_path, path: path)["content"]
logger.info("@@@@@@@@@@@@@@@@@@#{content}")
decode_content = nil
if content.present?
content = Base64.decode64(content)
cd = CharDet.detect(content)
logger.info "encoding: #{cd['encoding']} confidence: #{cd['confidence']}"
decode_content =
if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8
content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '})
else
content.force_encoding('UTF-8')
end
end
decode_content
rescue Exception => e
uid_logger_error(e.message)
raise Educoder::TipException.new("文档内容获取异常")
end
end
# 更新文件代码
# content 文件内容message提交描述
def update_file_content(content, repo_path, path, mail, username, message)
GitService.update_file(repo_path: repo_path, file_path: path, message: message,
content: content, author_name: username, author_email: mail)
end
# 版本库Fork功能
def project_fork(container, original_rep_path, username)
raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank?
# 将要生成的仓库名字
new_repo_name = "#{username}/#{container.try(:identifier)}#{ Time.now.strftime("%Y%m%d%H%M%S")}"
uid_logger("start fork container: repo_name is #{new_repo_name}")
GitService.fork_repository(repo_path: original_rep_path, fork_repository_path: (new_repo_name + ".git"))
container.update_attributes!(:repo_name => new_repo_name)
end
end

@ -0,0 +1,16 @@
module LoggerHelper
extend ActiveSupport::Concern
extend LoggerHelper
# 以用户id开始的日志定义
def uid_logger(message)
Rails.logger.info("##:#{current_user.try(:id)} --#{message}")
end
# 以用户id开始的日志定义
def uid_logger_error(message)
Rails.logger.error("##:#{current_user.try(:id)} --#{message}")
end
end

@ -937,7 +937,7 @@ class CoursesController < ApplicationController
@page = params[:page] || 1 @page = params[:page] || 1
@page_size = params[:page_size] || 15 @page_size = params[:page_size] || 15
@courses = Course.by_user(current_user).hidden(false).ended(false).deleted(0).by_keywords(params[:search]).distinct @courses = Course.by_user(current_user).hidden(false).processing.not_deleted.by_keywords(params[:search]).distinct
# @total_count = @courses.count # @total_count = @courses.count
# offset = 0 # offset = 0

@ -1,5 +1,5 @@
class ShixunsController < ApplicationController class ShixunsController < ApplicationController
before_action :require_login, except: [:download_file, :index] before_action :require_login, except: [:download_file, :index, :menus]
# before_action :check_auth, except: [:download_file, :index] # before_action :check_auth, except: [:download_file, :index]
before_action :find_shixun, except: [:index, :new, :create, :menus, :get_recommend_shixuns, :propaedeutics, before_action :find_shixun, except: [:index, :new, :create, :menus, :get_recommend_shixuns, :propaedeutics,

@ -62,7 +62,7 @@ class Course < ApplicationRecord
scope :hidden, ->(is_hidden = true) { where(is_hidden: is_hidden) } scope :hidden, ->(is_hidden = true) { where(is_hidden: is_hidden) }
scope :ended, ->(is_end = true) { where(is_end: is_end) } scope :ended, ->(is_end = true) { where(is_end: is_end) }
scope :processing, -> { where(is_end: false) } scope :processing, -> { where(is_end: false) }
scope :not_deleted, -> { where(is_delete: false) } scope :not_deleted, -> { where(is_delete: 0) }
scope :deleted, ->(is_delete = 1) { where(is_delete: is_delete) } scope :deleted, ->(is_delete = 1) { where(is_delete: is_delete) }
scope :by_user, ->(user) { joins(:course_members).where('course_members.user_id = ?', user.id).order(updated_at: :desc) } scope :by_user, ->(user) { joins(:course_members).where('course_members.user_id = ?', user.id).order(updated_at: :desc) }
scope :by_keywords, lambda { |keywords| scope :by_keywords, lambda { |keywords|

@ -388,10 +388,10 @@ class User < ApplicationRecord
# 用户是否有权限查看实训 # 用户是否有权限查看实训
def shixun_permission(shixun) def shixun_permission(shixun)
# 性能优化:先处理不需要权限的实训(已发布并且没有单位权限限制的实训) # 性能优化:先处理不需要权限的实训(已发布并且没有单位权限限制的实训)
return true if manager_of_shixun?(shixun) # 实训管理员
return false if shixun.status != 2 || shixun.hidden # 隐藏或者未发布的实训false return false if shixun.status != 2 || shixun.hidden # 隐藏或者未发布的实训false
return true if shixun.use_scope == 0 # 对所有学校公开 return true if shixun.use_scope == 0 # 对所有学校公开
return true if shixun.use_scope == 1 && shixun.shixun_schools.exists?(school_id: school_id) # 对部分高校公开 return true if shixun.use_scope == 1 && (manager_of_shixun?(shixun) || shixun.shixun_schools.exists?(school_id: school_id)) # 对部分高校公开
# return true if manager_of_shixun?(shixun) # 实训管理员
return false return false
end end

@ -11,7 +11,7 @@ class Users::CourseService
end end
def call def call
courses = category_scope_courses.deleted(false) courses = category_scope_courses.not_deleted
courses = status_filter(courses) courses = status_filter(courses)
@ -38,9 +38,9 @@ class Users::CourseService
case params[:status] case params[:status]
when 'processing' then when 'processing' then
relations.ended(false) relations.processing
when 'end' then when 'end' then
relations.ended(true) relations.ended
else else
relations relations
end end

@ -0,0 +1,111 @@
class ExercisePublishTask
include ExercisesHelper
include GitHelper
def publish
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.students.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
def end
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

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

Loading…
Cancel
Save