diff --git a/Gemfile.lock b/Gemfile.lock
index d60847b17..42cb62272 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -79,6 +79,9 @@ GEM
rdoc (3.12.2)
json (~> 1.4)
ruby-openid (2.1.8)
+ seems_rateable (1.0.13)
+ jquery-rails
+ rails
sprockets (2.2.2)
hike (~> 1.2)
multi_json (~> 1.0)
@@ -109,3 +112,4 @@ DEPENDENCIES
rails (= 3.2.13)
rdoc (>= 2.4.2)
ruby-openid (~> 2.1.4)
+ seems_rateable
diff --git a/app/assets/javascripts/softapplications.js b/app/assets/javascripts/softapplications.js
new file mode 100644
index 000000000..dee720fac
--- /dev/null
+++ b/app/assets/javascripts/softapplications.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/stylesheets/softapplications.css b/app/assets/stylesheets/softapplications.css
new file mode 100644
index 000000000..afad32db0
--- /dev/null
+++ b/app/assets/stylesheets/softapplications.css
@@ -0,0 +1,4 @@
+/*
+ Place all the styles related to the matching controller here.
+ They will automatically be included in application.css.
+*/
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 73b1849c1..6edd2a8c8 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -175,7 +175,7 @@ private
@attachment = Attachment.find(params[:id])
# Show 404 if the filename in the url is wrong
raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename
- unless @attachment.container_type == 'Bid' || @attachment.container_type == 'HomeworkAttach' || @attachment.container_type == 'Memo'
+ unless @attachment.container_type == 'Bid' || @attachment.container_type == 'HomeworkAttach' || @attachment.container_type == 'Memo' || @attachment.container_type == 'Softapplication'
@project = @attachment.project
end
rescue ActiveRecord::RecordNotFound
diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb
index 2b0ed762c..3136c5838 100644
--- a/app/controllers/bids_controller.rb
+++ b/app/controllers/bids_controller.rb
@@ -472,22 +472,22 @@ class BidsController < ApplicationController
# added by bai type ==1 需求,type==2 竞赛, type==3 作业
if @bid.reward_type == 1
- flash[:notice] = l(:label_bidding_succeed)
+ flash.now[:notice] = l(:label_bidding_succeed)
elsif @bid.reward_type == 2
- flash[:notice] = l(:label_bidding_contest_succeed)
+ flash.now[:notice] = l(:label_bidding_contest_succeed)
else @bid.reward_type == 3
- flash[:notice] = l(:label_bidding_homework_succeed)
+ flash.now[:notice] = l(:label_bidding_homework_succeed)
end
# end
end
else
if @bid.reward_type == 3
- flash[:error] = l(:label_bidding_homework_fail)
+ flash.now[:error] = l(:label_bidding_homework_fail)
else
- flash[:error] = l(:label_bidding_fail)
+ flash.now[:error] = l(:label_bidding_fail)
end
end
@bidding_project = @bid.biding_projects
diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb
new file mode 100644
index 000000000..5511b15ca
--- /dev/null
+++ b/app/controllers/contests_controller.rb
@@ -0,0 +1,494 @@
+# fq
+# class BidsController < ApplicationController
+class ContestsController < ApplicationController
+ menu_item :respond
+ menu_item :project, :only => :show_project
+ menu_item :application, :only => :show_softapplication
+ before_filter :find_contest, :only => [:show_contest, :show_project, :show_softapplication, :create,:destroy,:more,:back,:add,:add_softapplication,:new,:show_results, :set_reward,
+ :show_contest_project, :show_contest_user, :join_in_contest, :unjoin_in_contest, :new_join,:show_participator, :settings]
+
+ # 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
+ include AttachmentsHelper
+ include ApplicationHelper
+ helper :projects
+ helper :words
+
+
+ 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?
+ @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'
+ unless @offset == 0
+ @contests = @contests.offset(@offset).limit(@limit).all.reverse
+ else
+ limit = @contest_count % @limit
+ limit = @limit if limit == 0
+ @contests = @contests.offset(@offset).limit(limit).all.reverse
+ end
+ @s_state = 0
+ when '1'
+ unless @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
+ end
+ @s_state = 1
+ when '2'
+ unless @offset == 0
+ @contests = @contests.offset(@offset).limit(@limit).all.reverse
+ else
+ limit = @contest_count % @limit
+ limit = @limit if limit == 0
+ @contests = @contests.offset(@offset).limit(@limit).all.reverse
+ end
+ @s_state = 0
+ end
+ else
+ unless @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
+ end
+ @s_state = 1
+ end
+ end
+
+ def show_contest
+ @user = @contest.author
+ @jours = @contest.journals_for_messages.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 new_join
+
+
+ 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
+
+ def show_contest_project
+ contests = Contest.where('parent_id = ?', @contest.id)
+ @projects = []
+ for contest in contests
+ @projects += contest.contesting_projects
+ 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 = []
+ for contest in contests
+ @softapplications += contest.contesting_softapplications
+ end
+
+ respond_to do |format|
+ format.html {
+ render :layout => 'base_newcontest'
+ }
+ format.api
+
+ end
+ end
+
+ def show_contest_user
+ contests = Contest.find(:all)
+ @users = []
+ for contest in contests
+ for project in contest.projects
+ @users += project.users
+ 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|
+ unless(membership.project.project_type==1)
+ membership.member_roles.each{|role|
+ if(role.role_id == 3)
+ @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|
+ if pro.project && pro.project.project_status
+ @temp << pro
+ end
+ @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 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
+ if ContestingProject.cerate_contesting(@contest.id, project.id, contest_message)
+ 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_path(@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_path(@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 manage
+
+ end
+
+ private
+
+ def find_contest
+ if params[:id]
+ @contest = Contest.find(params[:id])
+ @user = @contest.author
+ end
+ rescue
+ render_404
+ end
+
+end
+
diff --git a/app/controllers/praise_tread_controller.rb b/app/controllers/praise_tread_controller.rb
index 0fdb1b2c6..53df54e9f 100644
--- a/app/controllers/praise_tread_controller.rb
+++ b/app/controllers/praise_tread_controller.rb
@@ -69,6 +69,8 @@ class PraiseTreadController < ApplicationController
@obj = Project.find_by_id(id)
when 'Bid'
@obj = Bid.find_by_id(id)
+ when 'Contest'
+ @obj = Contest.find_by_id(id)
end
return @obj
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index c130d2ba6..3f771bf77 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -68,6 +68,8 @@ class ProjectsController < ApplicationController
helper :bids
include BidsHelper
+ helper :contests
+ include ContestsHelper
helper :sort
include SortHelper
helper :custom_fields
@@ -569,6 +571,7 @@ class ProjectsController < ApplicationController
"show_messages" => true,
"show_news" => true,
"show_bids" => true,
+ "show_contests" => true,
"show_journals_for_messages" => true
}
@date_to ||= Date.today + 1
diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb
new file mode 100644
index 000000000..9ac62f928
--- /dev/null
+++ b/app/controllers/softapplications_controller.rb
@@ -0,0 +1,194 @@
+class SoftapplicationsController < ApplicationController
+ # GET /softapplications
+ # GET /softapplications.json
+ def index
+ @softapplications = Softapplication.all
+
+ respond_to do |format|
+ format.html # index.html.erb
+ format.json { render json: @softapplications }
+ end
+ end
+
+ # GET /softapplications/1
+ # GET /softapplications/1.json
+ def show
+ @softapplication = Softapplication.find(params[:id])
+ @jours = @softapplication.journals_for_messages.order('created_on DESC')
+ @image_results = []
+ @softapplication.attachments.each do |f|
+ f.image? ? @image_results << f : @image_results
+ end
+ @app_items = []
+ @softapplication.attachments.each do |f|
+ f.pack? ? @app_items << f : @app_items
+ end
+ @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|
+ format.html # show.html.erb
+ format.json { render json: @softapplication }
+ end
+ end
+
+ # GET /softapplications/new
+ # GET /softapplications/new.json
+ def new
+ @softapplication = Softapplication.new
+
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @softapplication }
+ end
+ end
+
+ # GET /softapplications/1/edit
+ def edit
+ @softapplication = Softapplication.find(params[:id])
+ end
+
+ # POST /softapplications
+ # POST /softapplications.json
+ def create
+ @softapplication = Softapplication.new(params[:softapplication])
+ @softapplication.user = User.current
+ @softapplication.save_attachments(params[:attachments])
+ respond_to do |format|
+ if @softapplication.save
+ format.html { redirect_to @softapplication, notice: 'Softapplication was successfully created.' }
+ format.json { render json: @softapplication, status: :created, location: @softapplication }
+ else
+ format.html { render action: "new" }
+ format.json { render json: @softapplication.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # PUT /softapplications/1
+ # PUT /softapplications/1.json
+ def update
+ @softapplication = Softapplication.find(params[:id])
+
+ respond_to do |format|
+ if @softapplication.update_attributes(params[:softapplication])
+ format.html { redirect_to @softapplication, notice: 'Softapplication was successfully updated.' }
+ format.json { head :no_content }
+ else
+ format.html { render action: "edit" }
+ format.json { render json: @softapplication.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+
+ def add_attach
+ @softapplication = Softapplication.find(params[:id])
+ @softapplication.save_attachments(params[:attachments])
+ end
+
+ # DELETE /softapplications/1
+ # DELETE /softapplications/1.json
+ def destroy
+ @softapplication = Softapplication.find(params[:id])
+ @softapplication.destroy
+
+ respond_to do |format|
+ format.html { redirect_to softapplications_url }
+ format.json { head :no_content }
+ end
+ end
+ #应用评价涉及到的方法
+ def new_message
+ @jour = JournalsForMessage.find(params[:journal_id]) if params[:journal_id]
+ if @jour
+ user = @jour.user
+ text = @jour.notes
+ else
+ user = @softapplication.user
+ text = @softapplication.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 create_message
+
+ if params[:softapplication_message][:message].size>0
+ if params[:reference_content]
+ message = params[:softapplication_message][:message] + "\n" + params[:reference_content]
+ else
+ message = params[:softapplication_message][:message]
+ end
+ refer_user_id = params[:softapplication_message][:reference_user_id].to_i
+ @softapplication = Softapplication.find(params[:id])
+ @softapplication.add_jour(User.current, message, refer_user_id)
+
+ end
+
+ @user = @softapplication.user
+ @jours = @softapplication.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]
+ #@softapplication.set_commit(@feedback_count)
+
+ respond_to do |format|
+ format.js
+ end
+
+ end
+
+ ##删除评价
+ def destroy_message
+ @user = @softapplication.user
+ if User.current.admin? || User.current.id == @user.id
+ JournalsForMessage.delete_message(params[:object_id])
+ end
+ @jours = @softapplication.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]
+
+ @softapplication.set_commit(@feedback_count)
+ respond_to do |format|
+ format.js
+ end
+ end
+ #
+ def more
+ @jour = @softapplication.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 = @softapplication.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
+end
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 0d6331260..18cfcb3f3 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -11,6 +11,7 @@ class TagsController < ApplicationController
include BidsHelper
include ForumsHelper
include AttachmentsHelper
+ include ContestsHelper
include ActsAsTaggableOn::TagsHelper
helper :projects
include TagsHelper
@@ -30,7 +31,7 @@ class TagsController < ApplicationController
# 最后是2个过滤何种数据,显示结果的控制参数params[:obj_id],params[:object_falg]
# 0代表删除tag 1代表增加tag
def index
-
+
@obj_id = params[:obj_id]
@obj_flag = params[:object_flag]
@@ -44,28 +45,29 @@ class TagsController < ApplicationController
@tag = params[:tag]
@selected_tags = params[:current_selected_tags]
@selected_tags = @selected_tags.nil? ? Array.new : @selected_tags
-
+
case @do_what
when '0' then
- @selected_tags.delete @tag #数组中删除有多方式 可以改用shift,pop
+ @selected_tags.delete @tag #数组中删除有多方式 可以改用shift,pop
when '1' then
- # 判断是否已存在该tag 主要用来处理分页的情况
- unless @selected_tags.include? @tag
- @selected_tags << @tag
- end
+ # 判断是否已存在该tag 主要用来处理分页的情况
+ unless @selected_tags.include? @tag
+ @selected_tags << @tag
+ end
end
end
-
- @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num,
+
+ @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num,@contests_tags_num,
@forum_tags_num, @attachments_tags_num = get_tags_size
-
+
# 获取搜索结果
@obj,@obj_pages,@results_count,@users_results,
@projects_results,
@issues_results,
@bids_results,
@forums_results,
- @attachments_results = refresh_results(@obj_id,@obj_flag,@selected_tags)
+ @attachments_results,
+ @contests_tags = refresh_results(@obj_id,@obj_flag,@selected_tags)
# 这里是做tag推荐用的, 用来生产推荐的tags
unless @obj.nil?
@@ -74,13 +76,13 @@ class TagsController < ApplicationController
# @selected_tags.each do |i|
# @tags.delete(i)
# end
- @related_tags = @tags
+ @related_tags = @tags
else
return
end
end
-
+
# 增加已选的tag
def add_tag
@tag = params[:tag]
@@ -90,11 +92,13 @@ class TagsController < ApplicationController
$related_tags.delete(@tag)
# 获取搜索结果
- @obj,@obj_pages,@users_results,
+ @obj,@obj_pages,@results_count,@users_results,
@projects_results,
@issues_results,
@bids_results,
- @forums_results = refresh_results(@obj_id,@show_flag)
+ @forums_results,
+ @attachments_results,
+ @contests_results = refresh_results(@obj_id,@show_flag)
end
# 删除已选tag
@@ -110,13 +114,15 @@ class TagsController < ApplicationController
@projects_results,
@issues_results,
@bids_results,
- @forums_results = refresh_results(@obj_id,@show_flag)
+ @forums_results,
+ @attachments_results,
+ @contests_results = refresh_results(@obj_id,@show_flag)
end
def show_all
- @tags = ActsAsTaggableOn::Tag.find(:all)
+ @tags = ActsAsTaggableOn::Tag.find(:all)
end
-
+
# 完全从数据库删除tag
# 这种删除方式是针对 印有该 tag所有对象来做删除的
# 这样是从整个系统数据库中把该tag删除了
@@ -148,24 +154,24 @@ class TagsController < ApplicationController
# if can_remove_tag?(User.current,@taggable_id,@taggable_type)
- @taggings = ActsAsTaggableOn::Tagging.find_by_tag_id_and_taggable_id_and_taggable_type(@tag_id,@taggable_id,@taggable_type)
-
- unless @taggings.nil?
- @taggings.delete
- end
+ @taggings = ActsAsTaggableOn::Tagging.find_by_tag_id_and_taggable_id_and_taggable_type(@tag_id,@taggable_id,@taggable_type)
+
+ unless @taggings.nil?
+ @taggings.delete
+ end
# 是否还有其他记录 引用了 tag_id
- @tagging = ActsAsTaggableOn::Tagging.find_by_tag_id(@tag_id)
+ @tagging = ActsAsTaggableOn::Tagging.find_by_tag_id(@tag_id)
# 如果taggings表中记录已经不存在 ,那么检查tags表 作删除动作
- if @tagging.nil?
- @tag = ActsAsTaggableOn::Tag.find_by_id(@tag_id)
- @tag.delete unless @tag.nil?
- end
+ if @tagging.nil?
+ @tag = ActsAsTaggableOn::Tag.find_by_id(@tag_id)
+ @tag.delete unless @tag.nil?
+ end
# end
end
end
-private
+ private
# 这里用来刷新搜索结果的区域
# 函数的返回值 前2字段用来处理获取其他tag和分页 ,另外4个返回值为过滤结果
def refresh_results(obj_id,obj_flag,selected_tags)
@@ -173,6 +179,7 @@ private
@projects_results = nil
@issues_results = nil
@bids_results = nil
+ @contests_results = nil
@forums_results = nil
attachments_results = nil
@obj_pages = nil
@@ -203,10 +210,22 @@ private
# this is used to find the attachments that came from the same project and tagged with the same tag.
@result = get_attachments_by_project_tag(selected_tags, @obj)
@obj_pages, attachments_results, @results_count = for_pagination(@result)
+ when '7'
+ @obj = Contest.find_by_id(obj_id)
+ @obj_pages,@contests_results,@results_count = for_pagination(get_contests_by_tag(selected_tags))
else
- @obj = nil
+ @obj = nil
end
- return @obj,@obj_pages,@results_count,@users_results,@projects_results,@issues_results,@bids_results,@forums_results, attachments_results
+ return [@obj,
+ @obj_pages,
+ @results_count,
+ @users_results,
+ @projects_results,
+ @issues_results,
+ @bids_results,
+ @forums_results,
+ attachments_results,
+ @contests_results]
end
def for_pagination(results)
@@ -226,7 +245,8 @@ private
@bids_tags_num = Bid.tag_counts.size
forum_tags_num = Forum.tag_counts.size
attachment_tags_num = Attachment.tag_counts.size
- return @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num, forum_tags_num, attachment_tags_num
+ @contests_tags_num = Contest.tag_counts.size
+ return @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num, forum_tags_num, attachment_tags_num, @contests_tags_num
end
# 通过数字 来转换出对象的类型
@@ -247,6 +267,8 @@ private
return 'Forum'
when '6'
return 'Attachment'
+ when '7'
+ return 'Contest'
else
render_error :message => e.message
return
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 2142b6603..5d59a44fc 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -23,19 +23,20 @@ class UsersController < ApplicationController
menu_item :user_homework, :only => :user_homeworks
menu_item :user_project, :only => [:user_projects, :watch_projects]
menu_item :requirement_focus, :only => :watch_bids
+ menu_item :requirement_focus, :only => :watch_contests
menu_item :user_newfeedback, :only => :user_newfeedback
#Ended by young
- before_filter :require_admin, :except => [:show, :index, :search, :tag_save, :user_projects, :user_newfeedback, :user_comments, :watch_bids, :info,
+ before_filter :require_admin, :except => [:show, :index, :search, :tag_save, :user_projects, :user_newfeedback, :user_comments, :watch_bids, :watch_contests, :info,
:user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index,
:activity_score_index, :influence_score_index, :score_index]
#edit has been deleted by huang, 2013-9-23
before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses,
:user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments,
- :watch_bids, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index,
+ :watch_bids, :watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index,
:activity_score_index, :influence_score_index, :score_index]
accept_api_auth :index, :show, :create, :update, :destroy,:tag_save
@@ -116,6 +117,28 @@ class UsersController < ApplicationController
format.api
end
end
+
+#new add by linchun
+ def watch_contests
+ @bids = Contest.watched_by(@user)
+ @offset, @limit = api_offset_and_limit({:limit => 10})
+ @contest_count = @contests.count
+ @contest_pages = Paginator.new @contest_count, @limit, params['page']
+ @offset ||= @contest_pages.reverse_offset
+ unless @offset == 0
+ @contest = @contests.offset(@offset).limit(@limit).all.reverse
+ else
+ limit = @bid_count % @limit
+ @contest = @contests.offset(@offset).limit(limit).all.reverse
+ end
+
+ respond_to do |format|
+ format.html {
+ render :layout => 'base_users'
+ }
+ format.api
+ end
+ end
# added by fq
def user_activities
@@ -633,6 +656,8 @@ class UsersController < ApplicationController
@obj = Forum.find_by_id(@obj_id)
when '6'
@obj = Attachment.find_by_id(@obj_id)
+ when '7' then
+ @obj = Contest.find_by_id(@obj_id)
else
@obj = nil
end
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index 31168595e..9007551ed 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -80,7 +80,7 @@ class WelcomeController < ApplicationController
def entry_select_contest
if request.original_url.match(/contest\.trustie\.net/)
contest
- render :contest, layout: false
+ render :contest
return 0
end
end
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
index be1e31776..c83c123fc 100644
--- a/app/controllers/words_controller.rb
+++ b/app/controllers/words_controller.rb
@@ -190,6 +190,10 @@ class WordsController < ApplicationController
obj = User.find_by_id(obj_id)
elsif ( referer.match(/bids/) || referer.match(/calls/) )
obj = Bid.find_by_id(obj_id)
+ elsif ( referer.match(/contests/) || referer.match(/contests/) ) #new added
+ obj = Contest.find_by_id(obj_id)
+ elsif ( referer.match(/softapplications/) || referer.match(/softapplications/) ) #new added
+ obj = Softapplication.find_by_id(obj_id)
else
raise 'create reply obj unknow type.'
end
@@ -204,6 +208,10 @@ class WordsController < ApplicationController
Project.add_new_jour(nil, nil, obj.id, options)
elsif obj.kind_of? Bid
obj.add_jour(nil, nil, nil, options)
+ elsif obj.kind_of? Contest
+ obj.add_jour(nil, nil, obj.id, options) #new added
+ elsif obj.kind_of? Softapplication
+ obj.add_jour(nil, nil, obj.id, options) #new added
else
raise 'create reply obj unknow type.'
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 0ad4404d9..cae7b8b1e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -111,6 +111,14 @@ module ApplicationHelper
link_to text, url, html_options
end
+ def link_to_attachment_img(attachment, options={})
+ text = options.delete(:text) || attachment.filename
+ route_method = options.delete(:download) ? :download_named_attachment_path : :named_attachment_path
+ html_options = options.slice!(:only_path)
+ url = send(route_method, attachment, attachment.filename, options)
+ image_tag url, html_options
+ end
+
# Generates a link to a SCM revision
# Options:
# * :text - Link text (default to the formatted revision)
@@ -1402,6 +1410,71 @@ module ApplicationHelper
end
html.html_safe
end
+
+#display contest project
+ def show_more_contest_project?(contest)
+ if contest.projects.where('is_public = 1').count > 12
+ return true
+ else
+ return false
+ end
+ end
+
+ def show_more_contest_softapplication?(contest)
+ if contest.softapplications.where('is_public = 1').count > 12
+ return true
+ else
+ return false
+ end
+ end
+
+ def show_contest_project(bid)
+ html = ''
+ if contest.projects.where('is_public = 1').count == 0
+ html << (content_tag "p", l(:label_no_bid_project), :class => "font_lighter")
+ else
+ contest.projects.where('is_public = 1').take(12).each do |project|
+ html << (link_to image_tag(url_to_avatar(project), :class => "avatar", :title => project.name), project_path(project), :class => "avatar")
+ end
+ end
+ html.html_safe
+ end
+
+ def show_contest_project(contest)
+ html = ''
+ if contest.projects.where('is_public = 1').count == 0
+ html << (content_tag "p", l(:label_no_bid_project), :class => "font_lighter")
+ else
+ contest.projects.where('is_public = 1').take(12).each do |project|
+ html << (link_to image_tag(url_to_avatar(project), :class => "avatar", :title => project.name), project_path(project), :class => "avatar")
+ end
+ end
+ html.html_safe
+ end
+
+ def show_contest_softapplication(contest)
+ html = ''
+ if contest.softapplications.where('is_public = 1').count == 0
+ html << (content_tag "p", l(:label_no_contest_softapplication), :class => "font_lighter")
+ else
+ contest.softapplications.where('is_public = 1').take(12).each do |softapplication|
+ html << (link_to image_tag(url_to_avatar(project), :class => "avatar", :title => project.name), project_path(project), :class => "avatar")
+ end
+ end
+ html.html_safe
+ end
+
+ def show_contest_fans_picture(obj)
+ html = ''
+ if obj.watcher_users.count == 0
+ html << (content_tag "span", l(:label_project_no_follow))
+ else
+ obj.watcher_users.take(12).each do |user|
+ html << (link_to image_tag(url_to_avatar(user), :class => "avatar"), user_path(user), :class => "avatar", :title => user.name)
+ end
+ end
+ html.html_safe
+ end
#display fans picture
def show_more_fans?(obj)
@@ -1500,7 +1573,7 @@ module ApplicationHelper
courses_link = link_to l(:label_course_practice), {:controller => 'projects', :action => 'course', :project_type => 1, :host => Setting.course_domain}
projects_link = link_to l(:label_project_deposit), {:controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain}
users_link = link_to l(:label_software_user), {:controller => 'users', :action => 'index', :host => Setting.user_domain}
- contest_link = link_to l(:label_contest_innovate), {:controller => 'bids', :action => 'contest', :project_type => 1 , :host => Setting.contest_domain}
+ contest_link = link_to l(:label_contest_innovate), {:controller => 'contests', :action => 'index'}
bids_link = link_to l(:label_requirement_enterprise), {:controller => 'bids', :action => 'index'}
forum_link = link_to l(:label_project_module_forums), {:controller => "forums", :action => "index"}
stores_link = link_to l(:label_stores_index), {:controller => 'stores', :action=> 'index'}
@@ -1528,5 +1601,9 @@ module ApplicationHelper
end
content_tag :ul, content_li.html_safe
end
+
+ def current_user
+ User.current
+ end
end
diff --git a/app/helpers/contests_helper.rb b/app/helpers/contests_helper.rb
new file mode 100644
index 000000000..cb4d6a0f7
--- /dev/null
+++ b/app/helpers/contests_helper.rb
@@ -0,0 +1,172 @@
+#enconding:utf-8
+# fq
+module ContestsHelper
+
+ def render_notes(contest, journal, options={})
+ content = ''
+ removable = User.current == journal.user || User.current == contest.author
+ links = []
+ if !journal.notes.blank?
+ links << link_to(image_tag('comment.png'),
+ {:controller => 'contests', :action => 'new', :id => contest, :journal_id => journal},
+ :remote => true,
+ :method => 'post',
+ :title => l(:button_quote)) if options[:reply_links]
+ if removable
+ url = {:controller => 'contests',
+ :action => 'destroy',
+ :object_id => journal,
+ :id => contest}
+ links << ' '
+ links << link_to(image_tag('delete.png'), url,
+ :remote => true, :method => 'delete', :class => "delete", :title => l(:button_delete))
+ end
+ end
+ content << content_tag('div', links.join(' ').html_safe, :class => 'contextual') unless links.empty?
+ content << textilizable(journal.notes)
+ css_classes = "wiki"
+ content_tag('div', content.html_safe, :id => "journal-#{journal.id}-notes", :class => css_classes)
+ end
+
+ def link_to_in_place_notes_editor(text, field_id, url, options={})
+ onclick = "$.ajax({url: '#{url_for(url)}', type: 'get'}); return false;"
+ link_to text, '#', options.merge(:onclick => onclick)
+ end
+
+ # this method is used to get all projects that tagged one tag
+ # added by william
+ def get_contests_by_tag(tag_name)
+ Contest.tagged_with(tag_name).order('updated_on desc')
+ end
+
+ #added by huang
+ def sort_contest_enterprise(state, project_type)
+ content = ''.html_safe
+ case state
+ when 0
+ content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type)))
+ content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected")
+
+ when 1
+ content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:contest_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected")
+ content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:contest_sort_type => '0', :project_type => project_type)))
+ end
+ content = content_tag('ul', content)
+ content_tag('div', content, :class => "tabs_enterprise")
+ end
+ #end
+
+
+ #huang
+ def sort_contest(state)
+ content = ''.html_safe
+ case state
+ when 0
+ content << content_tag('li', link_to(l(:label_sort_by_active), {controller: 'contests', action: 'index' ,:contest_sort_type => '1'}))
+ content << content_tag('li', link_to(l(:label_sort_by_time), {controller: 'contests', action: 'index' ,:contest_sort_type => '0'}, :class=>"selected"), :class=>"selected")
+
+ when 1
+ content << content_tag('li', link_to(l(:label_sort_by_active), {controller: 'contests', action: 'index' ,:contest_sort_type => '1'}, :class=>"selected"), :class=>"selected")
+ content << content_tag('li', link_to(l(:label_sort_by_time), {controller: 'contests', action: 'index' ,:contest_sort_type => '0'}))
+ end
+ content = content_tag('ul', content)
+ content_tag('div', content, :class => "tabs")
+ end
+ #end
+
+ # def course_options_for_select(courses)
+ # # #{l(:label_choose_reward)}
+ # html = ''
+ # courses.each do |course|
+ # html << ""
+ # html << course.name
+ # html << " "
+ # end
+ # html.html_safe
+ # end
+
+
+ # used to get the reward and handle the value which can be used to display in views
+ # added by william
+ def get_prize(c_project)
+ c_project.get_reward
+ end
+
+ def count_contest_project
+ contests = Contest.find(:id)
+ @projects = []
+ for contest in contests
+ @projects += contest.contesting_projects
+ end
+ @projects.count
+ end
+
+ def count_contest_softapplication
+ contests = Contest.find(:id)
+ @softapplications = []
+ for contest in contests
+ @softapplications += contest.contesting_softapplications
+ end
+ @projects.count
+ end
+
+
+ def count_contest_user
+ contests = Contest.find(:id)
+ @users = []
+ for contest in contests
+ for project in contest.projects
+ @users += project.users
+ end
+ end
+ @users.count
+ end
+
+ def count_contest_softapplication_user
+ contests = Contest.find(:id)
+ @users = []
+ for contest in contests
+ for project in contest.softapplications
+ @users += softapplication.users
+ end
+ end
+ @users.count
+ end
+ def im_watching_student_id? contest
+ people = []
+ people << contest.author
+ # case bid.reward_type # 天煞的bid分了三用途,里面各种hasmany还不定能用!
+ # when 1
+ # when 2
+ # bid.join_in_contests.each do |jic|
+ # people << jic.user
+ # end
+ # when 3
+ # people += bid.courses.first.users.to_a
+ # else
+ # raise 'bids_helper: unknow bid type' # 出了错看这里!不知道的抛异常,省的找不到出错的地方!
+ # end
+
+ contest.join_in_contests.each do |jic|
+ people << jic.user
+ end
+ people.include?(User.current)
+ end
+
+ def select_option_helper option
+ tmp = Hash.new
+ option.each do |project|
+ tmp[project.name] = project.identifier
+ end
+ tmp
+ end
+ def select_option_app_helper options
+ tmp = Hash.new
+ options.each do |option|
+ tmp[option.name] = option.id
+ end
+ tmp
+ end
+
+
+end
\ No newline at end of file
diff --git a/app/helpers/softapplications_helper.rb b/app/helpers/softapplications_helper.rb
new file mode 100644
index 000000000..e3cb6410d
--- /dev/null
+++ b/app/helpers/softapplications_helper.rb
@@ -0,0 +1,2 @@
+module SoftapplicationsHelper
+end
diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb
index c4ee5273d..ba2470fe9 100644
--- a/app/helpers/tags_helper.rb
+++ b/app/helpers/tags_helper.rb
@@ -5,15 +5,17 @@ module TagsHelper
@obj = nil
case obj_type
when '1'
- @obj = User.find_by_id(obj_id)
+ @obj = User.find_by_id(obj_id)
when '2'
@obj = Project.find_by_id(obj_id)
when '3'
@obj = Issue.find_by_id(obj_id)
when '4'
- @obj = Bid.find_by_id(obj_id)
+ @obj = Bid.find_by_id(obj_id)
when '6'
@obj = Attachment.find_by_id(obj_id)
+ when '7'
+ @obj= Contest.find_by_id(obj_id)
else
raise Exception, '[TagsHelper] ===> tag type unknow.'
end
@@ -40,6 +42,10 @@ module TagsHelper
if user.id == obj_id
@result = true
end
+ when '7'
+ if user.id == obj_id
+ @result = true
+ end
end
return @result
end
diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb
index e05ef6ebd..fcaf63604 100644
--- a/app/helpers/watchers_helper.rb
+++ b/app/helpers/watchers_helper.rb
@@ -30,7 +30,7 @@ module WatchersHelper
objects = Array.wrap(objects)
watched = objects.any? {|object| object.watched_by?(user)}
- @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or (objects.first.instance_of?(Bid)))
+ @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid)))
css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) :
([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s)
@@ -46,6 +46,27 @@ module WatchersHelper
link_to text, url, :remote => true, :method => method, :class => css
end
+ ############## added by linchun
+ def new_watcher_link(objects, user, options=[])
+ return '' unless user && user.logged?
+ objects = Array.wrap(objects)
+
+ watched = objects.any? {|object| object.watched_by?(user)}
+ @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or (objects.first.instance_of?(Contest)))
+ css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) :
+ ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s)
+
+ text = @watch_flag ?
+ (watched ? l(:button_unfollow) : l(:button_follow)) : (watched ? l(:button_unwatch) : l(:button_watch))
+
+ url = watch_path(
+ :object_type => objects.first.class.to_s.underscore,
+ :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort)
+ )
+ method = watched ? 'delete' : 'post'
+
+ link_to text, url, :remote => true, :method => method, :class => css
+ end
# added by fq, modify nyan
# Somebody may use option params
def join_in_course(course, user, options=[])
@@ -93,8 +114,40 @@ module WatchersHelper
end
end
end
-
-
+ ##new add by linchun
+ def join_in_contest(contest, user, options=[])
+ return '' unless user && user.logged?
+ joined = user.join_in_contest?(contest)
+ text = joined ? l(:label_exit_contest) : l(:label_join_contest)
+ url_t = join_in_contest_path(:id => contest.id)
+ url_f = try_join_in_contest_path(:id => contest.id)
+ # url = join_in_contest_path(:id => contest.id)
+ method = joined ? 'delete' : 'post'
+ if joined
+ link_to text, url_t, :remote => true, :method => method, :id => "#{contest.id}", :confirm => l(:text_are_you_sure_out), :class => []+options
+ else
+ link_to text, url_f, :remote => true, :method => method, :id => "#{contest.id}", :class => []+options
+ end
+ end
+
+ # liuwanwei 的需求, 新竞赛
+ # 新路由命名为 competition
+ def join_in_competition(competition, user)
+ return '' unless user && user.logged?
+ joined = JoinInCompetition.where('competition_id = ? AND user_id = ?', competition.id, user.id).count>0
+ text = joined ? l(:label_exit_contest) : l(:label_join_contest)
+ url_f = new_join_contests_path(:id => competition.id)
+ url_t = unjoin_in_contest_contests_path(:id => competition.id)
+ method = joined ? 'delete' : 'post'
+ if joined
+ # 退出竞赛用
+ link_to text, url_t, :remote => true, :method => method, :id => "#{competition.id}", :confirm => l(:text_are_you_sure_out)
+ else
+ # 加入竞赛用
+ link_to text, url_f, :remote => true, :method => method, :id => "#{competition.id}"
+ end
+ end
+
# Returns the css class used to identify watch links for a given +object+
def watcher_css(objects)
objects = Array.wrap(objects)
diff --git a/app/helpers/welcome_helper.rb b/app/helpers/welcome_helper.rb
index 9d36f2bdf..10e8a4471 100644
--- a/app/helpers/welcome_helper.rb
+++ b/app/helpers/welcome_helper.rb
@@ -97,10 +97,14 @@ module WelcomeHelper
sort_bid_by_hot
end
- def find_all_hot_contest
- sort_contest_by_hot
+ def find_all_hot_contest limit=10
+ Contest.reorder("created_on DESC").all.take limit
end
+ def find_all_hot_softapplication limit=10
+ Softapplication.reorder("created_at DESC").all.take limit
+ end
+
def cal_memos_count event
return nil if event.parent_id
event.replies_count
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 768be578f..919760ee3 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -21,6 +21,7 @@ require "fileutils"
class Attachment < ActiveRecord::Base
belongs_to :container, :polymorphic => true
belongs_to :project, foreign_key: 'container_id', conditions: "attachments.container_type = 'Project'"
+ belongs_to :softapplication, foreign_key: 'container_id', conditions: "attachments.container_type = 'Softapplication'"
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
validates_presence_of :filename, :author
@@ -33,7 +34,7 @@ class Attachment < ActiveRecord::Base
acts_as_event :title => :filename,
:url => Proc.new {|o| {:controller => 'attachments', :action => 'download', :id => o.id, :filename => o.filename}}
- acts_as_activity_provider :type => 'files',
+ acts_as_activity_provider :type => 'files',
:permission => :view_files,
:author_key => :author_id,
:find_options => {:select => "#{Attachment.table_name}.*",
@@ -179,6 +180,10 @@ class Attachment < ActiveRecord::Base
!!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png)$/i)
end
+ def pack?
+ !!(self.filename =~ /\.(zip|rar|tar|gz)$/i)
+ end
+
def thumbnailable?
image?
end
diff --git a/app/models/contest.rb b/app/models/contest.rb
new file mode 100644
index 000000000..edc252574
--- /dev/null
+++ b/app/models/contest.rb
@@ -0,0 +1,119 @@
+class Contest < ActiveRecord::Base
+ attr_accessible :author_id, :budget, :commit, :deadline, :description, :name, :password
+ include Redmine::SafeAttributes
+
+ belongs_to :author, :class_name => 'User', :foreign_key => :author_id
+ has_many :contesting_projects, :dependent => :destroy
+ has_many :projects, :through => :contesting_projects
+ has_many :contesting_softapplications, :dependent => :destroy
+ has_many :softapplications, :through => :contesting_softapplications
+ has_many :projects_member, :class_name => 'User', :through => :projects
+ has_many :journals_for_messages, :as => :jour, :dependent => :destroy
+ has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ has_many :join_in_competitions, foreign_key: 'competition_id', :dependent => :destroy
+ has_many :join_in_contests, class_name: 'JoinInCompetition', foreign_key: 'competition_id', :dependent => :destroy
+
+
+
+ acts_as_attachable
+
+ NAME_LENGTH_LIMIT = 60
+ DESCRIPTION_LENGTH_LIMIT = 250
+
+ validates_length_of :name, :maximum => NAME_LENGTH_LIMIT
+ validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT
+ validates_presence_of :author_id, :name, :deadline
+ validates_format_of :deadline, :with => /^[\d]{4}[-][\d]{1,2}[-][\d]{1,2}$/
+ validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/
+ validate :validate_user
+ after_create :act_as_activity
+
+ scope :visible, lambda {|*args|
+ nil
+ }
+
+ scope :like, lambda {|arg|
+ if arg.blank?
+ where(nil)
+ else
+ pattern = "%#{arg.to_s.strip.downcase}%"
+ where("LOWER(id) LIKE :p OR LOWER(name) LIKE :p OR LOWER(description) LIKE :p", :p => pattern)
+ end
+ }
+
+ acts_as_watchable
+ acts_as_taggable
+
+ acts_as_event :title => Proc.new {|o| "#{l(:label_requirement)} ##{o.id}: #{o.name}" },
+ :description => :description,
+ :author => :author,
+ :url => Proc.new {|o| {:controller => 'contests', :action => 'show_contest', :id => o.id}}
+
+ acts_as_activity_provider :find_options => {:include => [:projects, :author]},
+ :author_key => :author_id
+
+ safe_attributes 'name',
+ 'description',
+ 'budget',
+ 'deadline',
+ 'password'
+
+
+ def add_jour(user, notes, reference_user_id = 0, options = {})
+ if options.count == 0
+ self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id)
+ else
+ jfm = self.journals_for_messages.build(options)
+ jfm.save
+ jfm
+ end
+ end
+
+ def self.creat_contests(budget, deadline, name, description=nil)
+ self.create(:author_id => User.current.id, :budget => budget,
+ :deadline => deadline, :name => name, :description => description, :commit => 0)
+ end
+
+ def update_contests(budget, deadline, name, description=nil)
+ if(User.current.id == self.author_id)
+ self.name = name
+ self.budget = budget
+ self.deadline = deadline
+ self.description = description
+ self.save
+ end
+ end
+
+ def delete_contests
+ unless self.nil?
+ if User.current.id == self.author_id
+ self.destroy
+ end
+ end
+ end
+
+ def set_commit(commit)
+ self.update_attribute(:commit, commit)
+ end
+
+ private
+
+ def validate_user
+ errors.add :author_id, :invalid if author.nil? || !author.active?
+ end
+
+
+ def act_as_activity
+ self.acts << Activity.new(:user_id => self.author_id)
+ end
+
+ def validate_contest_manager(user_id)
+ unless user_id.nil?
+ if self.author_id == user_id
+ return true
+ else
+ return false
+ end
+ end
+ end
+end
diff --git a/app/models/contesting_project.rb b/app/models/contesting_project.rb
new file mode 100644
index 000000000..cb2a7fe39
--- /dev/null
+++ b/app/models/contesting_project.rb
@@ -0,0 +1,52 @@
+class ContestingProject < ActiveRecord::Base
+ attr_accessible :contest_id, :description, :project_id, :user_id, :reward
+
+ belongs_to :contest
+ belongs_to :project
+ belongs_to :user
+
+ DESCRIPTION_LENGTH_LIMIT = 500
+
+ validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT
+ validates_presence_of :user_id, :contest_id, :project_id
+ validate :validate_user
+ validate :validate_contest
+ validate :validate_project
+ validates_uniqueness_of :contest_id, :scope => :project_id
+
+ def self.cerate_contesting(contest_id, project_id, description = nil)
+ self.create(:user_id => User.current.id, :contest_id => contest_id,
+ :project_id => project_id, :description => description)
+ end
+
+
+ def update_reward(which)
+ self.update_attribute(:reward,which)
+ end
+
+ def get_reward
+ self.reward
+ end
+
+ def cancel_contesting
+ unless self.nil?
+ if User.current.id == self.user_id
+ self.destroy
+ end
+ end
+ end
+
+ private
+
+ def validate_user
+ errors.add :user_id, :invalid if user.nil? || !user.active?
+ end
+
+ def validate_contest
+ errors.add :contest_id, :invalid if contest.nil?
+ end
+
+ def validate_project
+ errors.add :project_id, :invalid if project.nil?
+ end
+end
diff --git a/app/models/contesting_softapplication.rb b/app/models/contesting_softapplication.rb
new file mode 100644
index 000000000..93aea2658
--- /dev/null
+++ b/app/models/contesting_softapplication.rb
@@ -0,0 +1,15 @@
+
+class ContestingSoftapplication < ActiveRecord::Base
+ attr_accessible :contest_id, :description, :softapplication_id, :user_id
+
+ belongs_to :contest
+ belongs_to :softapplication
+ belongs_to :user
+
+
+ def self.create_softapplication_contesting(contest_id, softapplication_id, description = nil)
+ self.create(:user_id => User.current.id, :contest_id => contest_id,
+ :softapplication_id => softapplication_id, :description => description)
+ end
+
+end
diff --git a/app/models/homework_attach.rb b/app/models/homework_attach.rb
index 5ce08a0a8..fb743ab5c 100644
--- a/app/models/homework_attach.rb
+++ b/app/models/homework_attach.rb
@@ -1,5 +1,5 @@
class HomeworkAttach < ActiveRecord::Base
- include Redmine::SafeAttributes
+ include Redmine::SafeAttributes
belongs_to :user
belongs_to :bid
diff --git a/app/models/join_in_competition.rb b/app/models/join_in_competition.rb
new file mode 100644
index 000000000..707dccf07
--- /dev/null
+++ b/app/models/join_in_competition.rb
@@ -0,0 +1,10 @@
+# 新竞赛参加关系表
+class JoinInCompetition < ActiveRecord::Base
+ attr_accessible :competition_id, :user_id
+ belongs_to :user, :class_name => "User", :foreign_key => :user_id
+ belongs_to :competition, :class_name => "Contest", :foreign_key => :competition_id
+
+ validates :user_id, presence: true
+ validates :competition_id, presence: true
+
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index 3fe868792..e0cc27b3b 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -55,6 +55,7 @@ class Project < ActiveRecord::Base
has_many :changesets, :through => :repository
#added by xianbo for delete biding_project
has_many :biding_projects, :dependent => :destroy
+ has_many :contesting_projects, :dependent => :destroy
#ended by xianbo
# added by fq
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb
new file mode 100644
index 000000000..603279fbd
--- /dev/null
+++ b/app/models/softapplication.rb
@@ -0,0 +1,25 @@
+class Softapplication < ActiveRecord::Base
+ attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers
+ acts_as_attachable
+ seems_rateable :allow_update => true, :dimensions => :quality
+ seems_rateable_rater
+ has_many :journals_for_messages, :as => :jour, :dependent => :destroy
+ has_many :contesting_softapplications, :dependent => :destroy
+ belongs_to :user
+ belongs_to :contest
+
+ def add_jour(user, notes, reference_user_id = 0, options = {})
+ if options.count == 0
+ self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id)
+ else
+ jfm = self.journals_for_messages.build(options)
+ jfm.save
+ jfm
+ end
+ end
+ def set_commit(commit)
+ self.update_attribute(:commit, commit)
+ end
+
+
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index b9d752eb6..d14090c56 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -78,12 +78,17 @@ class User < Principal
belongs_to :ucourse, :class_name => 'Course', :foreign_key => :id #huang
## added by xianbo for delete
has_many :biding_projects, :dependent => :destroy
+ has_many :contesting_projects, :dependent => :destroy
+ has_many :contesting_softapplications, :dependent => :destroy
+ belongs_to :softapplication, :foreign_key => 'id', :dependent => :destroy
##ended by xianbo
#####fq
has_many :jours, :class_name => 'JournalsForMessage', :dependent => :destroy
has_many :journals_messages, :class_name => 'JournalsForMessage', :foreign_key => "user_id", :dependent => :destroy
has_many :bids, :foreign_key => 'author_id', :dependent => :destroy
+ has_many :contests, :foreign_key => 'author_id', :dependent => :destroy
+ has_many :softapplications, :foreign_key => 'user_id', :dependent => :destroy
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
has_many :new_jours, :as => :jour, :class_name => 'JournalsForMessage', :conditions => "status=1"
has_many :journal_replies, :dependent => :destroy
diff --git a/app/views/attachments/_app_link.html.erb b/app/views/attachments/_app_link.html.erb
new file mode 100644
index 000000000..ecef4dda3
--- /dev/null
+++ b/app/views/attachments/_app_link.html.erb
@@ -0,0 +1,10 @@
+
+<% for attachment in attachments %><%= link_to_attachment attachment, :class => 'icon icon-attachment', :download => true -%>
+ <% if attachment.is_text? %>
+ <%= link_to image_tag('magnifier.png'),
+ :controller => 'attachments', :action => 'show',
+ :id => attachment, :filename => attachment.filename %>
+ <% end %>
+ <%= h(" - #{attachment.description}") unless attachment.description.blank? %>
+ (<%= number_to_human_size attachment.filesize %>)
+ <% end -%>
diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb
new file mode 100644
index 000000000..4fb2865c8
--- /dev/null
+++ b/app/views/contests/_contest_list.html.erb
@@ -0,0 +1,49 @@
+
+<% contests.each do |contest|%>
+
+
+ <%= link_to(image_tag(url_to_avatar(contest.author), :class => 'avatar'), user_path(contest.author), :class => "avatar") %>
+
+
+
+ <%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>: <%= link_to(contest.name, show_contest_contest_path(contest), :class => 'bid_path') %>
+
+
+
+
+
+
+ <%= l(:label_contests_reward_method) %><%= contest.budget%>
+
+
+
+
+ <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %> )
+ <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %> )
+
+
+
+
+
+ <%= l :label_create_time %>: <%= format_time contest.created_on %>
+
+
+
+
+
+
+ <%= contest.description%>
+
+
+
+
+
+
+
+<% end %>
+
+
diff --git a/app/views/contests/_form_contest.html.erb b/app/views/contests/_form_contest.html.erb
new file mode 100644
index 000000000..5dc824d28
--- /dev/null
+++ b/app/views/contests/_form_contest.html.erb
@@ -0,0 +1,36 @@
+
+
+<%= error_messages_for 'contest' %>
+
+<%= l(:label_bids_form_contest_new_description) %>
+<%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Contest::NAME_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_name)}" %>
+
+<%= f.text_area :description, :rows => 8, :class => 'wiki-edit', :style => "font-size:small;width:490px;margin-left:10px;", :maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_description)}" %>
+
+<%= f.text_field :password, :size => 60, :style => "width:488px;margin-left: 10px;" %>
+
+
+ <%= f.text_field :budget, :required => true, :size => 60, :style => "width:350px;", :placeholder => l(:label_bids_reward_what) %>
+
+
+
+
+<%= f.text_field :deadline, :required => true, :size => 60, :style => "width:150px;", :placeholder => "#{l(:label_deadline)}" %><%= calendar_for('contest_deadline')%>
diff --git a/app/views/contests/_history.html.erb b/app/views/contests/_history.html.erb
new file mode 100644
index 000000000..6be572c65
--- /dev/null
+++ b/app/views/contests/_history.html.erb
@@ -0,0 +1,53 @@
+<% reply_allow = JournalsForMessage.create_by_user? User.current %>
+<% tip1 = l(:label_user_response) %>
+<%=tip1%>
+
+
+ <%= render :partial => 'new', :locals => {:contest => @contest, :sta => @state} %>
+
+
+
+<% if journals.size >0 %>
+
+ <% for journal in journals%>
+
+ <%= image_tag(url_to_avatar(journal.user), :class => "avatar") %>
+
+ <%= link_to journal.user, user_path(journal.user)%>
+ <% label = l(:label_contest_requirement) %>
+ <%= textilizable journal.notes%>
+ <%= l(:label_bids_published) %> <%= time_tag(journal.created_on).html_safe %> <%= l(:label_bids_published_ago) %>
+
+ <% ids = 'project_respond_form_'+ journal.id.to_s%>
+
+
+ <% if reply_allow %>
+ <%#= link_to(l(:button_quote), {:controller => 'contests', :action => 'new', :id => contest, :journal_id => journal}, :remote => true, :method => 'post', :title => l(:button_quote))%>
+ <%= link_to(l(:button_quote), contests_path(:id => contest, :journal_id => journal), :remote => true, :method => 'post', :title => l(:button_quote))%>
+ <%= link_to l(:label_bid_respond_quote),'',
+ {:focus => 'project_respond', :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea'), '#{l(:label_reply_plural)} #{journal.user.show_name}: '); $('##{ids} textarea') ;return false;"}%>
+ <% end %>
+
+ <% if @user==User.current|| User.current.admin? %>
+ <%#= link_to(l(:label_bid_respond_delete), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid},:confirm => l(:label_delete_confirm),
+ :remote => true, :method => 'delete', :class => "delete", :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %>
+ <%= link_to(l(:label_bid_respond_delete), {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %>
+ <% end %>
+
+
+
+
+ <% ids = 'project_respond_form_'+ journal.id.to_s%>
+ <% if reply_allow %>
+
+ <%= render :partial => 'words/new_respond', :locals => {:journal => journal, :m_reply_id => journal} %>
+
+ <% end %>
+
+
+ <%= render :partial => "words/journal_reply", :locals => {:journal => journal } %>
+
+
+ <% end %>
+
+<% end %>
diff --git a/app/views/contests/_list_projects.html.erb b/app/views/contests/_list_projects.html.erb
new file mode 100644
index 000000000..48a5ed328
--- /dev/null
+++ b/app/views/contests/_list_projects.html.erb
@@ -0,0 +1,103 @@
+
+<% contesting_project.each do |c_project|%>
+ <% if c_project.project %>
+
+
+
+
+
+
+
+ <%= image_tag(url_to_avatar(c_project.project), :class => 'avatar3') %>
+
+
+
+
+
+
+
+ <%= link_to(c_project.project.name, project_path(c_project.project)) %>
+
+ <%= l(:label_joined_contest)%>
+
+
+
+
+
+
+
+ <%= l(:label_system_grade) %>:<%= (c_project.project.project_status.nil? ? 0.0 : c_project.project.project_status.grade) unless (c_project.project.project_status.nil? && c_project.project.nil?) %>
+ <% if get_prize(c_project).nil? or get_prize(c_project) == "" %>
+ <% if @contest.deadline < Date.today %>
+ <%= l(:label_noawards)%>
+ <% end %>
+ <% else %>
+
+ <% case get_prize(c_project) %>
+ <% when '-1' %>
+ <%= image_tag("/images/bid/special_reward.png")%>
+ <% when '0' %>
+ <%= image_tag("/images/bid/first_reward.png")%>
+ <% when '1' %>
+ <%= image_tag("/images/bid/second_reward.png")%>
+ <% when '2' %>
+ <%= image_tag("/images/bid/third_reward.png")%>
+ <% when '3' %>
+ <%= image_tag("/images/bid/forth_reward.png")%>
+ <% when '4' %>
+ <%= image_tag("/images/bid/fifth_reward.png")%>
+ <% when '5' %>
+ <%= image_tag("/images/bid/qualified.png")%>
+ <% end %>
+ <% end %>
+
+
+
+
+
+
+
+ <%= c_project.project.description %>
+
+
+
+
+ <%= format_time c_project.created_at%>
+
+
+
+
+
+
+
+
+
+
+
+ <%= l(:label_contest_user) %>
+ <% unless c_project.user.nil? %>
+ <%= c_project.user.lastname %><%= c_project.user.firstname %>
+ <% end %>
+
+
+
+
+
+
+
+ <%= l(:label_contest_reason) %>
+ <%= c_project.description %>
+
+
+
+
+
+
+
+
+
+
+ <% end %>
+<% end %>
+
+
diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb
new file mode 100644
index 000000000..29c985b7e
--- /dev/null
+++ b/app/views/contests/_list_softapplications.html.erb
@@ -0,0 +1,35 @@
+
+<% contesting_softapplication.each do |c_softapplication|%>
+ <% if c_softapplication.softapplication %>
+
+
+
+ 应用软件:
+
+ <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication)) %>
+
+
+
+
+
+ 简介:
+
+ <%= c_softapplication.softapplication.description %>
+
+
+
+
+
+ 发布时间:
+
+ <%=format_time c_softapplication.created_at %>
+
+
+
+
+
+ <% end %>
+
+<% end %>
+
+
diff --git a/app/views/contests/_new.html.erb b/app/views/contests/_new.html.erb
new file mode 100644
index 000000000..2462d3fb1
--- /dev/null
+++ b/app/views/contests/_new.html.erb
@@ -0,0 +1,53 @@
+
+
+
+<%= form_for('contest_message',
+ :remote => true, :method => :post,
+ :url => {:controller => 'contests',
+ :action => 'create',
+ :id => contest,
+ :sta => sta}
+ ) do |f|%>
+
+
+ <%= render :partial => 'pre_show', :locals => {:content => @content} %>
+
+
+ <% if User.current.logged? %>
+
+
+ <%= f.text_area 'message', :rows => 3, :cols => 65, :placeholder => l(:label_my_respond), :style => "resize: none;", :class => 'noline'%>
+
+
+
+ <%= f.text_field :reference_user_id, :style=>"display:none"%>
+
+
+
+
+ <%= submit_tag l(:button_leave_meassge), :name => nil , :class => "contest_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'"%>
+ <%= submit_tag l(:button_clear), :name => nil, :onclick => "clearMessage('contest_message_message');", :type => 'button', :class => "bid_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'" %>
+
+
+
+ <% else %>
+
+ <%= l(:label_user_login_tips) %>
+ <%= link_to l(:label_user_login_new), signin_path %>
+
+ <% end %>
+<% end %>
diff --git a/app/views/contests/_new_join.html.erb b/app/views/contests/_new_join.html.erb
new file mode 100644
index 000000000..c764690de
--- /dev/null
+++ b/app/views/contests/_new_join.html.erb
@@ -0,0 +1,57 @@
+
+
+
+请输入竞赛密码
+
+<%= form_tag( join_in_contest_contests_path(id: contest.id),
+ :remote => true,
+ :method => :post,
+ :id => 'new-watcher-form') do %>
+
+
+
+
+
+ <%= text_field_tag 'contest_password', nil, :size => 45 %>
+
+
+ <%= submit_tag l(:label_new_join), :name => nil, :class => "contest_btn", :onclick => "hideModal(this);" %>
+ <%= submit_tag l(:button_cancel), :name => nil, :class => "contest_btn", :onclick => "hideModal(this);", :type => 'button' %>
+
+
+<% end %>
diff --git a/app/views/contests/_pre_show.html.erb b/app/views/contests/_pre_show.html.erb
new file mode 100644
index 000000000..fef1f16e4
--- /dev/null
+++ b/app/views/contests/_pre_show.html.erb
@@ -0,0 +1,13 @@
+
+<% unless content.nil?%>
+
+
+ <%= textilizable content %>
+
+
+ <%= hidden_field_tag 'reference_content', params[:reference_content], :value => content%>
+
+
+<% end %>
+
+
diff --git a/app/views/contests/_project_list.html.erb b/app/views/contests/_project_list.html.erb
new file mode 100644
index 000000000..325e87105
--- /dev/null
+++ b/app/views/contests/_project_list.html.erb
@@ -0,0 +1,15 @@
+
+<%= render_flash_messages %>
+
+
+ <%= l(:label_bidding_project) %>(<%= contesting_project.count%>)
+ <% if User.current.logged? %>
+
+
+ <%= toggle_link l(:button_contesting_as_project), 'put-bid-form' %>
+
+
+ <% end %>
+
+
+<%= render :partial=> "list_projects",:locals => {:contesting_project => contesting_project,:contest => @contest }%>
diff --git a/app/views/contests/_set_join.js.erb b/app/views/contests/_set_join.js.erb
new file mode 100644
index 000000000..346e1d846
--- /dev/null
+++ b/app/views/contests/_set_join.js.erb
@@ -0,0 +1,8 @@
+$("#<%=object_id%>").replaceWith('<%= escape_javascript join_in_competition(@contest, user) %>');
+<% if @state %>
+ <% if @state == 0 %>
+ alert("加入成功")
+ <% else %>
+ alert("密码错误")
+ <% end %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/contests/_softapplication_list.html.erb b/app/views/contests/_softapplication_list.html.erb
new file mode 100644
index 000000000..e5d030123
--- /dev/null
+++ b/app/views/contests/_softapplication_list.html.erb
@@ -0,0 +1,15 @@
+
+<%= render_flash_messages %>
+
+
+ <%= l(:label_contest_softapplication) %>(<%= @contest.contesting_softapplications.count%>)
+ <% if User.current.logged? %>
+
+
+
+ <%= link_to l(:button_contesting_as_application), "javascript:void(0);", onclick: "$('#put-bid-form').toggle();" %>
+
+
+ <% end %>
+
+<%= render :partial=> "list_softapplications",:locals => {:contesting_softapplication => contesting_softapplication,:contest => @contest }%>
diff --git a/app/views/contests/add.js.erb b/app/views/contests/add.js.erb
new file mode 100644
index 000000000..9c696d8aa
--- /dev/null
+++ b/app/views/contests/add.js.erb
@@ -0,0 +1,4 @@
+$('#contesting_project_list').html('<%= escape_javascript(render(:partial => 'project_list', :locals => {:contesting_project => @contesting_project})) %>');
+$("#project_id").val("请选择项目");
+$("#contest_message").val( "<%= l(:label_bid_reason) %>" );
+$("#put-bid-form").hide();
\ No newline at end of file
diff --git a/app/views/contests/add_softapplication.js.erb b/app/views/contests/add_softapplication.js.erb
new file mode 100644
index 000000000..6071c7070
--- /dev/null
+++ b/app/views/contests/add_softapplication.js.erb
@@ -0,0 +1,4 @@
+$('#contesting_softapplication_list').html('<%= escape_javascript(render(:partial => 'softapplication_list', :locals => {:contesting_softapplication => @contesting_softapplication})) %>');
+$("#softapplication_id").val("请选择参赛应用");
+$("#contest_message").val( "<%= l(:label_bid_reason) %>" );
+$("#put-bid-form").hide();
\ No newline at end of file
diff --git a/app/views/contests/back.js.erb b/app/views/contests/back.js.erb
new file mode 100644
index 000000000..d806c1481
--- /dev/null
+++ b/app/views/contests/back.js.erb
@@ -0,0 +1,2 @@
+$('#history').html('<%= escape_javascript(render(:partial => 'history', :locals => {:contest => @contest, :journals => @jour, :state => @state})) %>');
+$('#contest_message_reference_user_id').val("");
\ No newline at end of file
diff --git a/app/views/contests/create.js.erb b/app/views/contests/create.js.erb
new file mode 100644
index 000000000..9246d939c
--- /dev/null
+++ b/app/views/contests/create.js.erb
@@ -0,0 +1,4 @@
+$('#history').html('<%= escape_javascript(render(:partial => 'contests/history', :locals => {:contest => @contest, :journals => @jour, :state => true})) %>');
+$('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => nil})) %>');
+$('#contest_message_message').val("");
+$('#contest_message_reference_user_id').val("");
diff --git a/app/views/contests/destroy.js.erb b/app/views/contests/destroy.js.erb
new file mode 100644
index 000000000..a2f0fb2da
--- /dev/null
+++ b/app/views/contests/destroy.js.erb
@@ -0,0 +1,2 @@
+$('#history').html('<%= escape_javascript(render(:partial => 'history', :locals => {:contest => @contest, :journals => @jour, :state => false})) %>');
+$('#contest_message_reference_user_id').val("");
\ No newline at end of file
diff --git a/app/views/contests/index.html.erb b/app/views/contests/index.html.erb
new file mode 100644
index 000000000..3a7bde1e5
--- /dev/null
+++ b/app/views/contests/index.html.erb
@@ -0,0 +1,38 @@
+
+ <%= form_tag({:controller => 'contests', :action => 'index'}, :method => :get) do %>
+
+
+ <%= l(:label_contest_innovate) %>
+ <%= l(:label_user_location) %> :
+
+ <% if User.current.logged? %>
+ <% unless User.current.user_extensions.identity == 1 %>
+ <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add') %>
+ <% end %>
+ <% end %>
+
+
+
+ <%= text_field_tag 'name', params[:name], :size => 30 %>
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+
+
+
+
+ <%= link_to request.host()+"/contests", :controller => 'contests', :action => 'index' %>
+ <%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'contests', :action => 'index' %>
+
+
+ <% end %>
+
+<% if @contests.size > 0%>
+<%= sort_contest(@s_state)%>
+
+ <%= render :partial => 'contest_list', :locals => {:contests => @contests, :contest_pages => @contest_pages} %>
+
+<% else %>
+ <%= render :partial => "layouts/no_content"%>
+<% end %>
+
+<% html_title l(:label_contest_list)%>
diff --git a/app/views/contests/more.js.erb b/app/views/contests/more.js.erb
new file mode 100644
index 000000000..d806c1481
--- /dev/null
+++ b/app/views/contests/more.js.erb
@@ -0,0 +1,2 @@
+$('#history').html('<%= escape_javascript(render(:partial => 'history', :locals => {:contest => @contest, :journals => @jour, :state => @state})) %>');
+$('#contest_message_reference_user_id').val("");
\ No newline at end of file
diff --git a/app/views/contests/new.js.erb b/app/views/contests/new.js.erb
new file mode 100644
index 000000000..a251b3d69
--- /dev/null
+++ b/app/views/contests/new.js.erb
@@ -0,0 +1,5 @@
+$('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => @content})) %>');
+$('#contest_message_reference_user_id').val("<%= @id%>");
+showAndScrollTo("pre_show", "contest_message_reference_user_id");
+
+
diff --git a/app/views/contests/new_contest.html.erb b/app/views/contests/new_contest.html.erb
new file mode 100644
index 000000000..7366b4203
--- /dev/null
+++ b/app/views/contests/new_contest.html.erb
@@ -0,0 +1,10 @@
+
+<%=l(:label_newtype_contest)%>
+
+<%= labelled_form_for @contest, :url => {:controller => 'contests', :action => 'create_contest'}, method: :post do |f| %>
+
+ <%= render :partial => 'form_contest', :locals => { :f => f } %>
+ <%= submit_tag l(:button_create) %>
+ <%= javascript_tag "$('#bid_name').focus();" %>
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/contests/new_join.js.erb b/app/views/contests/new_join.js.erb
new file mode 100644
index 000000000..5ec9356d7
--- /dev/null
+++ b/app/views/contests/new_join.js.erb
@@ -0,0 +1,3 @@
+$('#ajax-modal').html('<%= escape_javascript(render :partial => 'contests/new_join', :locals => {:contest => @contest}) %>');
+showModal('ajax-modal', '400px');
+$('#ajax-modal').addClass('new-watcher');
diff --git a/app/views/contests/set_reward.js.erb b/app/views/contests/set_reward.js.erb
new file mode 100644
index 000000000..d6d8c4f9f
--- /dev/null
+++ b/app/views/contests/set_reward.js.erb
@@ -0,0 +1,31 @@
+$('#reward_result_<%= @contesting_project_id %>').html('<%= j(
+
+if get_prize(@b_p).nil? or get_prize(@b_p) == ""
+ if @contest.deadline < Date.today
+ puts '未评奖'
+ end
+else
+
+ case get_prize(@b_p)
+ when '-1'
+ image_tag("/images/bid/special_reward.png")
+ when '1'
+ when '0'
+ image_tag("/images/bid/first_reward.png")
+ when '1'
+ image_tag("/images/bid/second_reward.png")
+ when '2'
+ image_tag("/images/bid/third_reward.png")
+ when '3'
+ image_tag("/images/bid/forth_reward.png")
+ when '4'
+ image_tag("/images/bid/fifth_reward.png")
+ when '5'
+ image_tag("/images/bid/qualified.png")
+ end
+
+end
+)
+%>')
+
+$('#<%= @contesting_project_id %>').hide()
diff --git a/app/views/contests/settings.html.erb b/app/views/contests/settings.html.erb
new file mode 100644
index 000000000..def1c7f5d
--- /dev/null
+++ b/app/views/contests/settings.html.erb
@@ -0,0 +1,30 @@
+
+<%=l(:label_settings)%>
+
+<%= error_messages_for 'contest' %>
+
+<%= labelled_form_for @contest, :url => update_contest_contest_path(@contest) do |f| %>
+
+ <%= render :partial => 'form_contest', :locals => { :f => f } %>
+
+ <%= submit_tag l(:button_create) %>
+ <%= javascript_tag "$('#bid_name').focus();" %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/contests/show_contest.html.erb b/app/views/contests/show_contest.html.erb
new file mode 100644
index 000000000..9ce40bfcb
--- /dev/null
+++ b/app/views/contests/show_contest.html.erb
@@ -0,0 +1,34 @@
+<% reply_allow = JournalsForMessage.create_by_user? User.current %>
+
+
<%= image_tag(url_to_avatar(@contest.author), :class => "avatar")%>
+
+ <%= link_to(@contest.author.lastname+@contest.author.firstname, user_path(@contest.author))%>:<%= @contest.name %>
+
+ <%= l(:label_bids_reward_method) %><%= @contest.budget%>
+
+
+ <%= @contest.description %>
+
+
+
+ <%= render :partial => "/praise_tread/praise_tread",
+ :locals => {:obj => @contest,:show_flag => true,:user_id =>User.current.id}%>
+
+
+
+
+
+
+
+ <%= render :partial => 'history', :locals => { :contest => @contest, :journals => @jour, :state => false} %>
+
+
+
+
diff --git a/app/views/contests/show_contest_user.html.erb b/app/views/contests/show_contest_user.html.erb
new file mode 100644
index 000000000..43eb896ad
--- /dev/null
+++ b/app/views/contests/show_contest_user.html.erb
@@ -0,0 +1,30 @@
+
+ <% for user in @contest.watcher_users %>
+
+
+
+ <%= image_tag(url_to_avatar(user), :class => "avatar") %>
+
+
+ <%= content_tag "div", link_to_user(user), :class => "project_avatar_name" %>
+
+
+
+
+ <% unless user.memberships.empty? %>
+ <%= l(:label_x_contribute_to, :count => user.memberships.count) %>
+ <% for member in user.memberships %>
+ <%= link_to_project(member.project) %><%= (user.memberships.last == member) ? '' : ',' %>
+ <% end %>
+ <% end %>
+
+
+
+ <%= l(:label_user_joinin) %><%= format_date(user.created_on) %>
+
+
+
+
+
+<% end %>
+
\ No newline at end of file
diff --git a/app/views/contests/show_participator.html.erb b/app/views/contests/show_participator.html.erb
new file mode 100644
index 000000000..da51aef3a
--- /dev/null
+++ b/app/views/contests/show_participator.html.erb
@@ -0,0 +1,71 @@
+
+<%=link_to l(:label_x_join_in_contest, :count => @contest.join_in_contests.count)+"("+@contest.join_in_contests(@user.id).count.to_s+")", :controller=>"contests", :action=>"show_participator"%>
+
+ <% for temp in @contest.join_in_contests %>
+ <% user = temp.user %>
+
+
+
+
+
+
+ <%= link_to image_tag(url_to_avatar(user), :class => "avatar"), user_path(user), :title => "#{user.show_name}" %>
+
+
+
+
+ <%= content_tag "div", link_to(user.show_name, user_path(user)), :class => "project_avatar_name" , :title => "#{user.show_name}" %>
+
+ <% if (im_watching_student_id? @contest) && user.user_extensions.identity.to_i.eql?(1) %>
+ <%= l(:label_bidding_user_studentcode) %> :<%= user.user_extensions.student_id%>
+ <% end %>
+
+
+
+
+
+
+ <% unless user.memberships.empty? %>
+ <% cond = Project.visible_condition(User.current) + "AND projects.project_type <> 1" %>
+ <% memberships = user.memberships.all(:conditions => cond) %>
+ <%= l(:label_x_contribute_to, :count => memberships.count) %>
+ <%
+ links = Array.new
+ memberships.collect{|member| links << link_to_project(member.project) }
+ %>
+
+ <%= raw links.join(" , ") %>
+ <% end %>
+
+
+
+
+
+
+
+
+
+
+
+ <%= l(:label_user_joinin) %><%= format_date(user.created_on) %>
+
+
+
+
+
+
+
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/contests/show_project.html.erb b/app/views/contests/show_project.html.erb
new file mode 100644
index 000000000..202d3b632
--- /dev/null
+++ b/app/views/contests/show_project.html.erb
@@ -0,0 +1,100 @@
+
+
+
+
+
+ <% if User.current.logged? %>
+
+
+
+ <% end %>
+
+ <%= render :partial => 'project_list', :locals => {:contesting_project => @contesting_project,:contest => @contest} %>
+
+
+
diff --git a/app/views/contests/show_softapplication.html.erb b/app/views/contests/show_softapplication.html.erb
new file mode 100644
index 000000000..f320393ea
--- /dev/null
+++ b/app/views/contests/show_softapplication.html.erb
@@ -0,0 +1,102 @@
+
+
+
+
+
+ <% if User.current.logged? %>
+
+
+
+ <% end %>
+
+
+
+
+ <%= render :partial => 'softapplication_list', :locals => {:contesting_softapplication => @contesting_softapplication,:contest => @contest} %>
+
+
diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb
new file mode 100644
index 000000000..c0e23bf21
--- /dev/null
+++ b/app/views/layouts/base_newcontest.html.erb
@@ -0,0 +1,238 @@
+<% @nav_dispaly_contest_label = 1 %>
+
+
+
+
+ <%= h html_title %>
+
+
+ <%= csrf_meta_tag %>
+ <%= favicon %>
+ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %>
+ <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
+ <%= seems_rateable_stylesheet %>
+ <%= javascript_heads %>
+ <%= heads_for_theme %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%=render :partial => 'layouts/base_header'%>
+
+
+
+
+
+ 创新竞赛社区
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag({controller: 'contests', action: 'index'}, method: :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% end %>
+
+
+
+
+ <%=link_to request.host()+"/contests", :controller=>'contests', :action=>'index' %>
+ <%=link_to l(:field_homepage), home_path %> >
+ <%=link_to l(:label_contest_innovate), :controller=>'contests', :action=>'index' %> >
+ <%= link_to @contest.name, show_contest_contest_path %>
+
+
+
+
+
+
+
+
+
+ <% if display_main_menu?(@contest) %>
+
+ <%= render_menu :contest_menu %>
+
+ <% end %>
+
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+ <%=render :partial => 'layouts/base_footer'%>
+
+
+
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
diff --git a/app/views/projects/new.html.erb b/app/views/projects/new.html.erb
index 7044d69dd..aa03a1cc1 100644
--- a/app/views/projects/new.html.erb
+++ b/app/views/projects/new.html.erb
@@ -3,7 +3,7 @@
<% if @course_tag == '1' %>
<%=l(:label_course_new)%>
-
<%=raw l(:label_course_news_description)%>
+
<%= render :partial => 'course_form', :locals => { :f => f } %>
<%= submit_tag l(:button_create), :class => "enterprise"%>
diff --git a/app/views/softapplications/_form.html.erb b/app/views/softapplications/_form.html.erb
new file mode 100644
index 000000000..5a046801f
--- /dev/null
+++ b/app/views/softapplications/_form.html.erb
@@ -0,0 +1,64 @@
+<%= form_for(@softapplication) do |f| %>
+
+ <% if @softapplication.errors.any? %>
+
+
<%= pluralize(@softapplication.errors.count, "error") %> prohibited this softapplication from being saved:
+
+
+ <% @softapplication.errors.full_messages.each do |msg| %>
+ <%= msg %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= l(:label_softapplication_name) %>
+ * :
+ <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
+ <%= l(:label_softapplication_name_condition)%>
+ br>
+
+
+ <%= l(:label_softapplication_version_available) %>
+ * :
+ <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+ <%= l(:label_softapplication_type) %>
+ * :
+ <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+ <%= l(:label_softapplication_description) %>
+ * :
+ <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+
+ <%=l(:label_upload_softapplication_packets)%> :
+
+ <%= render :partial => 'attachments/form' %>
+
+
+ br> br> br> br> br>
+
+
+
+
<%=l(:label_upload_softapplication_photo)%> : (
<%=l(:label_upload_softapplication_photo_condition)%> )
+
+ <%= render :partial => 'attachments/form' %>
+
+
+
+
+<% end %>
+
diff --git a/app/views/softapplications/_message_history.erb b/app/views/softapplications/_message_history.erb
new file mode 100644
index 000000000..4190e899d
--- /dev/null
+++ b/app/views/softapplications/_message_history.erb
@@ -0,0 +1,32 @@
+<% reply_allow = JournalsForMessage.create_by_user? User.current %>
+
+
+
+ <%= render :partial => 'new_message', :locals => {:softapplication => @softapplication, :sta => @state} %>
+
+
+
+<% if journals.size >0 %>
+
+ <% for journal in journals%>
+
+ <%= image_tag(url_to_avatar(journal.user), :class => "avatar") %>
+
+ <%= link_to journal.user, user_path(journal.user)%>
+ <% label = l(:label_contest_requirement) %>
+ <%= textilizable journal.notes%>
+ <%= l(:label_bids_published) %> <%= time_tag(journal.created_on).html_safe %> <%= l(:label_bids_published_ago) %>
+
+ <% ids = 'project_respond_form_'+ journal.id.to_s%>
+
+
+ <% if @user==User.current|| User.current.admin? %>
+ <%= link_to(l(:label_bid_respond_delete), {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %>
+ <% end %>
+
+
+
+
+ <% end %>
+
+<% end %>
diff --git a/app/views/softapplications/_new_message.erb b/app/views/softapplications/_new_message.erb
new file mode 100644
index 000000000..321c7911f
--- /dev/null
+++ b/app/views/softapplications/_new_message.erb
@@ -0,0 +1,53 @@
+
+
+
+<%= form_for('softapplication_message',
+ :remote => true, :method => :post,
+ :url => {:controller => 'softapplications',
+ :action => 'create_message',
+ :id => softapplication,
+ :sta => sta}
+ ) do |f|%>
+
+
+ <%= render :partial => 'pre_show', :locals => {:content => @content} %>
+
+
+ <% if User.current.logged? %>
+
+
+ <%= f.text_area 'message', :rows => 3, :cols => 65, :placeholder => l(:label_my_respond), :style => "resize: none;", :class => 'noline'%>
+
+
+
+ <%= f.text_field :reference_user_id, :style=>"display:none"%>
+
+
+
+
+ <%= submit_tag l(:label_button_ok), :name => nil , :class => "softapplication_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'"%>
+ <%= submit_tag l(:button_clear_requirement), :name => nil, :onclick => "clearMessage('softapplication_message_message');", :type => 'button', :class => "bid_btn", :onmouseout => "this.style.backgroundPosition = 'left top'", :onmouseover => "this.style.backgroundPosition = 'left -31px'" %>
+
+
+
+ <% else %>
+
+ <%= l(:label_user_login_tips) %>
+ <%= link_to l(:label_user_login_new), signin_path %>
+
+ <% end %>
+<% end %>
diff --git a/app/views/softapplications/_pre_show.html.erb b/app/views/softapplications/_pre_show.html.erb
new file mode 100644
index 000000000..fef1f16e4
--- /dev/null
+++ b/app/views/softapplications/_pre_show.html.erb
@@ -0,0 +1,13 @@
+
+<% unless content.nil?%>
+
+
+ <%= textilizable content %>
+
+
+ <%= hidden_field_tag 'reference_content', params[:reference_content], :value => content%>
+
+
+<% end %>
+
+
diff --git a/app/views/softapplications/back.js.erb b/app/views/softapplications/back.js.erb
new file mode 100644
index 000000000..acd52a63e
--- /dev/null
+++ b/app/views/softapplications/back.js.erb
@@ -0,0 +1,2 @@
+$('#message_history').html('<%= escape_javascript(render(:partial => 'history_message', :locals => {:softapplication => @softapplication, :journals => @jour, :state => @state})) %>');
+$('#softapplication_message_reference_user_id').val("");
\ No newline at end of file
diff --git a/app/views/softapplications/create_message.js.erb b/app/views/softapplications/create_message.js.erb
new file mode 100644
index 000000000..bd0b13369
--- /dev/null
+++ b/app/views/softapplications/create_message.js.erb
@@ -0,0 +1,4 @@
+$('#history').html('<%= escape_javascript(render(:partial => 'softapplications/message_history', :locals => {:contest => @softapplication, :journals => @jour, :state => true})) %>');
+$('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => nil})) %>');
+$('#softapplication_message_message').val("");
+$('#softapplication_message_reference_user_id').val("");
diff --git a/app/views/softapplications/edit.html.erb b/app/views/softapplications/edit.html.erb
new file mode 100644
index 000000000..f93e091d2
--- /dev/null
+++ b/app/views/softapplications/edit.html.erb
@@ -0,0 +1,6 @@
+
Editing softapplication
+
+<%= render 'form' %>
+
+<%= link_to 'Show', @softapplication %> |
+<%= link_to 'Back', softapplications_path %>
diff --git a/app/views/softapplications/index.html.erb b/app/views/softapplications/index.html.erb
new file mode 100644
index 000000000..be9245876
--- /dev/null
+++ b/app/views/softapplications/index.html.erb
@@ -0,0 +1,33 @@
+
Listing softapplications
+
+
+
+ Name
+ Description
+ App type
+ App type name
+ Android min version available
+ User
+
+
+
+
+
+<% @softapplications.each do |softapplication| %>
+
+ <%= softapplication.name %>
+ <%= softapplication.description %>
+ <%= softapplication.app_type_id %>
+ <%= softapplication.app_type_name %>
+ <%= softapplication.android_min_version_available %>
+ <%= softapplication.user_id %>
+ <%= link_to 'Show', softapplication %>
+ <%= link_to 'Edit', edit_softapplication_path(softapplication) %>
+ <%= link_to 'Destroy', softapplication, method: :delete, data: { confirm: 'Are you sure?' } %>
+
+<% end %>
+
+
+
+
+<%= link_to 'New Softapplication', new_softapplication_path %>
diff --git a/app/views/softapplications/more.js.erb b/app/views/softapplications/more.js.erb
new file mode 100644
index 000000000..fc67a9fed
--- /dev/null
+++ b/app/views/softapplications/more.js.erb
@@ -0,0 +1,2 @@
+$('#message_history').html('<%= escape_javascript(render(:partial => 'message_history', :locals => {:softapplication => @softapplication, :journals => @jour, :state => @state})) %>');
+$('#softapplication_message_reference_user_id').val("");
\ No newline at end of file
diff --git a/app/views/softapplications/new.html.erb b/app/views/softapplications/new.html.erb
new file mode 100644
index 000000000..d7ea95799
--- /dev/null
+++ b/app/views/softapplications/new.html.erb
@@ -0,0 +1,77 @@
+
<%= l(:label_release_softapplication)%>
+
+
+
+ <%= form_for Softapplication.new, :url => {:controller => 'softapplications', :action => 'create'}, :update => "bidding_project_list", :complete => '$("#put-bid-form").hide();', :html => {:multipart => true, :id => 'add_homework_form'} do |f| %>
+
+
+
+ <%= l(:label_softapplication_name) %>
+ * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %>
+ <%= l(:label_softapplication_name_condition)%>
+ br>
+
+
+
+
+ <%= l(:label_softapplication_version_available) %>
+ * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+
+ <%= l(:label_softapplication_type) %>
+
+ * : <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+
+ <%= l(:label_softapplication_description) %>
+ * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+
+ <%= l(:label_softapplication_developers) %>
+ * : <%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %>
+
+ br>
+
+
+
+ 上传应用软件包和应用截图
+ <%= render_flash_messages %>
+
+ <%= render :partial => 'attachments/form' %>
+
+ (<%=l(:label_upload_softapplication_photo_condition)%>)
+
+
+
+
<%= submit_tag l(:button_create), :onclick => "return true" %>
+
+
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/softapplications/new.html.erb.BASE.erb b/app/views/softapplications/new.html.erb.BASE.erb
new file mode 100644
index 000000000..40c6a4059
--- /dev/null
+++ b/app/views/softapplications/new.html.erb.BASE.erb
@@ -0,0 +1,12 @@
+<%=l(:label_release_softapplication)%>
+
+
+<%= labelled_form_for @softapplication, :url => {:controller => 'softapplications', :action => 'create'}, method: :post do |f| %>
+
+ <%= render :partial => 'form', :locals => { :f => f } %>
+ <%= submit_tag l(:button_create) %>
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/softapplications/new.html.erb.LOCAL.erb b/app/views/softapplications/new.html.erb.LOCAL.erb
new file mode 100644
index 000000000..bf4e19f3f
--- /dev/null
+++ b/app/views/softapplications/new.html.erb.LOCAL.erb
@@ -0,0 +1,12 @@
+<%=l(:label_release_softapplication)%>
+
+
+<%= labelled_form_for @softapplication, :url => {:controller => 'softapplications', :action => 'create'}, method: :post do |f| %>
+
+ <%= render :partial => 'form', :locals => { :f => f } %>
+ <%= submit_tag l(:button_create) %>
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/softapplications/new.html.erb.REMOTE.erb b/app/views/softapplications/new.html.erb.REMOTE.erb
new file mode 100644
index 000000000..820165819
--- /dev/null
+++ b/app/views/softapplications/new.html.erb.REMOTE.erb
@@ -0,0 +1,64 @@
+<%= l(:label_release_softapplication)%>
+
+
+
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/softapplications/new_message.js.erb b/app/views/softapplications/new_message.js.erb
new file mode 100644
index 000000000..ea1d02a33
--- /dev/null
+++ b/app/views/softapplications/new_message.js.erb
@@ -0,0 +1,5 @@
+$('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => @content})) %>');
+$('#softapplication_message_reference_user_id').val("<%= @id%>");
+showAndScrollTo("pre_show", "softapplication_message_reference_user_id");
+
+
diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb
new file mode 100644
index 000000000..fcd746776
--- /dev/null
+++ b/app/views/softapplications/show.html.erb
@@ -0,0 +1,86 @@
+
+
+
+<%= notice %>
+
+
+
+
+
+
+
+
+
+ <%= @softapplication.name %>
+
+
+ 所属类别:<%= @softapplication.app_type_name %>
+ 发布时间:<%=format_time @softapplication.created_at %>
+
+
+ 发布人员:<%= @softapplication.user.name %>
+ 系统支持:<%= @softapplication.android_min_version_available %>
+
+
+ 应用下载:
+ <% options = {:author => true, :deletable => @softapplication.user.eql?(User.current) } %>
+ <%= render :partial => 'attachments/app_link', :locals => {:attachments => @app_items, :options => options} %>
+
+ 开发人员:<%= @softapplication.application_developers %>
+
+
+ rate: <%=rating_for @softapplication, :dimension => :qulity %>
+
+
+
+
+
+
+
+
+
+
+
应用简介:
+
<%= @softapplication.description %>
+
+
+
+
+
软件截图:
+
+ <% @image_results.take(4).each do |attachment| %>
+ <%= link_to_attachment_img attachment, :class => "soft-application", :download => "true" %>
+ <% end %>
+
+
+
+
+
+
+
+
+
+
+ <%= render :partial => 'message_history', :locals => { :contest => @softapplication, :journals => @jour, :state => false} %>
+
+
+
+
+
+
+
+<%#= link_to '返回竞赛页面', show_softapplication_contest_path(contest)) %>
+
diff --git a/app/views/tags/_show_contests.html.erb b/app/views/tags/_show_contests.html.erb
new file mode 100644
index 000000000..79c756522
--- /dev/null
+++ b/app/views/tags/_show_contests.html.erb
@@ -0,0 +1,15 @@
+
+ <% if contests_results.size > 0 %>
+
+ <% contests_results.each do |contest| %>
+
+ <%= l(:label_tags_contest) %>:<%= link_to "#{contest.name}",
+ :controller => "contests",:action => "show",:id => contest.id %>
+
+ <%= l(:label_tags_contest_description) %>: <%= contest.description %>
+ <%= contest.updated_on %>
+
+
+ <% end %>
+ <% end %>
+
diff --git a/app/views/tags/_sidebar_tags.html.erb b/app/views/tags/_sidebar_tags.html.erb
index a9570f609..8db485d1f 100644
--- a/app/views/tags/_sidebar_tags.html.erb
+++ b/app/views/tags/_sidebar_tags.html.erb
@@ -9,4 +9,6 @@
(<%= Bid.tagged_with("#{sg}").size %>)
<% when '5' then %>
(<%= Forum.tagged_with("#{sg}").size %>)
+<% when '6' then %>
+(<%= Attachment.tagged_with("#{sg}").size %>)
<% end %>
diff --git a/app/views/tags/_tag.html.erb b/app/views/tags/_tag.html.erb
index 0d9467025..896b6a2c8 100644
--- a/app/views/tags/_tag.html.erb
+++ b/app/views/tags/_tag.html.erb
@@ -6,6 +6,7 @@
4 代表是bid类型
5 代表是forum类型
6 代表是Attachment类型
+ 7 代表是contest类型
#end%>
<% if object_flag == '3' %>
diff --git a/app/views/tags/_tag_name.html.erb b/app/views/tags/_tag_name.html.erb
index d1291ee78..297f813df 100644
--- a/app/views/tags/_tag_name.html.erb
+++ b/app/views/tags/_tag_name.html.erb
@@ -79,6 +79,13 @@
<%= link_to 'x',:controller => "tags",:action => "remove_tag",:remote => true,:tag_name => tag,
:taggable_id => obj.id,:taggable_type => object_flag %>
<% end %>
+ <% when '7'%>
+ <% if obj.author_id == User.current.id %>
+
+ <%= link_to 'x',:controller => "tags",:action => "remove_tag",:remote => true,:tag_name => tag,
+ :taggable_id => obj.id,:taggable_type => object_flag %>
+
+ <% end %>
<% end %>
diff --git a/app/views/tags/_tag_search_results.html.erb b/app/views/tags/_tag_search_results.html.erb
index c67ece520..49a5bcd82 100644
--- a/app/views/tags/_tag_search_results.html.erb
+++ b/app/views/tags/_tag_search_results.html.erb
@@ -19,6 +19,9 @@
<% when show_flag == '6'%>
<%= l(:label_attachment)%>(<%= @results_count %>)
<%= render :partial => "show_attachments",:locals => {:attachments_results => attachments_results}%>
+ <% when show_flag == '7'%>
+ <%= l(:label_contest_innovate)%>(<%= @results_count %>)
+ <%= render :partial => "show_contests",:locals => {:contests_results => contests_results}%>
<% else %>
<%= l(:label_tags_all_objects)%>
@@ -26,6 +29,7 @@
<%= render :partial => "show_users",:locals => {:users_results => users_results }%>
<%= render :partial => "show_projects",:locals => {:projects_results => projects_results }%>
<%= render :partial => "show_bids",:locals => {:bids_results => bids_results}%>
+ <%= render :partial => "show_contests",:locals => {:contests_results => contests_results}%>
<% end %>
<% else %>
diff --git a/app/views/tags/add_tag.js.erb b/app/views/tags/add_tag.js.erb
index fb4dd5af9..662e3f77c 100644
--- a/app/views/tags/add_tag.js.erb
+++ b/app/views/tags/add_tag.js.erb
@@ -5,6 +5,6 @@ $('#related_tags').html('<%= j(render :partial => "related_tags",
$('#show_results').html('<%= j(render :partial => "tag_search_results",:locals => {:issues_results => @issues_results,
:projects_results => @projects_results,:users_results => @users_results,
- :bids_results => @bids_results ,:show_flag => @show_flag,:obj_pages => @obj_pages })%>')
+ :bids_results => @bids_results,:contests_results => @contests_results,:show_flag => @show_flag,:obj_pages => @obj_pages })%>')
diff --git a/app/views/tags/delete_tag.js.erb b/app/views/tags/delete_tag.js.erb
index 37f0de92f..19cd2f5e9 100644
--- a/app/views/tags/delete_tag.js.erb
+++ b/app/views/tags/delete_tag.js.erb
@@ -5,6 +5,6 @@ $('#related_tags').html('<%= j(render :partial => "related_tags",
$('#show_results').html('<%= j(render :partial => "tag_search_results",:locals => {:issues_results => @issues_results,
:projects_results => @projects_results,:users_results => @users_results,
- :bids_results => @bids_results ,:show_flag => @show_flag ,:obj_pages => @obj_pages })%>')
+ :bids_results => @bids_results ,:contests_results => @contests_results ,:show_flag => @show_flag ,:obj_pages => @obj_pages })%>')
diff --git a/app/views/tags/index.html.erb b/app/views/tags/index.html.erb
index 17ac58184..48ba53d88 100644
--- a/app/views/tags/index.html.erb
+++ b/app/views/tags/index.html.erb
@@ -23,12 +23,20 @@
<%= l(:label_user_plural) %>(<%= @users_tags_num %>) |
<%= l(:label_tags_call)%>(<%= @bids_tags_num %>) |
<%= l(:field_filename)%>(<%= @attachments_tags_num %>)
+ <%= l(:label_tags_contest)%>(<%= @contests_tags_num %>) |
<%# 求工厂模式重构 %>
- <%= render :partial => "tag_search_results",:locals => {:issues_results => @issues_results,
- :projects_results => @projects_results,:users_results => @users_results ,
- :bids_results=>@bids_results,:forums_results => @forums_results, :attachments_results => @attachments_results, :show_flag => @obj_flag}%>
+ <%= render :partial => "tag_search_results",
+ :locals => {:issues_results => @issues_results,
+ :projects_results => @projects_results,
+ :users_results => @users_results,
+ :bids_results => @bids_results,
+ :forums_results => @forums_results,
+ :attachments_results=> @attachments_results,
+ :contests_results => @contests_results,
+ :show_flag => @obj_flag}
+ %>
diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb
index 6a0a8413f..f3d7f092e 100644
--- a/app/views/welcome/contest.html.erb
+++ b/app/views/welcome/contest.html.erb
@@ -1,9 +1,232 @@
+<%= stylesheet_link_tag 'welcome' %>
+
+
+
+
-
- 正在升级中。。。。。。。。。。。。
+
+ <%= image_tag '/images/qrweixin.jpg', size: '150x150', alt: 'trustie', class: "weixin" %>
+
微信扫码
+
+
+
+
+ <%= l(:label_welcome_trustie) %><%= l(:label_welcome_trustie_contest) %> , <%= l(:label_welcome_trustie_contest_description) %>
+
+
+
+
+
+ <%= form_tag({controller: 'contests', action: 'index'}, method: :get) do %>
+ <%= text_field_tag 'name', params[:name], placeholder:'请输入要搜索的关键字', name: "name", :class => 'blueinputbar', :style => 'width:240px; padding-right:50px;'%>
+
+ <%= hidden_field_tag 'project_type', params[:project_type] %>
+ <%= submit_tag l(:label_search), :class => "enterprise" , :name => nil%>
+ <% end %>
+
+
+
-
+
+
+
+
+
+
最新热门竞赛
+
<%= link_to "更多>>", {:controller => 'contests', :action => 'index', :host => Setting.contest_domain}, :target => "_blank" %>
+
+
+ <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[5]) %>
+
+
+
+ <%= image_tag('/images/039.gif')%>
+
+
+
+ <%= link_to(contest.name, show_contest_contest_path(contest.id), :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %>
+
+
+
+ ><%=contest.description.truncate(50, omission: '...')%>
+
+
+
+ <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %> )
+ <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %> )
+
+
+
+ <% end; reset_cycle %>
+
+
+
+
+
+
+
+
+ 问题和反馈动态
+ <%= link_to "我要提问" , newbie_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
+ <%= link_to "我要反馈" , suggestion_send_path, {:class => 'orangeButton idea_btn', :style => "color: #EEEEEE" }%>
+
+
<%= link_to "更多>>", forums_path %>
+
+
+ <% find_new_forum_topics(11).each do |topic|%>
+
+
+
+ <%= link_to topic.subject.truncate(30, omission: '...'), topic.event_url, :class => "gray" , :style => "font-size: 10pt !important;" %>
+
+
+ <%= l(:field_updated_on) %><%=time_tag_welcome(topic_last_time topic)%>前
+
+ 由 <%= link_to topic.author ? topic.author : 'Anonymous', user_path(topic.author_id), :style => "font-size: 9pt !important; color: rgb(17, 102, 173);" %> 发表
+
+ 回复(<%= link_to (topic.parent ? topic.parent.replies_count : topic.replies_count), topic.event_url %>)
+
+
+ <% end %>
+
+
+
+
+
+
最新参赛应用
+
+
+
+ <% find_all_hot_softapplication.map do |softapplication| break if(softapplication == find_all_hot_softapplication[5]) %>
+
+
+
+ <%= image_tag('/images/009.gif')%>
+
+
+
+ <%= link_to(softapplication.name, softapplication_path(softapplication.id), :class => "d-g-blue d-p-project-name", :title => "#{softapplication.name}", :target => "_blank") %>
+
+
+
+ ><%=softapplication.description.truncate(50, omission: '...')%>
+
+
+
+ 发布时间:<%=format_time softapplication.created_at %>
+
+
+
+ <% end; reset_cycle %>
+
+
+
+
+
+
+
diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb
index c583e0449..c2262a270 100644
--- a/app/views/words/destroy.js.erb
+++ b/app/views/words/destroy.js.erb
@@ -1,6 +1,6 @@
<% if @journal_destroyed.nil? %>
alert('<%=l(:notice_failed_delete)%>');
-<% elsif (['Principal','Project', 'Bid'].include? @journal_destroyed.jour_type)%>
+<% elsif (['Principal','Project', 'Bid', 'Contest', 'Softapplication'].include? @journal_destroyed.jour_type)%>
var destroyedItem = $('#word_li_<%=@journal_destroyed.id%>')
destroyedItem.fadeOut(600,function(){
destroyedItem.remove();
diff --git a/config/application.rb b/config/application.rb
index 593eed64e..d37a9eae2 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -1,6 +1,7 @@
require File.expand_path('../boot', __FILE__)
require 'rails/all'
+require 'sprockets/railtie'
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
diff --git a/config/locales/zh.yml b/config/locales/zh.yml
index 2423b8485..5cc7b7d8d 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -1550,8 +1550,10 @@ zh:
label_welcome_trustie: Trustie
label_welcome_trustie_project: 在线项目托管平台
label_welcome_trustie_course: 在线课程实践平台
+ label_welcome_trustie_contest: 在线竞赛实战平台
label_welcome_trustie_project_description: 面向中国大学生与软件从业者,提供社交化的项目管理、代码托管、资源共享、合作交流。
label_welcome_trustie_course_description: 面向中国高校教师与大学生,提供社交化的课程管理、资源共享、合作实验、协同研究。
+ label_welcome_trustie_contest_description: 面向中国大学生与编程爱好者,提供社交化的竞赛管理、应用管理、代码托管、合作交流。
label_user_project: 项目
label_user_course: 课程
label_user_homework: 作业
@@ -1813,3 +1815,42 @@ zh:
label_contest_reason: 参赛宣言:
label_notification: 通知
label_sumbit_empty: 搜索内容不能为空
+
+ #add by linchun (竞赛相关)
+ label_upload_files: 上传文件
+ label_upload_softwarepackage: 上传软件包
+ label_upload_cuttingphoto: 上传截图
+ label_contests_reward_method: 奖励方式
+ label_system_platform: 系统平台
+ label_nextstep: 下一步
+ label_participate: 参赛者
+ label_contest_project: 参赛项目
+ label_contest_softapplication: 参赛应用
+ label_contest_response: 用户反馈
+ label_contest_watchers: 关注人员
+ label_contest_application: 参赛应用
+ button_contesting_as_project: 我要参赛(新建项目)
+ button_contesting_as_application: 我要参赛(发布应用)
+ label_release_softapplication: 发布应用
+ label_upload_softapplication_packets: 上传应用软件包
+ label_upload_softapplication_photo: 上传产品截图
+ label_upload_softapplication_photo_condition: 截图至少上传2张,至多4张;格式为gif/jpg/png, 尺寸480*800, 每张小于2M
+ label_softapplication_name: 应用名称
+ label_softapplication_description: 应用简介
+ label_softapplication_type: 应用分类
+ label_softapplication_version_available: 适配版本
+ label_softapplication_developer: 上传人员
+ label_softapplication_developers: 开发人员
+ label_softapplication_name_condition: 25个汉字以内(50个字符)
+ label_user_login_softapplication_board: 您还没有登录,请登录后参与应用评价。
+ label_contest_description_no: 暂无描述。
+ label_no_contest_softapplication: 暂无参赛应用
+ label_button_ok: 确定
+ label_tags_contest: 竞赛标签
+ label_tags_contest: 竞赛名称
+ label_tags_contest_description: 竞赛描述
+ label_release_add_contest_succeed: 该应用发布并添加成功.
+ label_add_contest_succeed_fail: 添加失败,该应用已参赛.
+
+
+
diff --git a/config/routes.rb b/config/routes.rb
index 8e7a2501e..17e09f5a8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -23,7 +23,41 @@ RedmineApp::Application.routes.draw do
match 'courselist'
match 'zip'
end
-
+ ##new added by linchun #以发布应用的形式参与竞赛
+ resources :softapplications do
+
+ collection do
+ match 'new_message', via: :get
+ end
+ member do
+ match 'create_message' , via: :post
+ end
+ end
+
+ ## new added by linchun #新竞赛相关
+ resources :contests, only: [:index] do
+ collection do
+ match 'new_contest' , via: :get
+ match 'join_in_contest' , via: :post
+ match 'unjoin_in_contest' , via: :delete
+ match 'create_contest' , via: :post
+ match 'new_join' , via: :post
+ match 'new' , via: :post
+ end
+ member do
+ match 'add_softapplication'
+ match 'update_contest' , via: [:put]
+ match 'show_contest' , via: :get
+ match 'show_project' , via: :get
+ match 'show_softapplication', via: :get
+ match 'show_participator' , via: :get
+ match 'add' , via: [:get, :post]
+ match 'add_softapplication' , via: [:get, :post]
+ match 'create' , via: :post
+ match 'settings' , via: [:get, :post]
+ end
+ end
+
resources :stores do
collection do
match 'search', via: [:get, :post]
@@ -549,7 +583,7 @@ RedmineApp::Application.routes.draw do
match 'calls', :controller => 'bids', :action => 'index'
match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond'
- match 'contest', :controller => 'bids', :action => 'contest', :as => 'contest'
+ match 'contest', :controller => 'bids', :action => 'contests', :as => 'contest' #modified @20140403
########################
diff --git a/db/migrate/20140327071420_create_contests.rb b/db/migrate/20140327071420_create_contests.rb
new file mode 100644
index 000000000..0ec04a6c5
--- /dev/null
+++ b/db/migrate/20140327071420_create_contests.rb
@@ -0,0 +1,15 @@
+class CreateContests < ActiveRecord::Migration
+ def change
+ create_table :contests do |t|
+ t.string :name
+ t.integer :budget
+ t.integer :author_id
+ t.date :deadline
+ t.string :description
+ t.integer :commit
+ t.string :password
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20140327073052_create_contesting_projects.rb b/db/migrate/20140327073052_create_contesting_projects.rb
new file mode 100644
index 000000000..b9dc336b2
--- /dev/null
+++ b/db/migrate/20140327073052_create_contesting_projects.rb
@@ -0,0 +1,12 @@
+class CreateContestingProjects < ActiveRecord::Migration
+ def change
+ create_table :contesting_projects do |t|
+ t.integer :project_id
+ t.string :contest_id
+ t.integer :user_id
+ t.string :description
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20140327082704_change_created_at_of_contests_to_created_on.rb b/db/migrate/20140327082704_change_created_at_of_contests_to_created_on.rb
new file mode 100644
index 000000000..32d52d35a
--- /dev/null
+++ b/db/migrate/20140327082704_change_created_at_of_contests_to_created_on.rb
@@ -0,0 +1,11 @@
+class ChangeCreatedAtOfContestsToCreatedOn < ActiveRecord::Migration
+ def self.up
+ rename_column :contests, :created_at, :created_on
+ rename_column :contests, :updated_at, :updated_on
+ end
+
+ def self.down
+ rename_column :contests, :created_on, :created_at
+ rename_column :contests, :updated_on, :updated_at
+ end
+end
diff --git a/db/migrate/20140401121611_add_reward_to_contesting_projects.rb b/db/migrate/20140401121611_add_reward_to_contesting_projects.rb
new file mode 100644
index 000000000..8ac71c94b
--- /dev/null
+++ b/db/migrate/20140401121611_add_reward_to_contesting_projects.rb
@@ -0,0 +1,5 @@
+class AddRewardToContestingProjects < ActiveRecord::Migration
+ def change
+ add_column :contesting_projects, :reward, :string
+ end
+end
diff --git a/db/migrate/20140402023357_create_join_in_competitions.rb b/db/migrate/20140402023357_create_join_in_competitions.rb
new file mode 100644
index 000000000..b7fba87f1
--- /dev/null
+++ b/db/migrate/20140402023357_create_join_in_competitions.rb
@@ -0,0 +1,10 @@
+class CreateJoinInCompetitions < ActiveRecord::Migration
+ def change
+ create_table :join_in_competitions do |t|
+ t.integer :user_id
+ t.integer :competition_id
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20140404030103_create_softapplications.rb b/db/migrate/20140404030103_create_softapplications.rb
new file mode 100644
index 000000000..f9094d9c9
--- /dev/null
+++ b/db/migrate/20140404030103_create_softapplications.rb
@@ -0,0 +1,14 @@
+class CreateSoftapplications < ActiveRecord::Migration
+ def change
+ create_table :softapplications do |t|
+ t.string :name
+ t.string :description
+ t.integer :app_type_id
+ t.string :app_type_name
+ t.string :android_min_version_available
+ t.integer :user_id
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20140410015850_add_contest_id_to_softapplications.rb b/db/migrate/20140410015850_add_contest_id_to_softapplications.rb
new file mode 100644
index 000000000..b7b73a4aa
--- /dev/null
+++ b/db/migrate/20140410015850_add_contest_id_to_softapplications.rb
@@ -0,0 +1,5 @@
+class AddContestIdToSoftapplications < ActiveRecord::Migration
+ def change
+ add_column :softapplications, :contest_id, :integer
+ end
+end
diff --git a/db/migrate/20140410020848_add_softapplication_id_to_softapplications.rb b/db/migrate/20140410020848_add_softapplication_id_to_softapplications.rb
new file mode 100644
index 000000000..e4a51f535
--- /dev/null
+++ b/db/migrate/20140410020848_add_softapplication_id_to_softapplications.rb
@@ -0,0 +1,5 @@
+class AddSoftapplicationIdToSoftapplications < ActiveRecord::Migration
+ def change
+ add_column :softapplications, :softapplication_id, :integer
+ end
+end
diff --git a/db/migrate/20140411003234_create_contesting_softapplications.rb b/db/migrate/20140411003234_create_contesting_softapplications.rb
new file mode 100644
index 000000000..118b518f5
--- /dev/null
+++ b/db/migrate/20140411003234_create_contesting_softapplications.rb
@@ -0,0 +1,12 @@
+class CreateContestingSoftapplications < ActiveRecord::Migration
+ def change
+ create_table :contesting_softapplications do |t|
+ t.integer :softapplication_id
+ t.integer :contest_id
+ t.integer :user_id
+ t.string :description
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20140411004155_add_reward_to_contesting_softapplications.rb b/db/migrate/20140411004155_add_reward_to_contesting_softapplications.rb
new file mode 100644
index 000000000..e5e3db183
--- /dev/null
+++ b/db/migrate/20140411004155_add_reward_to_contesting_softapplications.rb
@@ -0,0 +1,5 @@
+class AddRewardToContestingSoftapplications < ActiveRecord::Migration
+ def change
+ add_column :contesting_softapplications, :reward, :string
+ end
+end
diff --git a/db/migrate/20140411005214_add_is_public_to_softapplications.rb b/db/migrate/20140411005214_add_is_public_to_softapplications.rb
new file mode 100644
index 000000000..15d81699e
--- /dev/null
+++ b/db/migrate/20140411005214_add_is_public_to_softapplications.rb
@@ -0,0 +1,5 @@
+class AddIsPublicToSoftapplications < ActiveRecord::Migration
+ def change
+ add_column :softapplications, :is_public, :integer
+ end
+end
diff --git a/db/migrate/20140414012423_add_applicationdevelopers_to_softapplications.rb b/db/migrate/20140414012423_add_applicationdevelopers_to_softapplications.rb
new file mode 100644
index 000000000..2a4ad1081
--- /dev/null
+++ b/db/migrate/20140414012423_add_applicationdevelopers_to_softapplications.rb
@@ -0,0 +1,5 @@
+class AddApplicationdevelopersToSoftapplications < ActiveRecord::Migration
+ def change
+ add_column :softapplications, :application_developers, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 669a6cb03..b4a9ba972 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -185,6 +185,38 @@ ActiveRecord::Schema.define(:version => 20140417091429) do
add_index "comments", ["author_id"], :name => "index_comments_on_author_id"
add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type"
+ create_table "contesting_projects", :force => true do |t|
+ t.integer "project_id"
+ t.string "contest_id"
+ t.integer "user_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ end
+
+ create_table "contesting_softapplications", :force => true do |t|
+ t.integer "softapplication_id"
+ t.integer "contest_id"
+ t.integer "user_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ end
+
+ create_table "contests", :force => true do |t|
+ t.string "name"
+ t.integer "budget"
+ t.integer "author_id"
+ t.date "deadline"
+ t.string "description"
+ t.integer "commit"
+ t.string "password"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ end
+
create_table "courses", :force => true do |t|
t.integer "tea_id"
t.string "name"
@@ -521,6 +553,13 @@ ActiveRecord::Schema.define(:version => 20140417091429) do
add_index "issues", ["status_id"], :name => "index_issues_on_status_id"
add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id"
+ create_table "join_in_competitions", :force => true do |t|
+ t.integer "user_id"
+ t.integer "competition_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
create_table "join_in_contests", :force => true do |t|
t.integer "user_id"
t.integer "bid_id"
@@ -858,6 +897,21 @@ ActiveRecord::Schema.define(:version => 20140417091429) do
t.string "description"
end
+ create_table "softapplications", :force => true do |t|
+ t.string "name"
+ t.string "description"
+ t.integer "app_type_id"
+ t.string "app_type_name"
+ t.string "android_min_version_available"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "contest_id"
+ t.integer "softapplication_id"
+ t.integer "is_public"
+ t.string "application_developers"
+ end
+
create_table "students_for_courses", :force => true do |t|
t.integer "student_id"
t.integer "course_id"
diff --git a/lib/redmine.rb b/lib/redmine.rb
index 0ede4d1d8..43e47a26a 100644
--- a/lib/redmine.rb
+++ b/lib/redmine.rb
@@ -276,6 +276,16 @@ Redmine::MenuManager.map :bid_menu do |menu|
# menu.push :result, { :controller => 'bids', :action => 'show_results' },
# :caption => :label_bidding_results,:if => Proc.new{ |p| User.current.id == p }
end
+###new add by linchun
+Redmine::MenuManager.map :contest_menu do |menu|
+ menu.push :respond, :show_contest_contest_path, :caption => :label_user_response
+ # menu.push :project, :show_project_contest_path, :caption => :label_contest_project
+ menu.push :application, :show_softapplication_contest_path, :caption => :label_contest_application
+ # menu.push :result, { :controller => 'bids', :action => 'show_results' },
+ # :caption => :label_bidding_results,:if => Proc.new{ |p| User.current.id == p }
+end
+
+####
Redmine::MenuManager.map :application_menu do |menu|
# Empty
end
diff --git a/public/images/008.jpg b/public/images/008.jpg
new file mode 100644
index 000000000..378e72164
Binary files /dev/null and b/public/images/008.jpg differ
diff --git a/public/images/009.gif b/public/images/009.gif
new file mode 100644
index 000000000..b90b130fb
Binary files /dev/null and b/public/images/009.gif differ
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index 2845c3ce0..3067b0f23 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -1,3 +1,4 @@
+//= require_directory ./rateable
/* Redmine - project management software
Copyright (C) 2006-2013 Jean-Philippe Lang */
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index c3572f930..678346bb3 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -9,6 +9,14 @@ h4, .wiki h3 {font-size: 13px;}
h4 {border-bottom: 1px dotted #bbb;}
/*huang*/
/*current position*/
+.contest_count{
+ width: 20%;
+ height: 60px;
+ border: 1px solid #15bccf;
+ border-radius: 5px 5px 5px 5px;
+ float:right;
+}
+
.top-content{
background-color: #f7f7f7;
height: 56px;
@@ -2698,4 +2706,38 @@ div.repos_explain{
margin-left: -220px;
}
+/* new linchun compitition */
+.contest_underline{
+ margin:1;
+ padding:1;
+ width:900px;
+ height:0.5px;
+ background-color:#aaa;
+ overflow:hidden
+}
+.underline-contests_one{
+ margin-bottom: 10px;
+ border-bottom: 1px dashed rgb(204, 204, 204);
+ width: 930px;
+}
+.underline-contests_two{
+ margin-bottom: 10px;
+ border-bottom: 1px dashed rgb(204, 204, 204);
+ width: 660px;
+}
+.underline-contests_three{
+ margin-bottom: 10px;
+ border-bottom: 1px dashed rgb(204, 204, 204);
+ width: 688px;
+}
+.contest-star{
+ color: #bb0000;
+}
+
+.contes-new-box{
+ background: #fcfcfc;
+ padding-left: 85px;
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
diff --git a/test/fixtures/contesting_softapplications.yml b/test/fixtures/contesting_softapplications.yml
new file mode 100644
index 000000000..4b64c8b03
--- /dev/null
+++ b/test/fixtures/contesting_softapplications.yml
@@ -0,0 +1,13 @@
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
+
+one:
+ softapplication_id: 1
+ contest_id: 1
+ user_id: 1
+ description: MyString
+
+two:
+ softapplication_id: 1
+ contest_id: 1
+ user_id: 1
+ description: MyString
diff --git a/test/fixtures/softapplications.yml b/test/fixtures/softapplications.yml
new file mode 100644
index 000000000..0ab48299f
--- /dev/null
+++ b/test/fixtures/softapplications.yml
@@ -0,0 +1,17 @@
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
+
+one:
+ name: MyString
+ description: MyString
+ app_type_id: 1
+ app_type_name: MyString
+ android_min_version_available: MyString
+ user_id: 1
+
+two:
+ name: MyString
+ description: MyString
+ app_type_id: 1
+ app_type_name: MyString
+ android_min_version_available: MyString
+ user_id: 1
diff --git a/test/functional/softapplications_controller_test.rb b/test/functional/softapplications_controller_test.rb
new file mode 100644
index 000000000..8c5611cb9
--- /dev/null
+++ b/test/functional/softapplications_controller_test.rb
@@ -0,0 +1,49 @@
+require 'test_helper'
+
+class SoftapplicationsControllerTest < ActionController::TestCase
+ setup do
+ @softapplication = softapplications(:one)
+ end
+
+ test "should get index" do
+ get :index
+ assert_response :success
+ assert_not_nil assigns(:softapplications)
+ end
+
+ test "should get new" do
+ get :new
+ assert_response :success
+ end
+
+ test "should create softapplication" do
+ assert_difference('Softapplication.count') do
+ post :create, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id }
+ end
+
+ assert_redirected_to softapplication_path(assigns(:softapplication))
+ end
+
+ test "should show softapplication" do
+ get :show, id: @softapplication
+ assert_response :success
+ end
+
+ test "should get edit" do
+ get :edit, id: @softapplication
+ assert_response :success
+ end
+
+ test "should update softapplication" do
+ put :update, id: @softapplication, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id }
+ assert_redirected_to softapplication_path(assigns(:softapplication))
+ end
+
+ test "should destroy softapplication" do
+ assert_difference('Softapplication.count', -1) do
+ delete :destroy, id: @softapplication
+ end
+
+ assert_redirected_to softapplications_path
+ end
+end
diff --git a/test/unit/contesting_softapplication_test.rb b/test/unit/contesting_softapplication_test.rb
new file mode 100644
index 000000000..0c1364caa
--- /dev/null
+++ b/test/unit/contesting_softapplication_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class ContestingSoftapplicationTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/unit/helpers/softapplications_helper_test.rb b/test/unit/helpers/softapplications_helper_test.rb
new file mode 100644
index 000000000..ad8173602
--- /dev/null
+++ b/test/unit/helpers/softapplications_helper_test.rb
@@ -0,0 +1,4 @@
+require 'test_helper'
+
+class SoftapplicationsHelperTest < ActionView::TestCase
+end
diff --git a/test/unit/softapplication_test.rb b/test/unit/softapplication_test.rb
new file mode 100644
index 000000000..b3872eec5
--- /dev/null
+++ b/test/unit/softapplication_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class SoftapplicationTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end