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/app/controllers/question_banks_controller.rb

291 lines
11 KiB

6 years ago
class QuestionBanksController < ApplicationController
before_action :require_login
before_action :params_filter
# 题库选用列表
# object_type: # normal 普通作业题库; group 分组作业题库; poll问卷题库 exercise试卷题库; gtask 毕设选题题库gtopic 毕设任务
# filter: 过滤条件 public公共题库 myself我的题库
# search: 搜索条件
def bank_list
page = params[:page] || 1
limit = params[:limit] || 15
@certification_teacher = current_user.is_certification_teacher || current_user.admin?
@objects = @object_type.classify.constantize.where(@object_filter)
@objects =
if params[:search]
if params[:filter] == 'public'
# 已认证才能获取题库
if @certification_teacher
sql = %Q{
#{@objects.table_name}.is_public = 1 and concat(#{@objects.table_name}.name, course_lists.name) like
'%#{params[:search]}%'
}
@objects.joins(:course_list).where(sql)
else
@objects.none
end
else
sql = %Q{
#{@objects.table_name}.user_id = #{current_user.id} and concat(#{@objects.table_name}.name, course_lists.name) like
'%#{params[:search]}%'
}
@objects.joins(:course_list).where(sql)
end
else
if params[:filter] == 'public'
if @certification_teacher # 只用平台已认证的老师才能获取题库
@objects.is_public
else
@objects.none
end
else
@objects.myself(current_user.id)
end
end
@objects = @objects.page(page).per(limit)
end
# 保存题库
def save_banks
tip_exception("bank_id不能为空") if params[:bank_id].blank?
tip_exception("一次最多只能选用15份题库") if params[:bank_id].count > 15
tip_exception("course_id不能为空") if params[:course_id].blank?
begin
objects = @object_type.classify.constantize.where(id: params[:bank_id])
course = Course.find params[:course_id]
new_object_ids = []
objects.each do |object|
case @object_type
when 'HomeworkBank' # 作业
new_object = quote_homework_bank object,course
when 'ExerciseBank'
if object.container_type == 'Exercise' # 试卷
new_object = quote_exercise_bank object, course
else # 问卷
new_object = quote_poll_bank object, course
end
when 'GtaskBank'
new_object = quote_gtask_bank object, course
when 'GtopicBank'
new_object = quote_gtopic_bank object, course
end
new_object_ids << new_object.id
end
render json: {status: 0, message: "选题成功", object_ids: new_object_ids}
rescue Exception => e
uid_logger_error(e.message)
tip_exception("题库选用失败")
raise ActiveRecord::Rollback
end
end
def destroy
bank = current_bank
unless user.admin? || bank.user_id == user.id
render_forbidden
return
end
bank.destroy!
render_ok
end
def public
current_bank.update!(is_public: true)
render_ok
end
private
def current_bank
@_current_bank ||= @object_type.classify.constantize.where(@object_filter).find(params[:id])
end
def params_filter
type = ["normal", "group", "poll", "exercise", "gtask", "gtopic"]
tip_exception("object_type类型不正确") unless type.include?(params[:object_type])
# HomeworkBank 普通、分组作业题库ExerciseBank试卷、问卷题库GtaskBank毕设选题题库GtopicBank毕设任务题库
case params[:object_type]
when 'normal'
@object_type = "HomeworkBank"
@object_filter = "homework_type = 1" # 普通作业
when 'group'
@object_type = "HomeworkBank"
@object_filter = "homework_type = 3" # 分组作业
when 'poll'
@object_type = "ExerciseBank"
@object_filter = "container_type = 'Poll'" # 问卷
when 'exercise'
@object_type = "ExerciseBank"
@object_filter = "container_type = 'Exercise'" # 试卷
when 'gtask'
@object_type = "GtaskBank"
@object_filter = nil
when 'gtopic'
@object_type = "GtopicBank"
@object_filter = nil
end
end
def quote_homework_bank homework, course
ActiveRecord::Base.transaction do
# 复制作业的基本信息
new_homework = HomeworkCommon.new(name: homework.name, user_id: current_user.id, description: homework.description,
homework_type: homework.homework_type, course_id: course.id, homework_bank_id: homework.id,
reference_answer: homework.reference_answer)
# 作业的基本设置复制
new_homework.homework_detail_manual = HomeworkDetailManual.new
new_homework_detail_manual = new_homework.homework_detail_manual
if new_homework.homework_type == "group"
# 分组作业表的复制
new_homework.homework_detail_group = HomeworkDetailGroup.new
new_homework.homework_detail_group.min_num = homework.min_num
new_homework.homework_detail_group.max_num = homework.max_num
new_homework.homework_detail_group.base_on_project = homework.base_on_project
end
# 附件
homework.attachments.try(:each) do |attachment|
att = attachment.copy
att.container_id = nil
att.container_type = nil
att.author_id = homework.user_id
att.copy_from = attachment.id
att.save
new_homework.attachments << att
end
if new_homework.save
new_homework_detail_manual.save if new_homework_detail_manual
new_homework.homework_detail_group.save if new_homework.homework_detail_group
HomeworksService.new.create_works_list(new_homework, course)
homework.update_column(:quotes, homework.quotes+1)
end
new_homework
end
end
def quote_exercise_bank exercise, course
ActiveRecord::Base.transaction do
new_exercise = Exercise.new(:exercise_name => exercise.name, :exercise_description => exercise.description,
:user_id => current_user.id, :course_id => course.id, :exercise_bank_id => exercise.id)
# 复制试卷基本信息
exercise.exercise_bank_questions.each do |q|
option = {
:question_title => q.question_title,
:question_type => q.question_type || 1,
:question_number => q.question_number,
:question_score => q.question_score,
:shixun_id => q.shixun_id
}
exercise_question = new_exercise.exercise_questions.new option
# question_type5实训题其他是非实训题
if q.question_type != 5
# 复制选择题题目选项
q.exercise_bank_choices.try(:each_with_index) do |choice, index|
exercise_question.exercise_choices.new({choice_position: index+1, choice_text: choice.choice_text})
end
# 复制标准答案(填空题和问答题) 多空填空题的话应该是原标准答案的exercise_choice_id即为题空的位置。
q.exercise_bank_standard_answers.try(:each) do |answer|
exercise_question.exercise_standard_answers.new({exercise_choice_id: answer.exercise_bank_choice_id, answer_text: answer.answer_text})
end
else
# 复制实训题
q.exercise_bank_shixun_challenges.try(:each_with_index) do |sc, index|
exercise_question.exercise_shixun_challenges.new({position: index+1, challenge_id: sc.challenge_id,
shixun_id: sc.shixun_id, question_score: sc.question_score})
end
end
end
# 添加学生
# if new_exercise.save
# new_exercise.create_exercise_list
# exercise.update_column(:quotes, exercise.quotes+1)
# end
new_exercise if new_exercise.save!
end
end
def quote_poll_bank poll, course
ActiveRecord::Base.transaction do
new_poll = Poll.new(:polls_name => poll.name, :polls_description => poll.description, :user_id => current_user.id,
:polls_type => 'Course', :course_id => course.id, :exercise_bank_id => poll.id)
poll.exercise_bank_questions.try(: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
}
poll_question = new_poll.poll_questions.new option
q.exercise_bank_choices.try(:each_with_index) do |choice, index|
poll_question.poll_answers.new({answer_position: index+1, answer_text: choice.choice_text})
end
end
# if new_poll.save
# new_poll.create_polls_list
# poll.update_column(:quotes, poll.quotes+1)
# end
new_poll if new_poll.save!
end
end
def quote_gtask_bank task, course
ActiveRecord::Base.transaction do
new_task = GraduationTask.new
new_task.attributes = task.attributes.dup.except("id", "course_id", "user_id", "quotes", "graduation_task_id",
"course_list_id", "gtask_bank_id")
6 years ago
new_task.course_id = course.id
new_task.gtask_bank_id = task.id
6 years ago
new_task.user_id = current_user.id
if new_task.save!
new_task.create_work_list
end
# 复制附件内容
task.attachments.try(:each) do |attachment|
att = attachment.copy
att.container_id = nil
att.container_type = nil
att.author_id = task.user_id
att.copy_from = attachment.id
att.save
new_task.attachments << att
end
task.update_column(:quotes, task.quotes+1)
new_task
end
end
def quote_gtopic_bank topic, course
ActiveRecord::Base.transaction do
new_topic = GraduationTopic.new
new_topic.attributes = topic.attributes.dup.except("id", "course_id", "user_id", "graduation_topic_id",
"course_list_id", "gtopic_bank_id")
6 years ago
new_topic.course_id = course.id
new_topic.gtopic_bank_id = topic.id
6 years ago
new_topic.user_id = current_user.id
new_topic.save
topic.attachments.each.try(:each) do |attachment|
att = attachment.copy
att.container_id = nil
att.container_type = nil
att.author_id = topic.user_id
att.copy_from = attachment.id
att.save
new_topic.attachments << att
end
topic.update_column(:quotes, topic.quotes+1)
new_topic
end
end
end