本地版导入

dev_local
cxt 6 years ago
parent cc58729d9b
commit bd511a715b

@ -41,6 +41,8 @@ class WelcomeController < ApplicationController
end
def shixun_to_local
identifiers = params[:identifiers].split(",")
shixuns = Shixun.where(identifier: identifiers)
@ -501,6 +503,148 @@ class WelcomeController < ApplicationController
end
private
def _shixun_to_local shixuns
shixuns.each do |shixun|
if LocalShixun.where(shixun_id: shixun.id).blank?
local_shixun = LocalShixun.create!(name: shixun.name, description: shixun.description, user_id: User.current.id, status: 0,
trainee: shixun.trainee, webssh: shixun.webssh, multi_webssh: shixun.multi_webssh,
can_copy: shixun.can_copy, identifier: generate_identifier, shixun_id: shixun.id,
use_scope: shixun.use_scope, visits: 1, evaluate_script: shixun.evaluate_script,
local_giturl: shixun.git_url)
# 同步更新实践课程中对应的shixun_id
LocalStageShixun.where(shixun_id: shixun.id).update_all(local_shixun_id: local_shixun.id)
# 同步镜像
if shixun.mirror_repositories.present?
shixun.mirror_repositories.each do |mirror|
# 本地版的mirror id和线上的可能不一样所以按名字取然后再存
# local_mirror = MirrorRepository.where(type_name: mirror.type_name).first.try(:id)
LocalMirrorRepository.create!(:local_shixun_id => local_shixun.id, :mirror_repository_id => mirror.id, type_name: mirror.type_name)
end
end
# 同步技术标签
shixun.shixun_tag_repertoires.each do |str|
LocalShixunTagRepertoire.create!(:tag_repertoire_id => str.tag_repertoire_id, :local_shixun_id => local_shixun.id)
end
# 不需要同步版本库,版本库应该是从本地导入到线上的时候由线上版本创建的
# 同步复制关卡
if shixun.challenges.present?
shixun.challenges.each do |challenge|
new_challenge = LocalChallenge.new
new_challenge.attributes = challenge.attributes.dup.except("id","shixun_id","user_id", "test_set_score", "test_set_average", "exec_time", "praises_count")
new_challenge.local_shixun_id = local_shixun.id
new_challenge.save!
# 评测题,选择题暂时不考虑
# 同步测试集
if challenge.test_sets.present?
challenge.test_sets.each do |test_set|
new_test_set = LocalTestSet.new
new_test_set.attributes = test_set.attributes.dup.except("id","challenge_id","match_rule")
new_test_set.local_challenge_id = new_challenge.id
new_test_set.save!
end
end
# 同步关卡标签
challenge_tags = ChallengeTag.where("challenge_id =? and challenge_choose_id is null", challenge.id)
if challenge_tags.present?
challenge_tags.each do |challenge_tag|
LocalChallengeTag.create!(:local_challenge_id => new_challenge.id, :name => challenge_tag.try(:name))
end
end
end
end
end
end
end
def _local_to_shixun local_shixun
identifier = generate_identifier
shixun = Shixun.create!(name: local_shixun.name, description: local_shixun.description, user_id: User.current.id,
trainee: local_shixun.trainee, webssh: local_shixun.webssh, multi_webssh: local_shixun.multi_webssh,
can_copy: local_shixun.can_copy, identifier: identifier, reset_time: Time.now,
modify_time: Time.now, use_scope: local_shixun.use_scope, visits: 1, evaluate_script: local_shixun.evaluate_script)
m = ShixunMember.new(:user_id => User.current.id, :role => 1)
shixun.shixun_members << m
# 同步镜像
local_mirrors = LocalMirrorRepository.where(local_shixun_id: local_shixun.id)
if local_mirrors.present?
local_mirrors.each do |local_mirror|
local_mirror_new = MirrorRepository.where(type_name: local_mirror.try(:type_name)).first
ShixunMirrorRepository.create!(:shixun_id => shixun.id, :mirror_repository_id => local_mirror_new.id)
end
end
# 同步技术标签
local_shixun_tags = LocalShixunTagRepertoire.where(local_shixun_id: local_shixun.id)
if local_shixun_tags.present?
local_shixun_tags.each do |str|
ShixunTagRepertoire.create!(:tag_repertoire_id => str.tag_repertoire_id, :shixun_id => shixun.id)
end
end
# 创建版本库
repository = Repository.new
repository.shixun = shixun
repository.type = 'Repository::Gitlab'
repository.identifier = shixun.identifier.downcase
repository.project_id = -1
repository.save!
s = Trustie::Gitlab::Sync.new
s.create_shixun(shixun, repository)
raise "版本库创建失败" if shixun.gpid.blank? # 若和gitlab没同步成功则抛出异常
g = Gitlab.client
shixun.update_column(:git_url, g.project(shixun.gpid).path_with_namespace)
local_git_path = local_shixun.local_giturl.split('/').last if local_shixun.local_giturl.present?
new_giturl = "http://educoder:xinhu1ji2qu3@"+g.project(shixun.gpid).http_url_to_repo.split('//').last
# 如果有目录才执行
if system("cd tmp/repositories/#{local_git_path}")
system("cd tmp/repositories/#{local_git_path};git remote remove origin;git remote add origin #{new_giturl};
git add .;git commit -m '..';git push origin master")
end
# http://Hjqreturn:xinhu1ji2qu3@bdgit.educoder.net/Hjqreturn/pgfqe6ch8.git (fetch)
# 同步关卡信息
local_challenges = LocalChallenge.where(local_shixun_id: local_shixun.id)
if local_challenges.present?
local_challenges.each do |local_challenge|
new_challenge = Challenge.new
new_challenge.attributes = local_challenge.attributes.dup.except("id","local_shixun_id","user_id", "test_set_score")
new_challenge.user_id = User.current.id
new_challenge.shixun_id = shixun.id
new_challenge.save!
# 同步测试集
local_test_sets = LocalTestSet.where(local_challenge_id: local_challenge.id)
if local_test_sets.present?
local_test_sets.each do |local_test_set|
new_test_set = TestSet.new
new_test_set.attributes = local_test_set.attributes.dup.except("id","challenge_id")
new_test_set.challenge_id = new_challenge.id
new_test_set.save!
end
end
# 同步关卡标签
local_challenge_tags = LocalChallengeTag.where(local_challenge_id: local_challenge.id)
if local_challenge_tags.present?
local_challenge_tags.each do |local_challenge_tag|
ChallengeTag.create!(:challenge_id => new_challenge.id, :name => local_challenge_tag.try(:name))
end
end
end
end
shixun
end
# 判断网站的入口,是课程 course 则跳过index去渲染 course 方法
def entry_select
# url = request.original_url.gsub('/','')

Loading…
Cancel
Save