diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 064a19c91..b7032cef3 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -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" 参与的 创建的 所有的课程 diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 1fb024611..bcc2d3e63 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -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" diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 53a854f02..7e003505d 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -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 diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 40c2237f0..7ba0ae5ca 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -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 diff --git a/lib/gitlab-cli/lib/gitlab/client/projects.rb b/lib/gitlab-cli/lib/gitlab/client/projects.rb index 2cc96c4d1..a773c29bb 100644 --- a/lib/gitlab-cli/lib/gitlab/client/projects.rb +++ b/lib/gitlab-cli/lib/gitlab/client/projects.rb @@ -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.