# encoding: utf-8 class ChallengesController < ApplicationController layout "base_shixun" before_filter :find_shixun, :only => [:index, :new, :create, :destroy, :challenge_build] before_filter :find_challenge, :only => [:show, :edit, :update, :challenge_build, :index_up, :index_down, :destroy] before_filter :build_challege_from_params, :only => [:new, :create] before_filter :tpi_manager_allowed, :only => [:challenge_build, :destroy, :show, :edit, :new, :create] before_filter :query_challeges, :only => [:show, :edit, :update] before_filter :find_shixun_language, :only => [:show, :new, :edit] include ApplicationHelper def new # 顶部导航 @project_menu_type = 11 respond_to do |format| format.html { render :action => 'new', :layout => 'base_shixun' } end end def create challenge_count = @shixun.challenges.count @challenge = Challenge.new(params[:challenge]) @challenge.position = challenge_count + 1 @challenge.shixun = @shixun @challenge.user = User.current if @challenge.save if params[:sample][:input].length > 0 params[:sample][:input].each_with_index do |value, index| unless (value == params[:sample][:output][index] && value.blank?) ChallengeSample.create(:challenge_id => @challenge.id, :input => value, :output => params[:sample][:output][index]) end end end if params[:program][:input].length > 0 params[:program][:input].each_with_index do |value, index| unless (value == params[:program][:output][index] && value.blank?) TestSet.create(:challenge_id => @challenge.id, :input => value, :output => params[:program][:output][index]) end end end unless params[:knowledge].blank? params[:knowledge][:input].each do |input| ChallengeTag.create(:name => input, :challenge_id => @challenge.id) end end respond_to do |format| format.html {redirect_to shixun_challenge_path(@challenge, :shixun_id => @shixun), notice: '创建成功!'} end else respond_to do |format| format.html { render :action => 'new' } end end end def index # 顶部导航 @challenges = @shixun.challenges.order("position desc") respond_to do |format| format.js format.html end rescue ActiveRecord::RecordNotFound render_404 end def show respond_to do |format| format.html format.js end end def edit end def destroy @challenge.destroy respond_to do |format| format.html{redirect_to shixun_challenges_path(@shixun)} end end def update respond_to do |format| if @challenge.update_attributes(params[:challenge]) ActiveRecord::Base.transaction do @challenge_samples.delete_all unless @challenge_samples.blank? @test_sets.delete_all unless @test_sets.blank? @challenge_tags.delete_all unless @challenge_tags.blank? if params[:sample][:input].length > 0 params[:sample][:input].each_with_index do |value, index| unless (value == params[:sample][:output][index] && value.blank?) ChallengeSample.create(:challenge_id => @challenge.id, :input => value, :output => params[:sample][:output][index]) end end end if params[:program][:input].length > 0 params[:program][:input].each_with_index do |value, index| unless (value == params[:program][:output][index] && value.blank?) TestSet.create(:challenge_id => @challenge.id, :input => value, :output => params[:program][:output][index]) end end end unless params[:knowledge].blank? params[:knowledge][:input].each do |input| ChallengeTag.create(:name => input, :challenge_id => @challenge.id) end end end format.html {redirect_to shixun_challenge_path(@challenge, :shixun_id => @shixun), notice: '更新成功!'} format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @challenge.errors } end end end def index_down next_challenge = @challenge.next_challenge position = @challenge.position @challenge.update_attribute(:position, (position + 1)) next_challenge.update_attribute(:position, next_challenge.position - 1) @challenges = @shixun.challenges end def index_up position = @challenge.position last_challenge = @challenge.last_challenge @challenge.update_attribute(:position, (position - 1)) last_challenge.update_attribute(:position, last_challenge.position + 1) @challenges = @shixun.challenges end # build job 只负责发送请求 def challenge_build gitUrl = git_repository_url(@shixun, "Shixun") gitUrl = Base64.encode64(gitUrl) taskId = params[:id] jobName = @shixun.forked_form step = @challenge.position jenkins_shixuns = Redmine::Configuration['jenkins_shixuns'] if @challenge.status == 0 params = {:jobName => "#{jobName}", :taskId => "#{taskId}", :step => "#{step}", :gitUrl => "#{gitUrl}"} uri = URI("#{jenkins_shixuns}/jenkins-exec/api/buildJob") res = uri_exec uri, params # @challenge.update_attribute(:status, 1) end respond_to do |format| format.js end end private def count_input input, output if input.length == 0 && output.length == 0 result = 0 else if input.length > output.length end end end def tpi_manager_allowed unless (User.current.manager_of_shixun?(@shixun) || User.current.admin?) render_403 end end def build_challege_from_params if params[:id].blank? @challenge = Challenge.new @challenge.shixun = @shixun else @challenge = @shixun.challenges.find(params[:id]) end @challenge.shixun = @shixun @challenge.user ||= User.current end def query_challeges @challenge_samples = @challenge.challenge_samples @test_sets = @challenge.test_sets @challenge_tags = @challenge.challenge_tags end def find_challenge @challenge = Challenge.find(params[:id]) @shixun = @challenge.shixun rescue ActiveRecord::RecordNotFound render_404 end # Find project of id params[:id] def find_shixun shixun_id = params[:shixun_id] || (params[:challenge] && params[:challenge][:shixun_id]) @shixun = Shixun.find(shixun_id) rescue ActiveRecord::RecordNotFound render_404 end def find_shixun_language language = @shixun.language @language = language_switch language end end