diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 7f4226050..0372976df 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -1,6 +1,6 @@ class GamesController < ApplicationController before_action :require_login, :check_auth - before_action :find_game + before_action :find_game, except: [:jupyter] before_action :find_shixun, only: [:show, :answer, :rep_content, :choose_build, :game_build, :game_status] before_action :allowed @@ -91,6 +91,13 @@ class GamesController < ApplicationController end end + + def jupyter + # Jupyter没有challenge + @myshixun = Myshixun.find_by_identifier params[:identifier] + @shixun = @myshixun.shixun + end + def reset_vnc_link begin # 删除vnc的pod diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 48f05cac5..efa37066d 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -6,16 +6,17 @@ class ShixunsController < ApplicationController before_action :require_login, :check_auth, except: [:download_file, :index, :menus, :show, :show_right, :ranking_list, :discusses, :collaborators, :fork_list, :propaedeutics] - before_action :check_account, only: [:new, :create, :shixun_exec] + before_action :check_account, only: [:new, :create, :shixun_exec, :jupyter_exec] before_action :find_shixun, except: [:index, :new, :create, :menus, :get_recommend_shixuns, :propaedeutics, :departments, :apply_shixun_mirror, :get_mirror_script, :download_file, :shixun_list, :batch_send_to_course] before_action :shixun_access_allowed, except: [:index, :new, :create, :menus, :get_recommend_shixuns, - :propaedeutics, :departments, :apply_shixun_mirror, + :propaedeutics, :departments, :apply_shixun_mirror, :jupyter_exec, :get_mirror_script, :download_file, :shixun_list, :batch_send_to_course] - before_action :find_repo_name, only: [:repository, :commits, :file_content, :update_file, :shixun_exec, :copy, :add_file] + before_action :find_repo_name, only: [:repository, :commits, :file_content, :update_file, :shixun_exec, :copy, + :add_file, :jupyter_exec] before_action :allowed, only: [:update, :close, :update_propaedeutics, :settings, :publish, :shixun_members_added, :change_manager, :collaborators_delete, @@ -691,112 +692,40 @@ class ShixunsController < ApplicationController end end - # def shixun_exec - # if is_shixun_opening? - # tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") - # end - # current_myshixun = @shixun.current_myshixun(current_user.id) - # - # min_challenges = @shixun.challenges.pluck(:id , :st) - # # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1 - # if current_myshixun && params[:reset] != "1" - # games = current_myshixun.games - # # 如果TPM和TPI的管卡数不相等或者关卡顺序错了,说明实训被极大的改动,需要重置,实训发布前打过的实训都需要重置 - # if is_shixun_reset?(games, min_challenges, current_myshixun) - # # 这里页面弹框要收到 当前用户myshixun的identifier. - # tip_show_exception("/myshixuns/#{current_myshixun.try(:identifier)}/reset_my_game") - # end - # - # - # if current_myshixun.repo_name.nil? - # g = Gitlab.client - # repo_name = g.project(current_myshixun.gpid).try(:path_with_namespace) - # current_myshixun.update_column(:repo_name, repo_name) - # end - # - # # 如果存在实训,则直接进入实训 - # # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡 - # @current_task = - # if params[:challenge_id] - # game = games.where(challenge_id: params[:challenge_id]).take - # if @shixun.task_pass || game.status != 3 - # game - # else - # current_myshixun.current_task(games) - # end - # else - # current_myshixun.current_task(games) - # end - # else - # # 如果未创建关卡一定不能开启实训,否则TPI没法找到当前的关卡 - # if @shixun.challenges_count == 0 - # tip_exception("开启实战前请先创建实训关卡") - # end - # - # # 判断实训是否全为选择题 - # is_choice_type = (min_challenges.size == min_challenges.select{|challenge| challenge.last == 1}.count) - # if !is_choice_type - # commit = GitService.commits(repo_path: @repo_path).try(:first) - # uid_logger("First comit########{commit}") - # tip_exception("开启实战前请先在版本库中提交代码") if commit.blank? - # commit_id = commit["id"] - # end - # - # begin - # ActiveRecord::Base.transaction do - # begin - # myshixun_identifier = generate_identifier Myshixun, 10 - # myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, - # modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, - # onclick_time: Time.now, commit_id: commit_id} - # @myshixun = @shixun.myshixuns.create!(myshixun_params) - # # 其它创建关卡等操作 - # challenges = @shixun.challenges - # # 之所以增加user_id是为了方便统计查询性能 - # game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] - # Game.bulk_insert(*game_attrs) do |worker| - # base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id} - # challenges.each_with_index do |challenge, index| - # status = (index == 0 ? 0 : 3) - # game_identifier = generate_identifier(Game, 12) - # worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, - # identifier: game_identifier, modify_time: challenge.modify_time)) - # end - # end - # @current_task = @myshixun.current_task(@myshixun.games) - # rescue Exception => e - # logger.error("------ActiveRecord::RecordInvalid: #{e.message}") - # raise("ActiveRecord::RecordInvalid") - # end - # end - # # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 - # ActiveRecord::Base.transaction do - # unless is_choice_type - # # fork仓库 - # cloud_bridge = edu_setting('cloud_bridge') - # project_fork(@myshixun, @repo_path, current_user.login) - # rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) - # uid_logger("start openGameInstance") - # uri = "#{cloud_bridge}/bridge/game/openGameInstance" - # logger.info("end openGameInstance") - # params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} - # uid_logger("openGameInstance params is #{params}") - # interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" - # end - # end - # rescue Exception => e - # logger.info("shixun_exec error: #{e.message}") - # if e.message != "ActiveRecord::RecordInvalid" - # logger.error("##########project_fork error #{e.message}") - # @myshixun.destroy! - # end - # raise "实训云平台繁忙(繁忙等级:81)" - # end - # end - # end - - # gameID 及实训ID - # status: 0 , 1 申请过, 2,实训关卡路径未填, 3 实训标签未填, 4 实训未创建关卡 + # jupyter开启挑战 + def jupyter_exec + begin + if is_shixun_opening? + tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") + end + current_myshixun = @shixun.current_myshixun(current_user.id) + if current_myshixun + @myshixun = current_myshixun + else + commit = GitService.commits(repo_path: @repo_path).try(:first) + uid_logger("First comit########{commit}") + tip_exception("开启实战前请先在版本库中提交代码") if commit.blank? + commit_id = commit["id"] + cloud_bridge = edu_setting('cloud_bridge') + myshixun_identifier = generate_identifier Myshixun, 10 + ActiveRecord::Base.transaction do + @myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier, + modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, + onclick_time: Time.now, commit_id: commit_id) + # fork仓库 + project_fork(@myshixun, @repo_path, current_user.login) + rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) + uri = "#{cloud_bridge}/bridge/game/openGameInstance" + params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" + end + end + rescue => e + uid_logger_error(e.message) + tip_exception("实训云平台繁忙(繁忙等级:81)") + end + end + def publish @status = 0 @position = [] diff --git a/app/views/games/jupyter.json.jbuilder b/app/views/games/jupyter.json.jbuilder new file mode 100644 index 000000000..0714e9eca --- /dev/null +++ b/app/views/games/jupyter.json.jbuilder @@ -0,0 +1,5 @@ +json.user do + json.partial! 'users/user', user: current_user +end + +json.(@shixun, :id, :identifier, :status, :name) \ No newline at end of file diff --git a/app/views/shixuns/jupyter_exec.json.jbuilder b/app/views/shixuns/jupyter_exec.json.jbuilder new file mode 100644 index 000000000..44e5c979a --- /dev/null +++ b/app/views/shixuns/jupyter_exec.json.jbuilder @@ -0,0 +1 @@ +json.identifier @myshixun.identifier \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 7f4fd95bd..c6ced3bde 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -218,6 +218,7 @@ Rails.application.routes.draw do get :check_test_sets get :unlock_choose_answer get :get_choose_answer + get :jupyter end collection do @@ -277,6 +278,7 @@ Rails.application.routes.draw do post :update_permission_setting post :update_learn_setting get :jupyter_data_sets + get :jupyter_exec end resources :challenges do