完成实训的复制功能

This commit is contained in:
huang 2017-09-22 09:52:13 +08:00
parent 84643fe2cb
commit 8457e4d784
5 changed files with 108 additions and 96 deletions

View File

@ -36,7 +36,7 @@ class CoursesController < ApplicationController
before_filter :require_login, :only => [:join, :unjoin]
#before_filter :allow_join, :only => [:join]
require 'bundler/setup'
require 'simple_xlsx_reader'
# require 'simple_xlsx_reader'
# params[:search] 搜索课程的名称
# params[:select] "join" "create" "all" 参与的 创建的 所有的课程

View File

@ -543,8 +543,11 @@ update
# token值解密
# gitlab_token = aes_dicrypt("priEn3UwXfJs3Pmy", token)
@zip_path = Gitlab.endpoint.to_s + "/projects/" + @shixun.gpid.to_s + "/repository/archive?&private_token=" + token
login = User.find_by_mail("educoder@163.com").try(:login)
if @shixun.fork_from.present?
login = User.find_by_mail("eduforge@163.com").try(:login)
else
login = User.find_by_mail("educoder@163.com").try(:login)
end
gitlab_address = Redmine::Configuration['gitlab_address']
@repos_url = git_shixun_url(@shixun, login)
# @repos_url = gitlab_address.to_s+"/" + @creator + "/" + @repository.identifier+"."+"git"

View File

