diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb index 87c1e288b..2e9925916 100644 --- a/app/controllers/homework_common_controller.rb +++ b/app/controllers/homework_common_controller.rb @@ -115,23 +115,16 @@ class HomeworkCommonController < ApplicationController end end - # uri = URI('http://test.gitlab.trustie.net/api/questions.json') - # req = Net::HTTP::Post.new(uri, initheader = {'Content-Type' =>'application/json'}) - # req.body = question.to_json - # res = Net::HTTP.start(uri.hostname, uri.port) do |http| - # http.request(req) + # uri = URI('http://192.168.80.21:8080/api/questions.json') + # body = question.to_json + # res = Net::HTTP.new(uri.host, uri.port).start do |client| + # request = Net::HTTP::Post.new(uri.path) + # request.body = body + # request["Content-Type"] = "application/json" + # client.request(request) # end - - uri = URI('http://192.168.80.21:8080/api/questions.json') - body = question.to_json - res = Net::HTTP.new(uri.host, uri.port).start do |client| - request = Net::HTTP::Post.new(uri.path) - request.body = body - request["Content-Type"] = "application/json" - client.request(request) - end - result = JSON.parse(res.body) - homework_detail_programing.question_id = result["id"] if result["status"] && result["status"] == 0 + # result = JSON.parse(res.body) + # homework_detail_programing.question_id = result["id"] if result["status"] && result["status"] == 0 homework.homework_detail_programing = homework_detail_programing else @@ -254,15 +247,15 @@ class HomeworkCommonController < ApplicationController question[:input] << test.input question[:output] << test.output end - uri = URI("http://192.168.80.21:8080/api/questions/#{@homework_detail_programing.question_id}.json") - body = question.to_json - res = Net::HTTP.new(uri.host, uri.port).start do |client| - request = Net::HTTP::Put.new(uri.path) - request.body = body - request["Content-Type"] = "application/json" - client.request(request) - end - result = JSON.parse(res.body) + # uri = URI("http://192.168.80.21:8080/api/questions/#{@homework_detail_programing.question_id}.json") + # body = question.to_json + # res = Net::HTTP.new(uri.host, uri.port).start do |client| + # request = Net::HTTP::Put.new(uri.path) + # request.body = body + # request["Content-Type"] = "application/json" + # client.request(request) + # end + # result = JSON.parse(res.body) end @homework.save_attachments(params[:attachments]) @@ -406,4 +399,4 @@ class HomeworkCommonController < ApplicationController student_works += student_works student_works[index + 1 .. index + n] end -end \ No newline at end of file +end diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 1af832b79..7726ab3da 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -3,13 +3,45 @@ class StudentWorkController < ApplicationController include StudentWorkHelper require 'bigdecimal' require "base64" - before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list] + before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list, :program_test] before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work] before_filter :member_of_course, :only => [:index, :new, :create, :show, :add_score, :praise_student_work] before_filter :author_of_work, :only => [:edit, :update, :destroy] before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list] protect_from_forgery :except => :set_program_score + ### + def program_test + resultObj = {status: 0, results: [], error_msg: '', time: Time.now} + student_work = find_or_save_student_work + unless student_work + resultObj[:status] = 100 + else + if @homework.homework_type == 2 && @homework.homework_detail_programing + result = test_realtime(student_work, params[:src]) + logger.debug result + resultObj[:status] = result["status"] + resultObj[:results] = result["results"] + resultObj[:error_msg] = result["error_msg"] + results = result["results"] + if result["status"].to_i == -2 #编译错误 + results = [result["error_msg"]] + end + student_work_test = student_work.student_work_tests.build(status: result["status"], results: results, + src: params[:src]) + unless student_work.save + resultObj[:status] = 200 + else + resultObj[:status] = result["status"].to_i + resultObj[:time] = student_work_test.created_at.to_s(:db) + resultObj[:index] = student_work.student_work_tests.count + end + + end + end + render :json => resultObj + end + def index #设置作业对应的forge_messages表的viewed字段 query_student_work = @homework.course_messages @@ -102,20 +134,16 @@ class StudentWorkController < ApplicationController end def new - student_work = @homework.student_works.where("user_id = ?",User.current.id).first - if student_work.nil? - @stundet_work = StudentWork.new - respond_to do |format| - format.html - end - else - render_403 + @student_work = @homework.student_works.where("user_id = ?",User.current.id).first + if @student_work.nil? + @student_work = StudentWork.new end end def create if params[:student_work] - stundet_work = StudentWork.new + stundet_work = StudentWork.find(params[:student_work_id]) if params[:student_work_id] + stundet_work ||= StudentWork.new stundet_work.name = params[:student_work][:name] stundet_work.description = params[:student_work][:description] stundet_work.project_id = params[:student_work][:project_id] @@ -128,23 +156,9 @@ class StudentWorkController < ApplicationController stundet_work.late_penalty = 0 end render_attachment_warning_if_needed(stundet_work) - if stundet_work.save if @homework.homework_type == 2 && @homework.homework_detail_programing #编程作业,学生提交作品后计算系统得分 - url = "http://192.168.80.21:8080/api/questions/#{@homework.homework_detail_programing.question_id}/solutions.json" - solutions = { - student_work_id:stundet_work.id, - src:Base64.encode64(stundet_work.description), - language:@homework.homework_detail_programing.language - } - uri = URI(url) - body = solutions.to_json - res = Net::HTTP.new(uri.host, uri.port).start do |client| - request = Net::HTTP::Post.new(uri.path) - request.body = body - request["Content-Type"] = "application/json" - client.request(request) - end + end respond_to do |format| format.html { @@ -584,4 +598,44 @@ class StudentWorkController < ApplicationController book.write xls_report xls_report.string end + + def find_or_save_student_work + student_work = @homework.student_works.where(user_id: User.current.id).first + if student_work.nil? + @homework.student_works.build( + name: params[:title], + description: params[:src], + user_id: User.current.id + ) + unless @homework.save + else + student_work = @homework.student_works.where(user_id: User.current.id).first + end + end + student_work + end + + + def test_realtime(student_work, src) + url = "#{Redmine::Configuration['judge_server']}api/realtime_test.json" + + factor = [] + @homework.homework_tests.each do |test| + factor << {input: test.input, output: test.output} + end + solutions = { + src:src, + language:@homework.homework_detail_programing.language, + factor: factor + } + uri = URI(url) + body = solutions.to_json + res = Net::HTTP.new(uri.host, uri.port).start do |client| + request = Net::HTTP::Post.new(uri.path) + request.body = body + request["Content-Type"] = "application/json" + client.request(request) + end + JSON.parse(res.body) + end end \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6671f122b..37214621f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -347,6 +347,24 @@ class UsersController < ApplicationController end end + def new_user_commit_homework + @user = User.current + @homework = HomeworkCommon.find(params[:homework_id]) + @student_work = @homework.student_works.where(user_id: User.current.id).first + if @student_work.nil? + @student_work = StudentWork.new + end + respond_to do |format| + format.js + format.html {render :layout => 'new_base_user'} + end + end + + def user_commit_homework + flash[:notice] = l(:notice_successful_create) + redirect_to user_homeworks_user_path(User.current) + end + def user_new_homework if params[:homework_common] homework = HomeworkCommon.new @@ -354,7 +372,7 @@ class UsersController < ApplicationController homework.description = params[:homework_common][:description] homework.end_time = params[:homework_common][:end_time] || Time.now homework.publish_time = Time.now - homework.homework_type = 1 + homework.homework_type = params[:homework_type].to_i || 1 homework.late_penalty = 2 homework.user_id = User.current.id homework.course_id = params[:course_id] @@ -363,17 +381,36 @@ class UsersController < ApplicationController render_attachment_warning_if_needed(homework) #匿评作业相关属性 - homework_detail_manual = HomeworkDetailManual.new - homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 - homework_detail_manual.comment_status = 1 - homework_detail_manual.evaluation_start = Time.now - homework_detail_manual.evaluation_end = Time.now - homework_detail_manual.evaluation_num = params[:evaluation_num] || 3 - homework_detail_manual.absence_penalty = 2 - homework.homework_detail_manual = homework_detail_manual + if homework.homework_type == 1 + homework_detail_manual = HomeworkDetailManual.new + homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 + homework_detail_manual.comment_status = 1 + homework_detail_manual.evaluation_start = Time.now + homework_detail_manual.evaluation_end = Time.now + homework_detail_manual.evaluation_num = params[:evaluation_num] || 3 + homework_detail_manual.absence_penalty = 2 + homework.homework_detail_manual = homework_detail_manual + else + homework_detail_programing = HomeworkDetailPrograming.new + homework.homework_detail_programing = homework_detail_programing + homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6 + homework_detail_programing.language = params[:program][:language].to_i + + inputs = params[:program][:input] + if Array === inputs + inputs.each_with_index do |val, i| + homework.homework_tests << HomeworkTest.new( + input: val, + output: params[:program][:output][i] + ) + end + end + + end if homework.save homework_detail_manual.save if homework_detail_manual + homework_detail_programing.save if homework_detail_programing redirect_to user_homeworks_user_path(User.current.id) end end diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb index 217c7d770..1c066495f 100644 --- a/app/models/homework_common.rb +++ b/app/models/homework_common.rb @@ -56,4 +56,6 @@ class HomeworkCommon < ActiveRecord::Base Mailer.run.homework_added(self) end + delegate :language_name, :to => :homework_detail_programing + end diff --git a/app/models/homework_detail_programing.rb b/app/models/homework_detail_programing.rb index 4c7134806..e5938d091 100644 --- a/app/models/homework_detail_programing.rb +++ b/app/models/homework_detail_programing.rb @@ -2,4 +2,8 @@ class HomeworkDetailPrograming < ActiveRecord::Base attr_accessible :language, :standard_code, :homework_common_id belongs_to :homework_common + + def language_name + %W(c c++).at(self.language.to_i - 1) + end end diff --git a/app/models/homework_test.rb b/app/models/homework_test.rb index df2848194..b4d8a4262 100644 --- a/app/models/homework_test.rb +++ b/app/models/homework_test.rb @@ -2,5 +2,4 @@ class HomeworkTest < ActiveRecord::Base attr_accessible :input, :output, :homework_common_id,:result,:error_msg belongs_to :homework_common - has_many :student_work_test end diff --git a/app/models/student_work.rb b/app/models/student_work.rb index b95c11c11..6e39c954a 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -7,7 +7,7 @@ class StudentWork < ActiveRecord::Base has_many :student_works_evaluation_distributions, :dependent => :destroy has_many :student_works_scores, :dependent => :destroy belongs_to :project - has_many :student_work_test + has_many :student_work_tests, order: 'id desc' before_destroy :delete_praise diff --git a/app/models/student_work_test.rb b/app/models/student_work_test.rb index 413528b82..96aa1d6c3 100644 --- a/app/models/student_work_test.rb +++ b/app/models/student_work_test.rb @@ -1,12 +1,12 @@ # encoding: utf-8 class StudentWorkTest < ActiveRecord::Base - attr_accessible :student_work_id, :homework_test_id, :result, :error_msg - - belongs_to :homework_test + attr_accessible :student_work_id, :results, :status, :src belongs_to :student_work + serialize :results, Array + def status_to_s - case self.result.to_i + case self.status.to_i when -1 '编译出错' when -2 @@ -33,10 +33,11 @@ class StudentWorkTest < ActiveRecord::Base end def test_score - if self.result.to_i == 0 + if self.status.to_i == 0 format("%.1f",100.0 / self.student_work.homework_common.homework_tests.count) else 0 end end + end diff --git a/app/views/homework_common/_new_homework_detail_manual_form.html.erb b/app/views/homework_common/_new_homework_detail_manual_form.html.erb new file mode 100644 index 000000000..7fb728ad0 --- /dev/null +++ b/app/views/homework_common/_new_homework_detail_manual_form.html.erb @@ -0,0 +1,74 @@ +
<%= @homework.description %>
+输入 2 1 1 4 4 2 3 6 5
+输出 15
+
注:迟交扣2分,缺评一个作品扣2分
+第<%= @student_work.student_work_tests.count - index%>次测试
<%= test.created_at.to_s(:db) %> + +<%= @homework.description %>
+输入 2 1 1 4 4 2 3 6 5
+输出 15
+
注:迟交扣2分,缺评一个作品扣2分
+第<%= @student_work.student_work_tests.count - index%>次测试
<%= test.created_at.to_s(:db) %> + +<%= @homework.description %>
+输入 2 1 1 4 4 2 3 6 5
+输出 15
+
注:迟交扣2分,缺评一个作品扣2分
+第<%= @student_work.student_work_tests.count - index%>次测试
<%= test.created_at.to_s(:db) %> + +t |