forked from jasder/forgeplus
70 lines
2.7 KiB
Ruby
70 lines
2.7 KiB
Ruby
|
desc "同步trustie的编程作业"
|
||
|
|
||
|
namespace :sync_program do
|
||
|
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
|
||
|
task data: :environment do
|
||
|
ProgramBank.where(homework_type: 2).each do |program|
|
||
|
unless Hack.where(name: program.name).exists?
|
||
|
strip_des = strip_html(program.description, 5000)
|
||
|
description = strip_des.present? ? strip_des : program.name
|
||
|
hack_params = {name: program.name[0..59], description: description, difficult: 1, open_or_not: 1, score: 200, status:0, time_limit: 3, sub_discipline_id: program.oj_sub_discipline_id}
|
||
|
puts "language::::#{program.language}"
|
||
|
puts "program_bank::::#{program.id}"
|
||
|
hack = Hack.new(hack_params)
|
||
|
hack.user_id = 1
|
||
|
hack.identifier = generate_identifier Hack, 8
|
||
|
ActiveRecord::Base.transaction do
|
||
|
hack.save!
|
||
|
# 创建测试集与代码
|
||
|
position = 1
|
||
|
ProgramBankTest.where(homework_bank_id: program.id).each do |test_set|
|
||
|
if !test_set.input.blank? && !test_set.output.blank? && !hack.hack_sets.where(input: test_set.input).exists? && test_set.input.length <= 1000 && test_set.output.length <= 1000
|
||
|
hack.hack_sets.create!(input: test_set.input, output: test_set.output, position: position)
|
||
|
position += 1
|
||
|
end
|
||
|
end
|
||
|
# 新建知识点
|
||
|
hack_code_params = {code: program.standard_code.blank? ? nil : Base64.encode64(program.standard_code), language: program.oj_language}
|
||
|
hack_codes = hack.hack_codes.new(hack_code_params)
|
||
|
hack_codes.modify_time = Time.now
|
||
|
hack_codes.save!
|
||
|
new_item_params = {name: program.name, sub_discipline_id: program.oj_sub_discipline_id, container: hack, item_type: 'PROGRAM', public: 0, difficulty: 1, user_id: 1}
|
||
|
ItemBank.create!(new_item_params)
|
||
|
end
|
||
|
puts hack.id
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 随机生成字符
|
||
|
def generate_identifier(container, num)
|
||
|
code = DCODES.sample(num).join
|
||
|
if container == User
|
||
|
while container.exists?(login: code) do
|
||
|
code = DCODES.sample(num).join
|
||
|
end
|
||
|
else
|
||
|
while container.exists?(identifier: code) do
|
||
|
code = DCODES.sample(num).join
|
||
|
end
|
||
|
end
|
||
|
code
|
||
|
end
|
||
|
|
||
|
def strip_html(text, len=0, endss="...")
|
||
|
ss = ""
|
||
|
if !text.nil? && text.length>0
|
||
|
ss=text.gsub(/<\/?.*?>/, '').strip
|
||
|
ss = ss.gsub(/ */, '')
|
||
|
ss = ss.gsub(/\r\n/,'') #新增
|
||
|
ss = ss.gsub(/\n/,'') #新增
|
||
|
if len > 0 && ss.length > len
|
||
|
ss = ss[0, len-4] + endss
|
||
|
elsif len > 0 && ss.length <= len
|
||
|
ss = ss
|
||
|
#ss = truncate(ss, :length => len)
|
||
|
end
|
||
|
end
|
||
|
ss
|
||
|
end
|
||
|
end
|