# fq # class BidsController < ApplicationController class ContestsController < ApplicationController layout "contest_base" menu_item :respond menu_item :project, :only => :show_project menu_item :application, :only => :show_softapplication menu_item :attendingcontests, :only => :show_attendingcontest menu_item :contestnotifications, :only => :index before_filter :can_show_contest, :except => [] # modified by alan # modified by longjun before_filter :find_contest, :only => [ :show_contest, :show_project, :show_softapplication, :show_attendingcontest, :index, :set_reward_project, :set_reward_softapplication, :create, :destroy, :more, :back, :add, :add_softapplication, :new,:show_results, :set_reward, :show_contest_project, :show_contest_user, :watcherlist, :join_in_contest, :unjoin_in_contest, :new_join, :settings ] # end longjun # added by fq before_filter :require_login, :only => [:join_in_contest, :unjoin_in_contest] # end before_filter :require_login,:only => [:set_reward, :destroy, :add, :new ] helper :watchers helper :attachments helper :projects helper :words include AttachmentsHelper include ApplicationHelper def index # @contests = Contest.visible # @contests ||= [] @offset, @limit = api_offset_and_limit(:limit => 10) #@contests = Contest.visible #@contests = @contests.like(params[:name]) if params[:name].present? @contests = Contest.visible.where("name like '%#{params[:name]}%'") if params[:contests_search] (redirect_to contests_url, :notice => l(:label_sumbit_empty);return) if params[:name].blank? end @contest_count = @contests.count @contest_pages = Paginator.new @contest_count, @limit, params['page'] @offset ||= @contest_pages.reverse_offset if params[:contest_sort_type].present? case params[:contest_sort_type] when '0' # modified by longjun # never use unless and else, 将下面重复操作模块化,放在private下 # unless @offset == 0 # if @offset != 0 # @contests = @contests.reorder('contests.commit').offset(@offset).limit(@limit).all.reverse # else # limit = @contest_count % @limit # limit = @limit if limit == 0 # @contests = @contests.reorder('contests.commit').offset(@offset).limit(limit).all.reverse @contests = index_page_sort(@offset, @limit, @contest_count, @contests, 'contests.commit') # end @s_state = 0 when '1' @contests = index_page_sort(@offset, @limit, @contest_count, @contests, 'contests.created_on') @s_state = 1 # modified by longjun # 目前只有 0, 1 两个sort_type # when '2' else # end longjun @contests = index_page_sort(@offset, @limit, @contest_count, @contests, '') @s_state = 0 end else # modified by longjun # never use unless and else # unless @offset == 0 if @offset != 0 @contests = @contests.reorder('contests.created_on').offset(@offset).limit(@limit).all.reverse else limit = @contest_count % @limit limit = @limit if limit == 0 @contests = @contests.reorder('contests.created_on').offset(@offset).limit(limit).all.reverse end @s_state = 1 end end def search redirect_to action: 'index',name:params[:name] end def homework @offset, @limit = api_offset_and_limit({:limit => 10}) @bids = @course.homeworks.order('deadline DESC') @bids = @bids.like(params[:name]) if params[:name].present? @bid_count = @bids.count @bid_pages = Paginator.new @bid_count, @limit, params['page'] @offset ||= @bid_pages.reverse_offset # modified by longjun # never use unless and else # unless @offset == 0 if @offset != 0 @bids = @bids.offset(@offset).limit(@limit).all.reverse else limit = @bid_count % @limit @bids = @bids.offset(@offset).limit(limit).all.reverse end render :layout => 'base_courses' end def show_contest @user = @contest.author @jours = @contest.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') @limit = 10 @feedback_count = @jours.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] @offset ||= @feedback_pages.offset @jour = @jours[@offset, @limit] @state = false respond_to do |format| layout_file = 'base_newcontest' format.html { render :layout => layout_file } format.api end end def join_in_contest if params[:contest_password] == @contest.password JoinInCompetition.create(:user_id => User.current.id, :competition_id => @contest.id) @state = 0 else @state = 1 end respond_to do |format| format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} } end end def unjoin_in_contest joined = JoinInCompetition.where('competition_id = ? and user_id = ?', @contest.id, User.current.id) joined.each do |join| join.delete end respond_to do |format| format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} } end end def show_participator render :layout => 'base_newcontest' end def settings if @contest.author.id == User.current.id @contest = Contest.find(params[:id]) render :layout => 'base_newcontest' else render_403 :message => :notice_not_contest_setting_authorized end end # Added by Longjun def destroy_contest @contest = Contest.find(params[:id]) if @contest.author_id == User.current.id @contest.destroy redirect_to action: 'index' else render_403 :message => :notice_not_contest_delete_authorized end end # end def show_contest_project contests = Contest.where('parent_id = ?', @contest.id) @projects = [] # Modified by longjun # 用 arr.each 替换 for [ according to the style guide ] # for contest in contests # @projects += contest.contesting_projects # end contests.each do |contest| @projects += contest.contesting_projects end # end respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end def show_contest_softapplication contests = Contest.where('parent_id = ?', @contest.id) @softapplications = [] # Modified by Longjun # for contest in contests # @softapplications += contest.contesting_softapplications contests.each do |contest| @softapplications += contest.contesting_softapplications end # end respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end def show_contest_user contests = Contest.find(:all) @users = [] # Modified by Longjun # for contest in contests # for project in contest.projects # @users += project.users # end contests.each do |contest| contest.projects.each do |project| @users += project.users end end # end respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end #显示参赛的项目 def show_project @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current)) @option = [] # @contesting_project_count = @contesting_project_all.count # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page'] @membership.each do |membership| # Modified by Longjun # 将两个判断语句合并 # unless membership.project.project_type==1 # if User.current.allowed_to?(:quote_project, membership.project) # @option << membership.project # end # end if membership.project.project_type != 1 && User.current.allowed_to?(:quote_project, membership.project) @option << membership.project end # end end @user = @contest.author @contesting_project = @contest.contesting_projects.all if params[:student_id].present? @temp = [] @contesting_project.each do |pro| if pro.project && pro.project.project_status if /#{params[:student_id]}/ =~ pro.user.user_extensions.student_id @temp << pro end end @temp end @contesting_project = @temp else @temp = [] @contesting_project.each do |pro| # modified by longjun # if pro.project && pro.project.project_status # @temp << pro # end @temp << pro if pro.project && pro.project.project_status # end longjun @temp end if @temp.size > 0 @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade} end end @contesting_project = paginateHelper(@contesting_project) respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end ############ ##显示参赛的应用 def show_softapplication # @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current)) # @option = [] # @user = @contest.user @softapplication = Softapplication.all @contesting_softapplication = @contest.contesting_softapplications @contesting_softapplication = paginateHelper(@contesting_softapplication, 10) # @temp = [] # @softapplicationt.each do |pro| # if pro.project && pro.project.project_status # @temp << pro # end # @temp # if @temp.size > 0 # @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade} # end # end # respond_to do |format| # format.html { # render :layout => 'base_newcontest' # } # format.api # end ########################## @contest = Contest.find_by_id(params[:id]) respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end ###我要参赛 def show_attendingcontest ##取出参赛项目--项目列表 @membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current)) @option = [] # @contesting_project_count = @contesting_project_all.count # @contesting_project_pages = Paginator.new @contesting_project_count, per_page_option, params['page'] @membership.each do |membership| unless membership.project.project_type==1 #拥有编辑项目权限的可将该项目参赛 if User.current.allowed_to?(:quote_project, membership.project) @option << membership.project end end end @user = @contest.author @contesting_project = @contest.contesting_projects.all if params[:student_id].present? @temp = [] @contesting_project.each do |pro| if pro.project && pro.project.project_status if /#{params[:student_id]}/ =~ pro.user.user_extensions.student_id @temp << pro end end @temp end @contesting_project = @temp else @temp = [] @contesting_project.each do |pro| # modified by longjun # if pro.project && pro.project.project_status # @temp << pro # end @temp << pro if pro.project && pro.project.project_status # end longjun @temp end if @temp.size > 0 @contesting_project = @temp.sort {|a,b| b.project.project_status.grade <=> a.project.project_status.grade} end end # 取出参赛应用 --应用列表 @softapplication = Softapplication.all @contesting_softapplication = @contest.contesting_softapplications. joins("LEFT JOIN softapplications ON contesting_softapplications.softapplication_id=softapplications.id"). joins("LEFT JOIN ( SELECT * FROM seems_rateable_cached_ratings WHERE cacheable_type='Softapplication' AND DIMENSION = 'quality') AS cached ON cached.cacheable_id=softapplications.id"). order("cached.avg").reverse_order @contesting_softapplication = paginateHelper @contesting_softapplication, 10 #引用base_newcontest整体样式 @contest = Contest.find_by_id(params[:id]) respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end ###end def show_notification @contest = Contest.find_by_id(params[:id]) respond_to do |format| format.html { render :layout => 'base_newcontest' } format.api end end def set_reward_project @c_p = nil @contesting_project_id = nil if params[:set_reward_project][:reward]&&((User.current.id==@contest.author_id)||User.current.admin) # @bid_id = params[:id] @contesting_project_id = params[:set_reward_project][:c_id] @c_p = ContestingProject.find_by_id(@contesting_project_id) # 把字段存进表中 @c_p.update_reward(params[:set_reward_project][:reward].to_s) end respond_to do |format| format.js end end def set_reward_softapplication @c_sa = nil @contesting_softapplication_id = nil if params[:set_reward_softapplication][:reward]&&((User.current.id==@contest.author_id)||User.current.admin) # @bid_id = params[:id] @contesting_softapplication_id = params[:set_reward_softapplication][:c_id] @c_sa = ContestingSoftapplication.find_by_id(@contesting_softapplication_id) # 把字段存进表中 @c_sa.update_reward(params[:set_reward_softapplication][:reward].to_s) end respond_to do |format| format.js end end ###添加已创建的参赛项目 def add project = Project.find(params[:contest]) contest_message = params[:contest_for_save][:contest_message] if ContestingProject.where("project_id = ? and contest_id = ?", project.id, @contest.id).size == 0 # modified by longjun, create 写错了 # if ContestingProject.cerate_contesting(@contest.id, project.id, contest_message) if ContestingProject.create_contesting(@contest.id, project.id, contest_message) # end longjun flash.now[:notice] = l(:label_bidding_contest_succeed) end else flash.now[:error] = l(:label_bidding_fail) end @contesting_project = paginateHelper @contest.contesting_projects respond_to do |format| format.html { redirect_to :back } format.js end end ###添加已发布的参赛应用 def add_softapplication softapplication = Softapplication.find(params[:contest]) contest_message = params[:contest_for_save][:contest_message] if ContestingSoftapplication.where("softapplication_id = ? and contest_id = ?", softapplication.id, @contest.id).size == 0 if ContestingSoftapplication.create_softapplication_contesting(@contest.id, softapplication.id, contest_message) flash.now[:notice] = l(:label_release_add_contest_succeed) end else flash.now[:error] = l(:label_add_contest_succeed_fail) end @contesting_softapplication = paginateHelper @contest.contesting_softapplications respond_to do |format| format.html { redirect_to :back } format.js end end ## 新建留言 def create if params[:contest_message][:message].size>0 if params[:reference_content] message = params[:contest_message][:message] + "\n" + params[:reference_content] else message = params[:contest_message][:message] end refer_user_id = params[:contest_message][:reference_user_id].to_i @contest.add_jour(User.current, message, refer_user_id) end @user = @contest.author @jours = @contest.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') @limit = 10 @feedback_count = @jours.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] @offset ||= @feedback_pages.offset @jour = @jours[@offset, @limit] @contest.set_commit(@feedback_count) respond_to do |format| format.js end end ##删除留言 def destroy @user = @contest.author if User.current.admin? || User.current.id == @user.id JournalsForMessage.delete_message(params[:object_id]) end @jours = @contest.journals_for_messages.reverse @limit = 10 @feedback_count = @jours.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] @offset ||= @feedback_pages.offset @jour = @jours[@offset, @limit] @contest.set_commit(@feedback_count) respond_to do |format| format.js end end ##引用留言 def new @jour = JournalsForMessage.find(params[:journal_id]) if params[:journal_id] if @jour user = @jour.user text = @jour.notes else user = @contest.author text = @contest.description end text = text.to_s.strip.gsub(%r{
((.|\s)*?)}m, '[...]') @content = "> #{ll(User.current.language, :text_user_wrote, user)}\n> " @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" @id = user.id rescue ActiveRecord::RecordNotFound render_404 end ##新建竞赛 def new_contest @contest = Contest.new @contest.safe_attributes = params[:contest] end ##提交创建的竞赛 def create_contest @contest = Contest.new @contest.name = params[:contest][:name] @contest.description = params[:contest][:description] @contest.budget = params[:contest][:budget] @contest.deadline = params[:contest][:deadline] @contest.password = params[:contest][:password] @contest.author_id = User.current.id @contest.commit = 0 if @contest.save unless @contest.watched_by?(User.current) if @contest.add_watcher(User.current) flash[:notice] = l(:label_contesting_created_succeed) end end redirect_to show_contest_contest_url(@contest) else @contest.safe_attributes = params[:contest] render :action => 'new_contest' end end ##更新竞赛配置信息 def update_contest @contest = Contest.find(params[:id]) @contest.name = params[:contest][:name] @contest.description = params[:contest][:description] @contest.budget = params[:contest][:budget] @contest.deadline = params[:contest][:deadline] @contest.password = params[:contest][:password] @contest.author_id = User.current.id @contest.commit = 0 if @contest.save unless @contest.watched_by?(User.current) if @contest.add_watcher(User.current) flash[:notice] = l(:label_contesting_updated_succeed) end end redirect_to show_contest_contest_url(@contest) else @contest.safe_attributes = params[:contest] render :action => 'new_contest' end end def more @jour = @contest.journals_for_messages @jour.each_with_index {|j,i| j.indice = i+1} @state = true respond_to do |format| format.html { redirect_to :back } format.js #format.api { render_api_ok } end end def back @jour = @contest.journals_for_messages @jour.each_with_index {|j,i| j.indice = i+1} @state = false respond_to do |format| format.html { redirect_to :back } format.js #format.api { render_api_ok } end end def set_reward @b_p = nil @contesting_project_id = nil if params[:set_reward][:reward]&&((User.current.id==@contest.author_id)||User.current.admin) # @contest_id = params[:id] @contesting_project_id = params[:set_reward][:b_id] #[:b_id]??? @b_p = ContestingProject.find_by_id(@contesting_project_id) # 把字段存进表中 @b_p.update_reward(params[:set_reward][:reward].to_s) end respond_to do |format| format.js end end def watcherlist render :layout => 'base_newcontest' end private def find_contest if params[:id] @contest = Contest.find(params[:id]) @user = @contest.author end rescue render_404 end #验证是否显示竞赛 def can_show_contest @first_page = FirstPage.find_by_page_type('project') if @first_page.show_contest == 2 render_404 end end # added by longjun # 将index页面中分页排序的方法抽离出来 def index_page_sort(offset, limit, contest_count, contests, contest_sort_by) # modified by longjun # never use unless and else # unless @offset == 0 if offset != 0 contests = contests.reorder(contest_sort_by).offset(offset).limit(limit).all.reverse else limit = contest_count % limit limit = limit if limit == 0 contests = contests.reorder(contest_sort_by).offset(offset).limit(limit).all.reverse end contests end end