From 83993dc99d61cf032bfc971aeb7230ba2f950401 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 25 Mar 2020 15:07:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E5=8F=91=E9=80=81=E5=88=B0?= =?UTF-8?q?=E8=AF=BE=E5=A0=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- .../examination_banks_controller.rb | 8 +++ app/models/examination_bank.rb | 1 + app/models/exercise.rb | 2 + app/models/exercise_question.rb | 3 + app/models/exercise_question_analysis.rb | 3 + app/models/hack.rb | 2 + .../send_to_course_service.rb | 63 +++++++++++++++++++ config/routes.rb | 1 + ...44309_add_hack_id_to_exercise_questions.rb | 5 ++ ...44807_create_exercise_question_analyses.rb | 10 +++ ...452_add_examination_bank_id_to_exercise.rb | 5 ++ .../models/exercise_question_analysis_spec.rb | 5 ++ 13 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 app/models/exercise_question_analysis.rb create mode 100644 app/services/examination_banks/send_to_course_service.rb create mode 100644 db/migrate/20200325044309_add_hack_id_to_exercise_questions.rb create mode 100644 db/migrate/20200325044807_create_exercise_question_analyses.rb create mode 100644 db/migrate/20200325051452_add_examination_bank_id_to_exercise.rb create mode 100644 spec/models/exercise_question_analysis_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index fa4648852..15e795bdb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -330,7 +330,7 @@ class ApplicationController < ActionController::Base end if !User.current.logged? && Rails.env.development? - User.current = User.find 3117 + User.current = User.find 1 end diff --git a/app/controllers/examination_banks_controller.rb b/app/controllers/examination_banks_controller.rb index bd1782dc8..4cb25aa29 100644 --- a/app/controllers/examination_banks_controller.rb +++ b/app/controllers/examination_banks_controller.rb @@ -82,6 +82,14 @@ class ExaminationBanksController < ApplicationController render_ok end + def send_to_course + tip_exception(403, "无权限") unless @exam.public || @exam.user == current_user + course = Course.find params[:course_id] + exercise = Exercise.new(user_id: current_user.id, course_id: course.id) + exercise = ExaminationBanks::SendToCourseService.call(@exam, exercise) + render_ok({exercise_id: exercise.id}) + end + private def form_params diff --git a/app/models/examination_bank.rb b/app/models/examination_bank.rb index 824f0bb69..36051db4a 100644 --- a/app/models/examination_bank.rb +++ b/app/models/examination_bank.rb @@ -6,6 +6,7 @@ class ExaminationBank < ApplicationRecord has_many :tag_disciplines, through: :tag_discipline_containers has_many :examination_items, -> {order(position: :asc)}, dependent: :destroy + has_many :exercises def apply? !public && ApplyAction.where(container_type: "ExaminationBank", container_id: id, status: 0).exists? diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 4ed0bec3d..dc9616eca 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -12,6 +12,8 @@ class Exercise < ApplicationRecord has_many :tidings, as: :container has_many :course_acts, class_name: 'CourseActivity', as: :course_act, :dependent => :delete_all + belongs_to :examination_bank, optional: true + scope :is_exercise_published, -> { where("exercise_status > ? ",1)} scope :unified_setting, -> { where("unified_setting = ?",true) } scope :exercise_by_ids, lambda { |ids| where(id: ids) unless ids.blank? } diff --git a/app/models/exercise_question.rb b/app/models/exercise_question.rb index e34c316aa..47dea1175 100644 --- a/app/models/exercise_question.rb +++ b/app/models/exercise_question.rb @@ -3,6 +3,7 @@ class ExerciseQuestion < ApplicationRecord belongs_to :exercise belongs_to :shixun, optional: true + belongs_to :hack, optional: true has_many :exercise_choices, :dependent => :delete_all has_many :exercise_answers @@ -11,6 +12,8 @@ class ExerciseQuestion < ApplicationRecord has_many :exercise_answer_comments has_many :exercise_standard_answers + has_one :exercise_question_analysis, dependent: :destroy + scope :insert_question_ex, lambda {|k| where("question_number > ?",k)} scope :find_by_custom, lambda {|k,v| where("#{k} = ?",v)} #根据传入的参数查找问题 scope :left_question_choose, lambda {|k,v| where("#{k} > ?",v)} #根据传入的参数查找问题 diff --git a/app/models/exercise_question_analysis.rb b/app/models/exercise_question_analysis.rb new file mode 100644 index 000000000..8c8ea5e9c --- /dev/null +++ b/app/models/exercise_question_analysis.rb @@ -0,0 +1,3 @@ +class ExerciseQuestionAnalysis < ApplicationRecord + belongs_to :exercise_question +end diff --git a/app/models/hack.rb b/app/models/hack.rb index 4ae0f4eb5..98c11779d 100644 --- a/app/models/hack.rb +++ b/app/models/hack.rb @@ -19,6 +19,8 @@ class Hack < ApplicationRecord # 知识点 has_many :tag_discipline_containers, as: :container, dependent: :destroy + has_one :exercise_question, dependent: :destroy + belongs_to :user belongs_to :sub_discipline diff --git a/app/services/examination_banks/send_to_course_service.rb b/app/services/examination_banks/send_to_course_service.rb new file mode 100644 index 000000000..bb30e1992 --- /dev/null +++ b/app/services/examination_banks/send_to_course_service.rb @@ -0,0 +1,63 @@ +class ExaminationBanks::SendToCourseService < ApplicationService + attr_reader :exam, :exercise + + def initialize(exam, exercise) + @exam = exam + @exercise = exercise + end + + def call + ActiveRecord::Base.transaction do + exercise.exercise_name = exam.name + exercise.time = exam.duration.present? ? exam.duration : -1 + exercise.save! + + exam.examination_items.each_with_index do |item, index| + question = exercise.exercise_questions.new + question.question_type = question_type item.item_type + question.question_title = item.name + question.question_number = index + 1 + question.question_score = item.score + question.is_md = false + + if item.item_type == "PROGRAM" + new_hack = item.container.fork + question.hack_id = new_hack.id + question.save! + else + question.save! + ExerciseQuestionAnalysis.new(analysis: item.analysis, exercise_question_id: question.id) + item.item_choices.each_with_index do |choice, position| + question.exercise_choices << ExerciseChoice.new(choice_text: choice.choice_text, choice_position: position+1) + if choice.is_answer + question.exercise_standard_answers << ExerciseStandardAnswer.new(exercise_choice_id: position+1) + end + end + end + end + + exam.increment!(:quotes) + end + exercise + end + + def question_type item_type + question_type = case item_type + when 'SINGLE' + Exercise::SINGLE + when 'MULTIPLE' + Exercise::MULTIPLE + when 'JUDGMENT' + Exercise::JUDGMENT + when 'COMPLETION' + Exercise::COMPLETION + when 'SUBJECTIVE' + Exercise::SUBJECTIVE + when 'PRACTICAL' + Exercise::PRACTICAL + when 'PROGRAM' + Exercise::PROGRAM + end + question_type + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 9a471fb7f..c384b6624 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -86,6 +86,7 @@ Rails.application.routes.draw do member do post :set_public delete :revoke_item + post :send_to_course end post :cancel_items, on: :collection end diff --git a/db/migrate/20200325044309_add_hack_id_to_exercise_questions.rb b/db/migrate/20200325044309_add_hack_id_to_exercise_questions.rb new file mode 100644 index 000000000..e5c82ef48 --- /dev/null +++ b/db/migrate/20200325044309_add_hack_id_to_exercise_questions.rb @@ -0,0 +1,5 @@ +class AddHackIdToExerciseQuestions < ActiveRecord::Migration[5.2] + def change + add_column :exercise_questions, :hack_id, :integer, default: 0 + end +end diff --git a/db/migrate/20200325044807_create_exercise_question_analyses.rb b/db/migrate/20200325044807_create_exercise_question_analyses.rb new file mode 100644 index 000000000..cb3137397 --- /dev/null +++ b/db/migrate/20200325044807_create_exercise_question_analyses.rb @@ -0,0 +1,10 @@ +class CreateExerciseQuestionAnalyses < ActiveRecord::Migration[5.2] + def change + create_table :exercise_question_analyses do |t| + t.text :analysis + t.references :exercise_question, index: true, unique: true + + t.timestamps + end + end +end diff --git a/db/migrate/20200325051452_add_examination_bank_id_to_exercise.rb b/db/migrate/20200325051452_add_examination_bank_id_to_exercise.rb new file mode 100644 index 000000000..e80536ff9 --- /dev/null +++ b/db/migrate/20200325051452_add_examination_bank_id_to_exercise.rb @@ -0,0 +1,5 @@ +class AddExaminationBankIdToExercise < ActiveRecord::Migration[5.2] + def change + add_column :exercises, :examination_bank_id, :integer, default: 0 + end +end diff --git a/spec/models/exercise_question_analysis_spec.rb b/spec/models/exercise_question_analysis_spec.rb new file mode 100644 index 000000000..cec755d89 --- /dev/null +++ b/spec/models/exercise_question_analysis_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ExerciseQuestionAnalysis, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end