@ -222,7 +222,7 @@ class ShixunsController < ApplicationController
ShixunMember.create!(:user_id => member, :shixun_id => @shixun.id, :role => 2)
u = s.g.add_team_member(@shixun.gpid, gid, 40) # 3代表角色master
if u.blank?
raise("同步Gitlab数据错误")
raise("同步Gitlab数据失败")
end
end
@collaborators = @shixun.collaborators
@ -531,106 +531,115 @@ class ShixunsController < ApplicationController
end
def copy
begin
new_shixun = Shixun.new
new_shixun.attributes = @shixun.attributes.dup.except("id","user_id","visits","gpid","status", "identifier", "homepage_show")
new_shixun.user_id = User.current.id
new_shixun.identifier = generate_identifier
new_shixun.status = 0
ActiveRecord::Base.transaction do
begin
new_shixun = Shixun.new
new_shixun.attributes = @shixun.attributes.dup.except("id","user_id","visits","gpid","status", "identifier", "homepage_show")
new_shixun.user_id = User.current.id
new_shixun.identifier = generate_identifier
new_shixun.status = 0
new_shixun.fork_from = @shixun.id
new_shixun.save!
# 同步复制版本库先fork再修改版本库名
# eduforge用户作为版本库的创建者
repository = Repository.new
repository.shixun = new_shixun
repository.type = 'Repository::Gitlab'
repository.identifier = new_shixun.identifier.downcase
repository.project_id = -1
repository.save!
g = Gitlab.client
user_gid = User.find_by_mail("eduforge@163.com").try(:gid)
gshixun = g.fork(@shixun.gpid, user_gid)
raise "版本库创建失败" if gshixun.try(:id).blank?
gshixun = g.edit_project(gshixun.id, new_shixun.identifier, new_shixun.identifier)
raise "版本库创建失败" if (gshixun.try(:name) != new_shixun.identifier || gshixun.try(:path) != new_shixun.identifier)
new_shixun.update_column(:gpid, gshixun.id)
# 同步复制合作者
# 合作者加入到gitlab
@shixun.shixun_members.each do |shixun_member|
if ShixunMember.where(:shixun_id => new_shixun.try(:id), :user_id => shixun_member.user_id).blank?
ShixunMember.create!(:user_id => shixun_member.try(:user_id), :shixun_id => new_shixun.try(:id),
:role => (shixun_member.try(:user_id) == User.current.id ? 1 : 2))
end
# 同步复制合作者,合作者加入到gitlab
@shixun.shixun_members.each do |shixun_member|
if ShixunMember.where(:shixun_id => new_shixun.try(:id), :user_id => shixun_member.user_id).blank?
ShixunMember.create!(:user_id => shixun_member.try(:user_id), :shixun_id => new_shixun.try(:id),
:role => (shixun_member.try(:user_id) == User.current.id ? 1 : 2))
end
# 同步复制版本库先fork再修改版本库名
# forge用户来复制版本库
repository = Repository.new
repository.shixun = new_shixun
repository.type = 'Repository::Gitlab'
repository.identifier = new_shixun.identifier.downcase
repository.project_id = -1
repository.save!
g = Gitlab.client
user_gid = User.find_by_mail("eduforge@163.com").try(:gid)
gshixun = g.fork(@shixun.gpid, user_gid)
raise "版本库创建失败" if gshixun.try(:id).blank?
new_shixun.update_column(:gpid, gshixun.id)
# g.edit_project(gshixun.id, :visibility_level => 20, :name => new_shixun.identifier)
# 同步复制关卡
if @shixun.challenges.present?
@shixun.challenges.each do |challenge|
new_challenge = Challenge.new
new_challenge.attributes = challenge.attributes.dup.except("id","shixun_id","user_id")
new_challenge.user_id = User.current.id
new_challenge.shixun_id = new_shixun.id
new_challenge.save!
if challenge.st == 0 # 评测题
# 同步测试集
if challenge.test_sets.present?
challenge.test_sets.each do |test_set|
new_test_set = TestSet.new
new_test_set.attributes = test_set.attributes.dup.except("id","challenge_id")
new_test_set.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|
ChallengeTag.create!(:challenge_id => new_challenge.id, :name => challenge_tag.try(:name))
end
end
elsif challenge.st == 1 # 选择题
if challenge.challenge_chooses.present?
challenge.challenge_chooses.each do |challenge_choose|
new_challenge_choose = ChallengeChoose.new
new_challenge_choose.attributes = challenge_choose.attributes.dup.except("id","challenge_id")
new_challenge_choose.challenge_id = new_challenge.id
new_challenge_choose.save!
# 每一题的选项
if challenge_choose.challenge_questions.present?
challenge_choose.challenge_questions.each do |challenge_question|
new_challenge_question = ChallengeQuestion.new
new_challenge_question.attributes = challenge_question.attributes.dup.except("id","challenge_choose_id")
new_challenge_question.challenge_choose_id = new_challenge_choose.id
new_challenge_question.save!
end
s = Trustie::Gitlab::Sync.new
gid = User.find(shixun_member.user_id).try(:gid)
u = s.g.add_team_member(gshixun.id, gid, 40) # 3代表角色master
if u.blank?
raise("同步Gitlab数据失败")
end
end
# 同步复制关卡
if @shixun.challenges.present?
@shixun.challenges.each do |challenge|
new_challenge = Challenge.new
new_challenge.attributes = challenge.attributes.dup.except("id","shixun_id","user_id")
new_challenge.user_id = User.current.id
new_challenge.shixun_id = new_shixun.id
new_challenge.save!
if challenge.st == 0 # 评测题
# 同步测试集
if challenge.test_sets.present?
challenge.test_sets.each do |test_set|
new_test_set = TestSet.new
new_test_set.attributes = test_set.attributes.dup.except("id","challenge_id")
new_test_set.challenge_id = new_challenge.id
new_test_set.save!
end
# 每一题的知识标签
st_challenge_tags = ChallengeTag.where(:challenge_id => challenge.id, :challenge_choose_id => challenge_choose.id)
if st_challenge_tags.present?
st_challenge_tags.each do |st_challenge_tag|
ChallengeTag.create!(:challenge_id => new_challenge.id, :name => st_challenge_tag.try(:name), :challenge_choose_id => new_challenge_choose.id)
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|
ChallengeTag.create!(:challenge_id => new_challenge.id, :name => challenge_tag.try(:name))
end
end
elsif challenge.st == 1 # 选择题
if challenge.challenge_chooses.present?
challenge.challenge_chooses.each do |challenge_choose|
new_challenge_choose = ChallengeChoose.new
new_challenge_choose.attributes = challenge_choose.attributes.dup.except("id","challenge_id")
new_challenge_choose.challenge_id = new_challenge.id
new_challenge_choose.save!
# 每一题的选项
if challenge_choose.challenge_questions.present?
challenge_choose.challenge_questions.each do |challenge_question|
new_challenge_question = ChallengeQuestion.new
new_challenge_question.attributes = challenge_question.attributes.dup.except("id","challenge_choose_id")
new_challenge_question.challenge_choose_id = new_challenge_choose.id
new_challenge_question.save!
end
end
# 每一题的知识标签
st_challenge_tags = ChallengeTag.where(:challenge_id => challenge.id, :challenge_choose_id => challenge_choose.id)
if st_challenge_tags.present?
st_challenge_tags.each do |st_challenge_tag|
ChallengeTag.create!(:challenge_id => new_challenge.id, :name => st_challenge_tag.try(:name), :challenge_choose_id => new_challenge_choose.id)
end
end
end
end
end
end
end
# 中间层创建测试集
shixun_tomcat = Redmine::Configuration['shixun_tomcat']
gameInfo = new_shixun.gameInfo
uri ="#{shixun_tomcat}/bridge/game/publishGame"
params = {gameInfo:gameInfo}
res = uri_exec uri, params
if res && res['code'].to_i != 0
raise("实训云平台繁忙繁忙等级90")
end
raise("test")
redirect_to shixun_path(new_shixun)
rescue Exception => e
logger.info("copy shixun failed ##{e.message}")
flash[:notice] = "#{e.message}"
g.delete_project(gshixun.id) if gshixun.try(:id).present? # 异常后,如果已经创建了版本库需要删除该版本库
redirect_to shixun_path(@shixun)
raise ActiveRecord::Rollback
end
# 中间层创建测试集
shixun_tomcat = Redmine::Configuration['shixun_tomcat']
gameInfo = new_shixun.gameInfo
uri ="#{shixun_tomcat}/bridge/game/publishGame"
params = {gameInfo:gameInfo}
res = uri_exec uri, params
if res && res['code'].to_i != 0
raise("实训云平台繁忙繁忙等级90")
end
redirect_to shixun_path(new_shixun)
rescue Exception => e
logger.info("copy shixun failed ##{e.message}")
flash[:notice] = "#{e.message}"
g.delete_project(gshixun.id) if gshixun.id.present? # 异常后,如果已经创建了版本库需要删除该版本库
redirect_to shixun_path(@shixun)
raise ActiveRecord::Rollback
end
end

View File

@ -10,7 +10,7 @@
#
class Shixun < ActiveRecord::Base
attr_accessible :description, :is_public, :name, :changeset_num, :status, :user_id, :gpid, :language, :identifier, :authentication,
:myshixun_count, :propaedeutics, :trainee, :major_id, :homepage_show, :webssh, :hidden
:myshixun_count, :propaedeutics, :trainee, :major_id, :homepage_show, :webssh, :hidden, :fork_from, :can_copy
has_many :users, :through => :shixun_members
has_many :shixun_members, :dependent => :destroy

View File

@ -85,8 +85,8 @@ class Gitlab::Client
# public (optional) - if true same as setting visibility_level = 20
# visibility_level (optional)
def edit_project(id, visibility_level, default_branch)
put("/projects/#{id}", :body => {:visibility_level => visibility_level, :default_branch => default_branch})
def edit_project(id, name, path)
put("/projects/#{id}", :body => {:name => name, :path => path})
end
# Deletes a project.