diff --git a/.gitignore b/.gitignore
index daa8b3ace..cf96fa998 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/.project
+/.idea
/.bundle
/config/database.yml
diff --git a/Gemfile b/Gemfile
index dd19b4435..63dd32df4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,5 +1,11 @@
source 'https://rubygems.org'
+unless RUBY_PLATFORM =~ /w32/
+ # unix-like only
+ gem 'iconv'
+ gem 'rubyzip'
+ gem 'zip-zip'
+end
gem "rails", "3.2.13"
gem "jquery-rails", "~> 2.0.2"
gem "i18n", "~> 0.6.0"
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/javascripts/zipdown.js b/app/assets/javascripts/zipdown.js
new file mode 100644
index 000000000..dee720fac
--- /dev/null
+++ b/app/assets/javascripts/zipdown.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/assets/stylesheets/zipdown.css b/app/assets/stylesheets/zipdown.css
new file mode 100644
index 000000000..afad32db0
--- /dev/null
+++ b/app/assets/stylesheets/zipdown.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 1c02326a7..6edd2a8c8 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -150,6 +150,7 @@ class AttachmentsController < ApplicationController
ori = Attachment.find_by_id(attach_id)
next if ori.blank?
attach_copied_obj = ori.copy
+ attach_copied_obj.tag_list.add(ori.tag_list) # tag关联
attach_copied_obj.container = obj
attach_copied_obj.created_on = Time.now
attach_copied_obj.author_id = User.current.id
@@ -174,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/files_controller.rb b/app/controllers/files_controller.rb
index 35e27a87f..86a20d3eb 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -33,8 +33,8 @@ class FilesController < ApplicationController
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
- @containers = [ Project.includes(:attachments).reorder("attachments.created_on DESC").find(@project.id)] #modify by Long Jun
- @containers += @project.versions.includes(:attachments).reorder("created_on DESC").all.sort
+ @containers = [ Project.includes(:attachments).reorder("#{Attachment.table_name}.created_on DESC").find(@project.id)] #modify by Long Jun
+ @containers += @project.versions.includes(:attachments).reorder("#{Attachment.table_name}.created_on DESC").all.sort
if @project.project_type == 1
render :layout => 'base_courses'
diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb
index be1a331e0..991af0154 100644
--- a/app/controllers/forums_controller.rb
+++ b/app/controllers/forums_controller.rb
@@ -11,6 +11,42 @@ class ForumsController < ApplicationController
include SortHelper
PageLimit = 20
+
+ def create_memo
+ @memo = Memo.new(params[:memo])
+ @memo.forum_id = @forum.id
+ @memo.author_id = User.current.id
+
+ @memo.save_attachments(params[:attachments] || (params[:memo] && params[:memo][:uploads]))
+
+ respond_to do |format|
+ if @memo.save
+ format.html { redirect_to (forum_memo_path(@forum, (@memo.parent_id.nil? ? @memo : @memo.parent_id))), notice: "#{l :label_memo_create_succ}" }
+ format.json { render json: @memo, status: :created, location: @memo }
+ else
+ sort_init 'updated_at', 'desc'
+ sort_update 'created_at' => "#{Memo.table_name}.created_at",
+ 'replies' => "#{Memo.table_name}.replies_count",
+ 'updated_at' => "COALESCE (last_replies_memos.created_at, #{Memo.table_name}.created_at)"
+
+ @topic_count = @forum.topics.count
+ @topic_pages = Paginator.new @topic_count, per_page_option, params['page']
+ @memos = @forum.topics.
+ reorder("#{Memo.table_name}.sticky DESC").
+ includes(:last_reply).
+ limit(@topic_pages.per_page).
+ offset(@topic_pages.offset).
+ order(sort_clause).
+ preload(:author, {:last_reply => :author}).
+ all
+
+ flash.now[:error] = "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}"
+ # back_error_page = @memo.parent_id.nil? ? forum_path(@forum) : forum_memo_path(@forum, @memo.parent_id)
+ format.html { render action: :show, layout: 'base_forums' }#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" }
+ format.json { render json: @memo.errors, status: :unprocessable_entity }
+ end
+ end
+ end
def index
@offset, @limit = api_offset_and_limit({:limit => 10})
diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb
index a21086da3..f6ad48801 100644
--- a/app/controllers/memos_controller.rb
+++ b/app/controllers/memos_controller.rb
@@ -47,7 +47,30 @@ class MemosController < ApplicationController
else
flash[:error] = "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}"
# back_error_page = @memo.parent_id.nil? ? forum_path(@forum) : forum_memo_path(@forum, @memo.parent_id)
- format.html { redirect_to back_memo_or_forum_url}#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" }
+ pre_count = REPLIES_PER_PAGE
+
+ @memo_new = @memo.dup
+ @memo = @memo.root # 取出楼主,防止输入帖子id让回复作为主贴显示
+ @memo.update_column(:viewed_count, (@memo.viewed_count.to_i + 1))
+
+ page = params[:page]
+ if params[:r] && page.nil?
+ offset = @memo.children.where("#{Memo.table_name}.id < ?", params[:r].to_i).count
+ page = 1 + offset / pre_count
+ else
+
+ end
+ @reply_count = @memo.children.count
+ @reply_pages = Paginator.new @reply_count, pre_count, page
+ @replies = @memo.children.
+ includes(:author, :attachments).
+ reorder("#{Memo.table_name}.created_at ASC").
+ limit(@reply_pages.per_page).
+ offset(@reply_pages.offset).
+ all
+
+ format.html { render action: :show }#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" }
+ # format.html { redirect_to back_memo_or_forum_url}#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" }
format.json { render json: @memo.errors, status: :unprocessable_entity }
end
end
@@ -76,7 +99,7 @@ class MemosController < ApplicationController
offset(@reply_pages.offset).
all
- @mome_new = Memo.new
+ @memo_new = Memo.new
# @memo = Memo.find_by_id(params[:id])
diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb
index d05a1f59c..c469c72ee 100644
--- a/app/controllers/my_controller.rb
+++ b/app/controllers/my_controller.rb
@@ -87,7 +87,7 @@ class MyController < ApplicationController
se = UserExtensions.new
se.user_id = @user.id
if params[:occupation]
- se.occupation = params[:occupation]
+ se.school_id = params[:occupation]
end
se.gender = params[:gender]
@@ -109,7 +109,7 @@ class MyController < ApplicationController
else
se = @user.user_extensions
if params[:occupation]
- se.occupation = params[:occupation]
+ se.school_id = params[:occupation]
end
se.gender = params[:gender]
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 d3481e2ae..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
@@ -218,8 +220,10 @@ class ProjectsController < ApplicationController
def search
#modified by nie
- @projects = Project.visible
- @projects = @projects.visible.where('project_type = ?', params[:project_type]).like(params[:name]) if params[:name].present?
+ project_type = params[:project_type]
+ projects_all = (project_type.eql? Project::ProjectType_project) ? Project.project_entities : Project.course_entities
+ @projects = projects_all.visible
+ @projects = @projects.visible.like(params[:name]) if params[:name].present?
@offset, @limit = api_offset_and_limit({:limit => 10})
@project_count = @projects.visible.count
@project_pages = Paginator.new @project_count, @limit, params['page']
@@ -346,7 +350,7 @@ class ProjectsController < ApplicationController
end
def new
- @project_type = params[:project_type]
+ @project_type = params[:project_type] ||= params[:course]
@issue_custom_fields = IssueCustomField.sorted.all
@trackers = Tracker.sorted.all
@@ -360,9 +364,9 @@ class ProjectsController < ApplicationController
@course_tag = params[:course]
@course = Course.new
@course.safe_attributes = params[:course]
- else
- render_404
- return -1
+ else # default Project
+ @project = Project.new
+ @project.safe_attributes = params[:project]
end
render :layout => 'base'
end
@@ -388,7 +392,7 @@ class ProjectsController < ApplicationController
# added by bai
@course.term = params[:term]
@course.time = params[:time]
- @course.school_id = params[:school]
+ @course.school_id = params[:occupation]
@course.setup_time = params[:setup_time]
@course.endup_time = params[:endup_time]
@course.class_period = params[:class_period]
@@ -567,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
@@ -849,8 +854,7 @@ class ProjectsController < ApplicationController
def select_project_layout
project = Project.find_by_id(params[:id])
- project ||= @project
- project ||= @course
+ project ||= @project ||= @course ||= params[:course] ||= params[:project_type]
(project.try(:project_type) == Project::ProjectType_project) ? 'base_projects' : 'base_courses'
end
diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb
index 05a65771b..749491b69 100644
--- a/app/controllers/school_controller.rb
+++ b/app/controllers/school_controller.rb
@@ -1,2 +1,15 @@
class SchoolController < ApplicationController
+ def get_options
+ @school = School.where("province = ?", params[:province])
+ p = params[:province]
+ ##@school = School.all
+ options = ""
+
+ @school.each do |s|
+ options << "#{s.name} "
+ end
+
+ render :text => options
+
+ end
end
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 0182f2121..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,11 +179,13 @@ private
@projects_results = nil
@issues_results = nil
@bids_results = nil
+ @contests_results = nil
@forums_results = nil
attachments_results = nil
@obj_pages = nil
@obj = nil
-
+ @result = nil
+
# 这里为了提高系统的响应速度 把搜索结果放到case中去了
case obj_flag
when '1' then
@@ -197,11 +205,27 @@ private
@obj_pages,@forums_results,@results_count = for_pagination(get_forums_by_tag(selected_tags))
when '6'
@obj = Attachment.find_by_id(obj_id)
- @obj_pages, attachments_results, @results_count = for_pagination(get_attachments_by_tag(selected_tags))
+
+ # modifed by Long Jun
+ # 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)
@@ -221,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
# 通过数字 来转换出对象的类型
@@ -242,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/test_controller.rb b/app/controllers/test_controller.rb
index 46ae016ed..cb28f4e66 100644
--- a/app/controllers/test_controller.rb
+++ b/app/controllers/test_controller.rb
@@ -1,160 +1,56 @@
class TestController < ApplicationController
-
- before_filter :find_user, :only => [:new, :create, :destroy]
-
-
-def index
- # @users = User.where('status = ?', 1)
- # for user in @users
- # if user.user_extensions.nil?
- # UserExtensions.create(:user_id => user.id)
- # end
- # end
-
- # @message = Message.all
- # @message.each do |m|
- # Activity.create(:act_id => m.id, :act_type => 'Message', :user_id => m.author_id)
- # end
- # activity = Message.all
- # activity += News.all
- # activity += Journal.all
- # activity += Issue.all
- # activity += Bid.all
- # @activity = activity.sort {|x,y| x.created_on <=> y.created_on}
- # @activity.each do |act|
- # if act.instance_of?(Bid)
- # act.acts << Activity.new(:user_id => act.author_id)
- # elsif act.instance_of?(News)
- # act.acts << Activity.new(:user_id => act.author_id)
- # elsif act.instance_of?(Message)
- # act.acts << Activity.new(:user_id => act.author_id)
- # elsif act.instance_of?(Journal)
- # act.acts << Activity.new(:user_id => act.user_id)
- # elsif act.instance_of?(Issue)
- # act.acts << Activity.new(:user_id => act.author_id)
- # elsif act.instance_of?(Changeset)
- # act.acts << Activity.new(:user_id => act.user_id)
- # end
- # end
-
-
- #@watchers_of_projects = WatchersOfProjects.new
- #@watchers_of_projects.user_id = 1
- #@watchers_of_projects.project_id = 1
- #@watchers_of_projects.save
-
- #测试user表与watch_project表之间的关联是否成功
- #@user = User.find(params[:id])
- #@watch_table = @user.watch_projects.to_a.first
-
- #@watch = WatchProject.find(1)
- #@watcher = @watch.user
-
- #测试通过watch_project表使user表可以访问project表
- #@watch_project = @user.projects
- #watch_project_path(@watch)
- #@project = Project.find(11)
- #project_path(@project)
- #@member = @project.users
- #@watched = @project.watch_projects
- #@issue = Issue.find(6)
-
-
- #user_path(@user)
- #issue_path(@issue)
-
- #@watcher2=WatchProject.where("#{WatchProject.table_name}.project_id = ?" , temp)
-
- #测试where语句
- #temp = 1
- #@watcher2=WatchProject.where(:project_id => temp).to_a
-
- #测试新建记录
- #@watch_new = WatchProject.new
- #@watch_new.user_id = 4
- #@watch_new.project_id = 1
- #@watch_new.save
- #@id = params[:id]
-
- #测试添加关注项目功能
- #WatchersOfProjects.watch(3,10)
- #Project.find(50)
- #测试统计关注该项目的用户数
- #@count = WatchersOfProjects.watcher_count(@watch_project.to_a.first)
- #测试取消关注功能
- #WatchersOfProjects.watch_cancle(10,35)
-
- #测试关注用户功能
- #测试关注功能
- #WatchersOfUser.watch_user(7,7)
- #测试取消关注功能
- #WatchersOfUser.cancel_watching_user(1,2)
- #测试查找关注的人功能
- #@user = WatchersOfUser.find_users(1)
- #测试查找被关注的人功能
- #@user = WatchersOfUser.find_watchers(10)
-
- #测试用户留言功能
- #测试留言功能
- # MessagesForUser.leave_message(User.current.id, 6, 'test')
- #测试查找留言功能
- #@message_table = MessagesForUser.find_message(3)
- #测试查找留言用户功能
- #@messager=@message_table.first.find_messager
-
-
- #测试需求
- #测试新建需求
- #bids = Bid.creat_bids(10000, '2013.7.25', 'test', 'sfsadgfag')
- #测试修改需求
- #bids.update_bids(10, '2014.7.222', 'asdf')
- #测试删除需求
- # bids = Bid.where('id = ?', 5)
- # bids.each do |bid|
- # bid.delete_bids
- # end
+ def zip
+ homeworks_attach_path = []
+ homework_id = params[:homework_id]
+ bid = Bid.find_by_id(homework_id)
+
+ bid.homeworks.each do |homeattach|
+ homeattach.attachments.each do |attach|
+ length = attach.storage_path.length
+ homeworks_attach_path << attach.diskfile.to_s.slice((length+1)..-1)
+ end
end
+ @paths = homeworks_attach_path
+ zipfile = ziping homeworks_attach_path
+ send_file zipfile, :filename => bid.name,
+ :type => detect_content_type(zipfile)
+ rescue Errno::ENOENT => e
+ logger.error "[Errno::ENOENT] ===> #{e}"
+
+ end
+
+ def courselist
+ @courses = Project.course_entities
+ end
+
+ def ziping files_path
+ ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
+ folder = "#{Rails.root}/files"
+ input_filename = files_path
+ zipfile_name = "#{Rails.root}/tmp/archiveZip/archive_#{Time.now.to_i}.zip"
- # ##########留言功能 message by fq
- # def new
- # end
-#
- # def create
-#
- # if params[:user_search].size>0
- # unless params[:user_id].nil?
- # message = params[:user_search]
- # MessagesForUser.leave_message(User.current.id, params[:user_id], message)
- # @message = MessagesForUser.find_message(@user.id)
- # end
- # end
-#
- # respond_to do |format|
- # # format.html { redirect_to_referer_or {render :text => 'Watcher added.', :layout => true}}
- # format.js
- # #format.api { render_api_ok }
- # end
- # end
-#
- # def destroy
- # MessagesForUser.delete_message(params[:object_id])
- # @message = MessagesForUser.find_message(@user.id)
- # respond_to do |format|
- # format.html { redirect_to :back }
- # format.js
- # #format.api { render_api_ok }
- # end
- # end
+ Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
+ Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
+ input_filename.each do |filename|
+ zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename)
+ end
+ zipfile.get_output_stream("ReadMe"){ |os|
+ os.write "Homeworks"
+ }
+ end
+ zipfile_name
+ end
+
+ def detect_content_type(name)
+ content_type = Redmine::MimeType.of(name)
+ content_type.to_s
+ end
- # private
-#
- # def find_user
- # if params[:user_id]
- # @user = User.find(params[:user_id])
- # end
- # rescue
- # render_404
- # end
- #######end of message
+ def filename_to_real name
+ attach = Attachment.find_by_disk_filename(name)
+ attach.filename
+ end
+
+
end
\ No newline at end of file
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..d566c9b86 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -27,6 +27,7 @@ class WelcomeController < ApplicationController
@projectHidenCount = @projectCount - @projectPublicCount
@developerCount = User.developer.count
+ @allUsercount = User.count
end
def robots
@@ -80,7 +81,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/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb
new file mode 100644
index 000000000..57078a436
--- /dev/null
+++ b/app/controllers/zipdown_controller.rb
@@ -0,0 +1,115 @@
+class ZipdownController < ApplicationController
+ SAVE_FOLDER = "#{Rails.root}/files"
+ OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip"
+
+ def assort
+ obj_class = params[:obj_class]
+ obj_id = params[:obj_id]
+ obj = obj_class.constantize.find(obj_id)
+ zipfile = nil
+ case obj.class.to_s.to_sym
+ when :Bid
+ zipfile = zip_bid obj
+ else
+ logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!"
+ end
+ send_file zipfile, :filename => obj.name, :type => detect_content_type(zipfile) if zipfile
+
+ #rescue NameError, ActiveRecord::RecordNotFound => e
+ #logger.error "[ZipDown] ===> #{e}"
+ #@error = e
+ end
+
+ private
+
+ def zip_bid(bid)
+ # Todo: User Access Controll
+
+ homeattaches = bid.homeworks
+ # 得到每一个人所有文件打包的zip文件
+ # 并将每一个人的zip打包为一个并返回路径
+ user_zip_paths = homeattaches.map do |homeattach|
+ zip_homework_by_user homeattach
+ end
+ zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER
+
+ #@paths = homeworks_attach_path
+ #zipfile = ziping homeworks_attach_path
+ #send_file zipfile, :filename => bid.name,
+ # :type => detect_content_type(zipfile)
+ #rescue Errno::ENOENT => e
+ # logger.error "[Errno::ENOENT] ===> #{e}"
+ # @error = e
+ end
+
+ def zip_homework_by_user(homeattach)
+ homeworks_attach_path = []
+ # 需要将所有homework.attachments遍历加入zip
+ # 并且返回zip路径
+ user_attaches_paths = homeattach.attachments.each do |attach|
+ #length = attach.storage_path.length
+ homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1)
+ end
+ zipping "#{Time.now.to_i}_#{homeattach.user.name.to_s}.zip", homeworks_attach_path, OUTPUT_FOLDER, true
+ end
+
+
+ def zipping(zip_name_refer, files_paths, output_path, is_attachment=false)
+ # 输入待打包的文件列表,已经打包文件定位到ouput_path
+ ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
+ input_filename = files_paths
+
+ rename_zipfile = zip_name_refer ||= "archive_#{Time.now.to_i}.zip"
+ zipfile_name = "#{output_path}/#{rename_zipfile}"
+
+ Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
+
+ Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
+ input_filename.each do |filename|
+ rename_file = Time.now.to_i.to_s+ ic.iconv( (File.basename(filename)) ).to_s
+ rename_file = ic.iconv( filename_to_real( File.basename(filename))).to_s if is_attachment
+
+ zipfile.add(rename_file, filename)
+ end
+ zipfile.get_output_stream('ReadMe') do |os|
+ os.write 'Homeworks'
+ end
+ end
+ zipfile_name
+ rescue Errno => e
+ logger.error "[zipdown#zipping] ===> #{e}"
+ @error = e
+ end
+
+ #def ziping files_path
+ # ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
+ # folder = SaveFolder
+ # input_filename = files_path
+ # zipfile_name = "#{OutputFolder}/archive_#{Time.now.to_i}.zip"
+ #
+ # Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
+ # Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
+ # input_filename.each do |filename|
+ # zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename)
+ # end
+ # zipfile.get_output_stream("ReadMe") { |os|
+ # os.write "Homeworks"
+ # }
+ # end
+ # zipfile_name
+ #rescue Errno => e
+ # logger.error "[zipdown#zipping] ===> #{e}"
+ # @error = e
+ #end
+
+ def detect_content_type(name)
+ content_type = Redmine::MimeType.of(name)
+ content_type.to_s
+ end
+
+ def filename_to_real(name)
+ attach = Attachment.find_by_disk_filename(name)
+ attach.filename
+ end
+
+end
diff --git a/app/helpers/activities_helper.rb b/app/helpers/activities_helper.rb
index a5aa247d5..c15d89e0c 100644
--- a/app/helpers/activities_helper.rb
+++ b/app/helpers/activities_helper.rb
@@ -24,10 +24,10 @@ module ActivitiesHelper
events.sort {|x, y| y.event_datetime <=> x.event_datetime}.each do |event|
if group_events = events_by_group.delete(event.event_group)
group_events.sort {|x, y| y.event_datetime <=> x.event_datetime}.each_with_index do |e, i|
- sorted_events << [e, i > 0]
+ sorted_events << [e, i > 0] unless e.event_description.nil?
end
end
end
- sorted_events
+ sorted_events
end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 0ad4404d9..1d639726f 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)
@@ -1494,13 +1567,14 @@ module ApplicationHelper
home_link = link_to l(:field_homepage), {:controller => 'welcome', :action => 'index'}
main_course_link = link_to l(:label_course_practice), {:controller => 'welcome', :action => 'index', :host => Setting.course_domain}
main_project_link = link_to l(:label_project_deposit), {:controller => 'welcome', :action => 'index', :host => Setting.project_domain}
-
+ main_contest_link = link_to l(:label_contest_innovate), {:controller => 'welcome', :action => 'index', :host => Setting.contest_domain}
+
course_all_course_link = link_to l(:label_course_all), {:controller => 'projects', :action => 'course', :project_type => 1, :host => Setting.course_domain}
course_teacher_all_link = link_to l(:label_teacher_all), {:controller => 'users', :action => 'index', :role => 'teacher', :host => Setting.course_domain}
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'}
@@ -1513,6 +1587,7 @@ module ApplicationHelper
nav_list.push(main_project_link) if @nav_dispaly_main_project_label
nav_list.push(main_course_link) if @nav_dispaly_main_course_label
+ nav_list.push(main_contest_link) if @nav_dispaly_main_contest_label
nav_list.push(courses_link) if @nav_dispaly_course_label
nav_list.push(projects_link) if @nav_dispaly_project_label
@@ -1528,5 +1603,9 @@ module ApplicationHelper
end
content_tag :ul, content_li.html_safe
end
+
+ def current_user
+ User.current
+ end
end
diff --git a/app/helpers/attachments_helper.rb b/app/helpers/attachments_helper.rb
index 495c05085..7259e9d10 100644
--- a/app/helpers/attachments_helper.rb
+++ b/app/helpers/attachments_helper.rb
@@ -76,6 +76,22 @@ module AttachmentsHelper
Attachment.tagged_with(tag_name).order('created_on desc')
end
+ # this method is used to get all attachments that from one project and tagged one tag
+ # added by Long Jun
+ def get_attachments_by_project_tag(tag_name, obj)
+ @project_id =nil
+ if obj.container_type == 'Version'
+ @project_id = Version.find(obj.container_id).project_id
+
+ elsif obj.container_type == 'Project'
+ @project_id = obj.container_id
+
+ end
+ Attachment.tagged_with(tag_name).order('created_on desc').where("(container_id = :project_id and container_type = 'Project') or
+ (container_id in (select id from versions where project_id =:project_id) and container_type = 'Version')", {:project_id => @project_id})
+ end
+
+
def render_attachments_for_new_project(project, limit=nil)
# 查询条件
params[:q] ||= ""
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..9970ee9c6 100644
--- a/app/helpers/welcome_helper.rb
+++ b/app/helpers/welcome_helper.rb
@@ -97,10 +97,21 @@ 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
+ mix_bid = []
+ mix_bid += Contest.reorder("created_on DESC").take(limit).to_a
+ mix_bid += Bid.visible.where('reward_type = ?', 2).reorder('bids.created_on desc').take(limit).to_a
+ mix_bid.sort do |older, newer|
+ newer.created_on - older.created_on
+ end
+ mix_bid.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
@@ -220,6 +231,10 @@ module WelcomeHelper
def sort_contest_by_hot
sort_bid_by_hot_rails 2
end
+#new added by linchun
+ def sort_contest_by_time
+ sort_bid_by_time 2
+ end
#取得所有活动
def find_all_activities limit=6
@@ -274,6 +289,10 @@ module WelcomeHelper
Bid.visible.where('reward_type = ?', reward_type).reorder('bids.commit desc').limit(limit)
end
+ def sort_bid_by_time reward_type, limit = 10
+ Bid.visible.where('reward_type = ?', reward_type).reorder('bids.created_on desc').limit(limit)
+ end
+
def find_all_event_type event
case event.event_type
when 'news'
diff --git a/app/helpers/zipdown_helper.rb b/app/helpers/zipdown_helper.rb
new file mode 100644
index 000000000..d0b9a4880
--- /dev/null
+++ b/app/helpers/zipdown_helper.rb
@@ -0,0 +1,2 @@
+module ZipdownHelper
+end
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/memo.rb b/app/models/memo.rb
index 2e4ddb810..a0581d945 100644
--- a/app/models/memo.rb
+++ b/app/models/memo.rb
@@ -4,9 +4,10 @@ class Memo < ActiveRecord::Base
belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
validates_presence_of :author_id, :forum_id, :subject
- #validates :content, presence: true
+ # 若是主题帖,则内容可以是空
+ validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? }
validates_length_of :subject, maximum: 50
- #validates_length_of :content, maximum: 3072
+ validates_length_of :content, maximum: 3072
validate :cannot_reply_to_locked_topic, :on => :create
acts_as_tree :counter_cache => :replies_count, :order => "#{Memo.table_name}.created_at ASC"
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..71caf059c
--- /dev/null
+++ b/app/models/softapplication.rb
@@ -0,0 +1,24 @@
+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
+
+ 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 5d8413009..b1991b061 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -78,11 +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/models/user_extensions.rb b/app/models/user_extensions.rb
index ea1548be9..7b35b16b4 100644
--- a/app/models/user_extensions.rb
+++ b/app/models/user_extensions.rb
@@ -8,6 +8,7 @@
=end
class UserExtensions < ActiveRecord::Base
belongs_to :user
+ belongs_to :school, :class_name => 'School', :foreign_key => :school_id
attr_accessible :user_id,:birthday,:brief_introduction,:gender,:location,:occupation,:work_experience,:zip_code,:identity, :technical_title,:student_id
TEACHER = 0
STUDENT = 1
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/attachments/_form.html.erb b/app/views/attachments/_form.html.erb
index 546792d50..f34a0e4e7 100644
--- a/app/views/attachments/_form.html.erb
+++ b/app/views/attachments/_form.html.erb
@@ -12,11 +12,14 @@
<% end %>
+<%= button_tag "浏览", :type=>"button", :onclick=>"_file.click()" %>
+
<%= file_field_tag 'attachments[dummy][file]',
- :id => nil,
+ :id => '_file',
:class => 'file_selector',
:multiple => true,
:onchange => 'addInputFiles(this);',
+ :style => 'display:none',
:data => {
:max_file_size => Setting.attachment_max_size.to_i.kilobytes,
:max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)),
@@ -24,6 +27,7 @@
:upload_path => uploads_path(:format => 'js'),
:description_placeholder => l(:label_optional_description)
} %>
+<%= l(:label_no_file_uploaded)%>
(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
diff --git a/app/views/attachments/destroy.js.erb b/app/views/attachments/destroy.js.erb
index 3cfb5845f..04cd4e02d 100644
--- a/app/views/attachments/destroy.js.erb
+++ b/app/views/attachments/destroy.js.erb
@@ -1 +1,8 @@
$('#attachments_<%= j params[:attachment_id] %>').remove();
+var count=$('#attachments_fields>span').length;
+if(count<=0){
+ $("#upload_file_count").text("未上传文件");
+ $(".remove_all").remove();
+}else{
+ $("#upload_file_count").html("已上传"+""+count+" "+"个文件");
+}
\ No newline at end of file
diff --git a/app/views/attachments/upload.js.erb b/app/views/attachments/upload.js.erb
index 4761f4635..82b79bb63 100644
--- a/app/views/attachments/upload.js.erb
+++ b/app/views/attachments/upload.js.erb
@@ -8,7 +8,7 @@ fileSpan.find('a.remove-upload')
.attr({
"data-remote": true,
"data-method": 'delete',
- href: '<%= j attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>'
+ "href": '<%= j attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>'
})
.off('click');
<% end %>
diff --git a/app/views/bids/_bid_homework_show.html.erb b/app/views/bids/_bid_homework_show.html.erb
index b44d72b5f..7c8e1468c 100644
--- a/app/views/bids/_bid_homework_show.html.erb
+++ b/app/views/bids/_bid_homework_show.html.erb
@@ -60,7 +60,10 @@
<% end %>
- <%= bid.description %>
+
+ <%#= bid.description %>
+ <%= textilizable bid, :description %>
+
<%= l(:label_create_time) %> : <%=format_time bid.created_on %> <%= l(:field_deadline) %> : <%=bid.deadline %>
diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb
index bae83f14a..8f87a6b37 100644
--- a/app/views/bids/_homework_list.html.erb
+++ b/app/views/bids/_homework_list.html.erb
@@ -14,6 +14,10 @@
<% end %>
<% display_id = im_watching_student_id? @bid%>
+<%= link_to "作业打包下载", zipdown_assort_path(obj_class: @bid.class, obj_id: @bid), remote: false, class: "button_submit button_submit_font_white", style: "margin: 5px 10px;display: inline-block;" if(
+ User.current.admin? ||
+ !(User.current.roles_for_project(@bid.courses.first).map(&:id) & ([7,9])).empty? ) ||
+ (Rails.env.development?) %>
<% @homework_list.each do |homework|%>
<% if homework.attachments.any?%>
@@ -22,7 +26,12 @@
- <%= link_to homework.user, user_path(homework.user)%> 提交了作业
+ <%= link_to homework.user, user_path(homework.user)%> 已提交
+
+ <% if Time.parse(@bid.deadline.to_s) < Time.parse(homework.attachments[0].created_on.to_s) %>
+ 迟交
+ <% end %>
+
diff --git a/app/views/bids/_list_projects.html.erb b/app/views/bids/_list_projects.html.erb
index 304bab413..41c5ab9d1 100644
--- a/app/views/bids/_list_projects.html.erb
+++ b/app/views/bids/_list_projects.html.erb
@@ -147,6 +147,13 @@
<%= format_time b_project.created_at%>
+
+
+ <% if Time.parse(@bid.deadline.to_s) < Time.parse(b_project.created_at.to_s) %>
+ 迟交
+ <% end %>
+
+
diff --git a/app/views/bids/new_submit_homework.html.erb b/app/views/bids/new_submit_homework.html.erb
index dd06af643..eb89740a8 100644
--- a/app/views/bids/new_submit_homework.html.erb
+++ b/app/views/bids/new_submit_homework.html.erb
@@ -8,8 +8,9 @@
<%= render :partial => 'attachments/form' %>
+ <%= submit_tag l(:button_create) %>
+ <%= link_to (t :button_back), project_for_bid_homework_path %>
- <%= submit_tag l(:button_create) %>
- <%= link_to (t :button_back), project_for_bid_homework_path %>
+
<% end %>
\ No newline at end of file
diff --git a/app/views/bids/show.html.erb b/app/views/bids/show.html.erb
index 46b05c292..aaa45c37a 100644
--- a/app/views/bids/show.html.erb
+++ b/app/views/bids/show.html.erb
@@ -14,7 +14,7 @@
<% else %>
<% end %>
- <%= @bid.description %>
+ <%= textilizable(@bid, :description) %>
<% if @bid.attachments.any?%>
<% options = {:author => true} %>
<%= render :partial => 'attachments/links', :locals => {:attachments => @bid.attachments, :options => options} %>
diff --git a/app/views/bids/show_project.html.erb b/app/views/bids/show_project.html.erb
index 4b4d7040b..d22ddded6 100644
--- a/app/views/bids/show_project.html.erb
+++ b/app/views/bids/show_project.html.erb
@@ -1,6 +1,6 @@
-<% if @bid.homework_type == 1%>
+<% if @bid.homework_type == Bid::HomeworkFile %>
<%= render :partial => 'homework' %>
<% else %>
diff --git a/app/views/boards/show.html.erb b/app/views/boards/show.html.erb
index f518120ef..849519d0d 100644
--- a/app/views/boards/show.html.erb
+++ b/app/views/boards/show.html.erb
@@ -91,13 +91,13 @@
-->
<% end %>
-
<% else %>
<%= l(:label_no_data) %>
<% end %>
+
<% other_formats_links do |f| %>
<%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb
new file mode 100644
index 000000000..fb3ddd115
--- /dev/null
+++ b/app/views/contests/_contest_list.html.erb
@@ -0,0 +1,50 @@
+
+<% 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', :target => "_blank") %>
+
+
+
+
+
+
+ <%= 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), :target => "_blank") %> )
+ <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest), :target => "_blank") %> )
+
+
+
+
+
+ <%= l :label_create_time %>: <%= format_time contest.created_on %>
+
+
+
+
+
+
+
+
+
+<% 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..670ba27cf
--- /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', :target => "_blank") %>
+ <% 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..14c907d82
--- /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/courses/_set_course_time.html.erb b/app/views/courses/_set_course_time.html.erb
index ab9fa6f28..d13d256c1 100644
--- a/app/views/courses/_set_course_time.html.erb
+++ b/app/views/courses/_set_course_time.html.erb
@@ -1,8 +1,9 @@
<%
- id = "finish_course_tag"
+ id = "finish_course_#{project.id}"
+ display = (project.course_extra.teacher.id == User.current.id )
%>
-<% if course_endTime_timeout?(project) #如果课程已结束%>
+<% if display && course_endTime_timeout?(project) #如果课程已结束%>
<%= link_to '重启课程', restartcourse_project_path(project), :remote => true, :method => :post, :id => id, :confirm => ('确定要重启课程?') %>
<% else %>
<%= link_to '关闭课程', finishcourse_project_path(project), :remote => true, :method => :post, :id => id, :confirm => ('确定要关闭课程?') %>
diff --git a/app/views/forums/show.html.erb b/app/views/forums/show.html.erb
index f3f0524ae..677416a6d 100644
--- a/app/views/forums/show.html.erb
+++ b/app/views/forums/show.html.erb
@@ -2,7 +2,7 @@
<%=l(:label_memo_new)%>
<% if User.current.logged? %>
- <%= labelled_form_for(@memo, :url => forum_memos_path(@forum), :html => {:multipart => true} ) do |f| %>
+ <%= labelled_form_for(@memo, :url => create_memo_forum_path(@forum), :html => {:multipart => true} ) do |f| %>
<% if @memo.errors.any? %>
<%= pluralize(@memo.errors.count, "error") %> prohibited this memo from being saved:
diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb
index 422f2dbd7..bba5b2166 100644
--- a/app/views/layouts/_base_footer.html.erb
+++ b/app/views/layouts/_base_footer.html.erb
@@ -1,20 +1,28 @@
-
@@ -79,8 +79,8 @@
<%= render :partial => 'courses/set_course_time', :locals => {:project => @project}%>
<% else %>
- <%= join_in_course(@project, User.current) %>
- <% end %>
+ <%= join_in_course(@project, User.current) %>
+ <% end %>
<% unless User.current.member_of?(@project) %>
@@ -88,7 +88,7 @@
<%= watcher_link(@project, User.current) %>
<% end %>
<% end %>
-
+
@@ -233,21 +233,22 @@
<% if User.current.logged? && (User.current.admin? || (!Member.where('user_id = ? and project_id = ?', User.current.id, @project.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, @project.id).first.roles&Role.where('id = ? or id = ?', 7, 9)).size >0))%>
-
<% end %>
+
<%= render_flash_messages %>
<%= yield %>
<%= call_hook :view_layouts_base_content %>
-
+
+
+
<%= render :partial => 'layouts/base_footer'%>
-
<%= l(:label_loading) %>
-
+
diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb
new file mode 100644
index 000000000..9813905ca
--- /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' %>
+
+ <%= 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/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb
index 232103273..5c6f24524 100644
--- a/app/views/layouts/base_users.html.erb
+++ b/app/views/layouts/base_users.html.erb
@@ -1,275 +1,279 @@
-<% @nav_dispaly_user_label = show_item_on_navbar(params) %>
-
-
-
-
- <%= h html_title %>
-
-
- <%= csrf_meta_tag %>
- <%= favicon %>
- <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %>
- <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
- <%= javascript_heads %>
-
- <%= heads_for_theme %>
- <%= call_hook :view_layouts_base_html_head %>
-
- <%= yield :header_tags -%>
-
-
-
-
-
- <%= render :partial => 'layouts/base_header'%>
-
-
-
-
-
- <%= l(:label_user_home) %>
- <%= l(:label_user_location) %> :
-
-
- <%= form_tag(:controller => 'users', :action => 'search', :method => :get) do %>
- <%= text_field_tag 'name', params[:name], :size => 20 %>
- <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
- <% end %>
-
-
-
-
- <%=link_to request.host()+"/users" ,:controller => 'users', :action => 'index' %>
- <%=link_to "主页", home_path %> > <%=link_to "软件创客", :controller => 'users', :action => 'index' %> > <%=link_to @user.name, user_path %>
-
-
-
-
-
-
-
-
-
- <% if @user.user_extensions.identity == 2 %>
- <%= render_menu :user_enterprise_menu %>
- <% else %>
- <%= render_menu :user_menu %>
- <% end %>
-
-
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
- <%= render_flash_messages %>
-
-
-
- <%= render :partial => 'layouts/base_footer'%>
-
-
- <%= l(:label_loading) %>
-
-
-
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
-
+<% @nav_dispaly_user_label = show_item_on_navbar(params) %>
+
+
+
+
+ <%= h html_title %>
+
+
+ <%= csrf_meta_tag %>
+ <%= favicon %>
+ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %>
+ <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
+ <%= javascript_heads %>
+
+ <%= heads_for_theme %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
+
+
+
+
+
+ <%= render :partial => 'layouts/base_header'%>
+
+
+
+
+
+ <%= l(:label_user_home) %>
+ <%= l(:label_user_location) %> :
+
+
+ <%= form_tag(:controller => 'users', :action => 'search', :method => :get) do %>
+ <%= text_field_tag 'name', params[:name], :size => 20 %>
+ <%= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
+ <% end %>
+
+
+
+
+ <%=link_to request.host()+"/users" ,:controller => 'users', :action => 'index' %>
+ <%=link_to "主页", home_path %> > <%=link_to "软件创客", :controller => 'users', :action => 'index' %> > <%=link_to @user.name, user_path %>
+
+
+
+
+
+
+
+
+
+ <% if @user.user_extensions.identity == 2 %>
+ <%= render_menu :user_enterprise_menu %>
+ <% else %>
+ <%= render_menu :user_menu %>
+ <% end %>
+
+
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+ <%= render_flash_messages %>
+
+
+
+ <%= render :partial => 'layouts/base_footer'%>
+
+
+ <%= l(:label_loading) %>
+
+
+
+
+
+ <%= call_hook :view_layouts_base_body_bottom %>
+
+
diff --git a/app/views/memos/_reply_box.html.erb b/app/views/memos/_reply_box.html.erb
index a8991b572..e0c6acf13 100644
--- a/app/views/memos/_reply_box.html.erb
+++ b/app/views/memos/_reply_box.html.erb
@@ -1,4 +1,4 @@
-<%= form_for(@mome_new, url: forum_memos_path, :html => {:multipart => true}) do |f| %>
+<%= form_for(@memo_new, url: forum_memos_path, :html => {:multipart => true}) do |f| %>
<%= f.hidden_field :subject, :required => true, value: @memo.subject %>
<%= f.hidden_field :forum_id, :required => true, value: @memo.forum_id %>
<%= f.hidden_field :parent_id, :required => true, value: @memo.id %>
diff --git a/app/views/memos/show.html.erb b/app/views/memos/show.html.erb
index d085c01d2..6ea5b17bc 100644
--- a/app/views/memos/show.html.erb
+++ b/app/views/memos/show.html.erb
@@ -1,7 +1,7 @@
-
<%= link_to image_tag(url_to_avatar(@memo.author), :class => "avatar"), user_path(@memo.author) %>
-
<%=link_to @memo.author.name, user_path(@memo.author) %>
+
<%= link_to image_tag(url_to_avatar(@memo.author), :class => "avatar"), user_path(@memo.author) %>
+
<%=link_to @memo.author.name, user_path(@memo.author) %>
diff --git a/app/views/messages/show.html.erb b/app/views/messages/show.html.erb
index 391e6b956..6f7e5d5ef 100644
--- a/app/views/messages/show.html.erb
+++ b/app/views/messages/show.html.erb
@@ -104,7 +104,7 @@
<%= toggle_link l(:button_reply), "reply", :focus => 'message_content' %>
- <% if !@topic.locked? && authorize_for('messages', 'reply') %>
+
@@ -172,7 +172,7 @@
-
+<% if !@topic.locked? && authorize_for('messages', 'reply') %>
<%= form_for @reply, :as => :reply, :url => {:action => 'reply', :id => @topic}, :html => {:multipart => true, :id => 'message-form'} do |f| %>
<%= render :partial => 'form', :locals => {:f => f, :replying => true} %>
diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb
index cca7b8546..e46b25fc4 100644
--- a/app/views/my/account.html.erb
+++ b/app/views/my/account.html.erb
@@ -1,3 +1,20 @@
+
+
+
<%= link_to(l(:button_change_password), {:action => 'password'}, :class => 'icon icon-passwd') if @user.change_password_allowed? %>
<%= call_hook(:view_my_account_contextual, :user => @user)%>
@@ -61,13 +78,23 @@
<% end %>
- <% unless @user.user_extensions.nil?%>
-
<%= l(:field_occupation)%> <%= text_field_tag "occupation", @user.user_extensions.occupation, :class => 'occupation'%>
+
+
+
+
+ <%= l(:field_occupation) %> * <%= select_tag "province", options_from_collection_for_select(School.find_by_sql("select distinct province from schools"), :province, :province), :onchange => "get_options(this.value)" %>
+
+ <%= select_tag "occupation" %>
+
+
+
diff --git a/app/views/projects/_course.html.erb b/app/views/projects/_course.html.erb
index 2ea16a3ce..f55a80db3 100644
--- a/app/views/projects/_course.html.erb
+++ b/app/views/projects/_course.html.erb
@@ -47,6 +47,7 @@
+ <% if @project.project_type==Project::ProjectType_course %>
<% if(course_endTime_timeout? @project) %>
课程学期已结束
@@ -54,6 +55,7 @@
<% else %>
<%= join_in_course_for_list(@project, User.current,['regular'])%>
<% end -%>
+ <% end %>
diff --git a/app/views/projects/_course_form.html.erb b/app/views/projects/_course_form.html.erb
index ff45f2375..944157a9b 100644
--- a/app/views/projects/_course_form.html.erb
+++ b/app/views/projects/_course_form.html.erb
@@ -1,4 +1,19 @@
-
+
+
<% object = [] %>
@@ -269,10 +284,12 @@
+
+
+ <%=l(:label_new_course_school)%> *
+ <%= select_tag "province", options_from_collection_for_select(School.find_by_sql("select distinct province from schools"), :province, :province), :onclick => "get_options(this.value)" %>
-
- <%= options_from_collection_for_select(School.find_by_sql("select distinct province from schools"), :province, :province) %>
- <%= select_tag 'school', options_from_collection_for_select(School.all, :id, :name)%>
+ <%= select_tag "occupation" %>
diff --git a/app/views/projects/finishcourse.js.erb b/app/views/projects/finishcourse.js.erb
index 04f6617db..35ecac370 100644
--- a/app/views/projects/finishcourse.js.erb
+++ b/app/views/projects/finishcourse.js.erb
@@ -2,7 +2,7 @@
<% if Rails.env.development? %>
console.debug('课程修改成功:结束时间改为<%=Course.find_by_extra(@project.identifier).try(:endup_time)%>');
<% end %>
- $('#finish_course_tag').replaceWith("<%= j(render partial: 'courses/set_course_time', :locals => {:project => @project} )%>")
+ $('#finish_course_<%=@project.id%>').replaceWith("<%= j(render partial: 'courses/set_course_time', :locals => {:project => @project} )%>")
<% else %>
alert('设置失败,请在论坛提交问题,等待管理员处理。');
<% end %>
diff --git a/app/views/projects/homework.html.erb b/app/views/projects/homework.html.erb
index b612bd94f..0f3d22130 100644
--- a/app/views/projects/homework.html.erb
+++ b/app/views/projects/homework.html.erb
@@ -51,7 +51,7 @@ function showSubH(/* ... */){
}
}
function deal_error (argument) {
- $('#OpenWindow-content').html('
Network Error: http_status:' + argument.status + ' statusText:' + argument.statusText + ' <\/span>\n');
+ $('#OpenWindow-content').html('Network Error http_status:' + argument.status + ' statusText:' + argument.statusText + ' <\/span>\n');
}
$.post(post_url,{}, deal_post).error(deal_error);
}
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/projects/show.html.erb b/app/views/projects/show.html.erb
index c49b08b5d..eb66efc73 100644
--- a/app/views/projects/show.html.erb
+++ b/app/views/projects/show.html.erb
@@ -40,14 +40,37 @@
+
<% end %>
+
+
+ <% if format_date(day) == format_date(@date_to - @days) %>
+
+
+
+ <%= image_tag(url_to_avatar(@user), :class => "avatar") %>
+
+
+
+ <%= link_to (h @user.try(:name)), user_path(@user) if @user %> <%= l(:label_user_create_project) %> <%= link_to @project.name %> !
+
+
+ <%= l :label_update_time %>: <%= format_time(@project.created_on) %>
+
+
+
+
+ <% end %>
<% end -%>
+
+
+
<% else %>
@@ -66,3 +89,5 @@
<% end %>
+
+
diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb
index 565a31383..493280647 100644
--- a/app/views/repositories/show.html.erb
+++ b/app/views/repositories/show.html.erb
@@ -22,6 +22,7 @@
:class => 'repository' + (repo == @repository ? ' selected' : '')
}.join(' | ').html_safe %>)
<% else %>
+ 项目代码请设置好正确的编码方式(utf-8),否则中文会出现乱码
建立版本库文件夹,打开命令行执行如下:
git init
@@ -30,11 +31,22 @@
git remote add origin <%= @repos_url%>
git push -u origin master:master
-已经有本地库,打开命令行执行如下:
+已经有本地库,还没有配置远程地址,打开命令行执行如下:
git remote add origin <%= @repos_url%>
+
git add .
+
git commit -m "first commit"
git push -u origin master:matser
+
+从网上获取别人的开源版本库,转交到trustie网站上,打开命令行执行如下:
+
+
git remote add trustie <%= @repos_url%>
+
git add .
+
git commit -m "first commit"
+
git push -u trustie master:matser
+
<%= link_to "李海提供", user_path(646)%>
+
<% end %>
<% if !@entries.nil? && authorize_for('repositories', 'browse') %>
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..d5ff2c9c2
--- /dev/null
+++ b/app/views/softapplications/new.html.erb
@@ -0,0 +1,76 @@
+<%= 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..047ecf8dc
--- /dev/null
+++ b/app/views/softapplications/show.html.erb
@@ -0,0 +1,85 @@
+
+
+
+<%= 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 %>
+
+
+
+
+
+
+
+
+
+
+
应用简介:
+
<%= @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(@softapplication.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/test/courselist.html.erb b/app/views/test/courselist.html.erb
new file mode 100644
index 000000000..959d6a4be
--- /dev/null
+++ b/app/views/test/courselist.html.erb
@@ -0,0 +1,42 @@
+
+<% @courses.each do |course| %>
+
+ <%= course.name %>
+
+ <% course.homeworks.each do |homework| %>
+ <% homeworks_attach_path = [] %>
+
+ <%= link_to homework.name, respond_path(homework) %>(<%=homework.homeworks.count %>)<%#Bid%>
+
+ <%= link_to "package", zipdown_assort_path(obj_class: homework.class, obj_id: homework.id) %>
+ <% homework.homeworks.each do |homeattach|%><%#homework.class == Bid %>
+ <% homeattach.attachments.each do |attach|%>
+ <%= link_to_attachment attach, author: true, :download => true %> (<%=attach.author%>)
+
+ <% homeworks_attach_path << attach.storage_path %>
+ <% end %>
+ <% end %>
+
+ <%# 所有作业的文件列表%>
+
+
+ <% end %>
+
+
+<% end %>
diff --git a/app/views/test/zip.html.erb b/app/views/test/zip.html.erb
new file mode 100644
index 000000000..8992b9bb2
--- /dev/null
+++ b/app/views/test/zip.html.erb
@@ -0,0 +1 @@
+<%= debug @paths.to_yaml %>
\ No newline at end of file
diff --git a/app/views/users/_activity_score_index.html.erb b/app/views/users/_activity_score_index.html.erb
index fd1947812..fa9aad180 100644
--- a/app/views/users/_activity_score_index.html.erb
+++ b/app/views/users/_activity_score_index.html.erb
@@ -1,10 +1,10 @@
-<% journals_for_messages_count = @user.journals_for_messages.count %>
+<% journals_for_messages_count = @user.journals_messages.count %>
<% journals_for_messages_score = journals_for_messages_count * 0.05 %>
<% activities_count = @user.activities.count %>
<% activities_score = activities_count * 0.2 %>
<% finall_activity_score = journals_for_messages_score + activities_score %>
-<%= l(:label_message_number) %> * 0.05 = <%= @user.journals_for_messages.count %> * 0.05 = <%= format("%.2f" , journals_for_messages_score).to_f %>
+<%= l(:label_message_number) %> * 0.05 = <%= @user.journals_messages.count %> * 0.05 = <%= format("%.2f" , journals_for_messages_score).to_f %>
<%= l(:label_activity_number) %> * 0.2 = <%= @user.activities.count %> * 0.2 = <%= format("%.2f" , activities_score).to_f %>
<%= l(:label_user_score_of_activity) %> = <%= format("%.2f" , journals_for_messages_score).to_f %> + <%= format("%.2f" , activities_score).to_f %>
= <%= format("%.2f" , finall_activity_score).to_f %>
diff --git a/app/views/users/_course_form.html.erb b/app/views/users/_course_form.html.erb
index 810787850..a2ef0dd83 100644
--- a/app/views/users/_course_form.html.erb
+++ b/app/views/users/_course_form.html.erb
@@ -8,9 +8,11 @@
- <%= link_to_project(membership.project) %>
+
+ <%= link_to_project(membership.project) %>
+ <%=render :partial => 'courses/set_course_time', :locals => {:project => membership.project} %>
<% if User.current == @user %>
<% (membership.roles).each do |role| %>
<% unless (role == Role.find(9) || role == Role.find(3)) %>
diff --git a/app/views/users/_score_index.html.erb b/app/views/users/_score_index.html.erb
index 8c2f98541..814e9d9ec 100644
--- a/app/views/users/_score_index.html.erb
+++ b/app/views/users/_score_index.html.erb
@@ -9,7 +9,7 @@
<% user_changesets_score = user_changesets_count * 0.3 %>
<% finall_user_project_score = journals_score + user_changesets_score %>
-<% journals_for_messages_count = @user.journals_for_messages.count %>
+<% journals_for_messages_count = @user.journals_messages.count %>
<% activities_count = @user.activities.count %>
<% journals_for_messages_score = journals_for_messages_count * 0.05 %>
<% activities_score = activities_count * 0.2 %>
diff --git a/app/views/users/_show_score.html.erb b/app/views/users/_show_score.html.erb
index 7001f7a94..0297a4e02 100644
--- a/app/views/users/_show_score.html.erb
+++ b/app/views/users/_show_score.html.erb
@@ -11,7 +11,7 @@
<% user_changesets_score = user_changesets_count * 0.3 %>
<% finall_user_project_score = journals_score + user_changesets_score %>
-<% journals_for_messages_count = @user.journals_for_messages.count %>
+<% journals_for_messages_count = @user.journals_messages.count %>
<% activities_count = @user.activities.count %>
<% journals_for_messages_score = journals_for_messages_count * 0.05 %>
<% activities_score = activities_count * 0.2 %>
diff --git a/app/views/users/_user_show.html.erb b/app/views/users/_user_show.html.erb
index 71157d070..905265c8b 100644
--- a/app/views/users/_user_show.html.erb
+++ b/app/views/users/_user_show.html.erb
@@ -13,7 +13,7 @@
<% user_changesets_score = user_changesets_count * 0.3 %>
<% finall_user_project_score = journals_score + user_changesets_score %>
- <% journals_for_messages_count = user.journals_for_messages.count %>
+ <% journals_for_messages_count = user.journals_messages.count %>
<% activities_count = user.activities.count %>
<% journals_for_messages_score = journals_for_messages_count * 0.05 %>
<% activities_score = activities_count * 0.2 %>
diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb
index 6a0a8413f..8c0addb8d 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[6]) %>
+
+
+
+ <%= image_tag('/images/039.gif')%>
+
+
+
+ <%= link_to(contest.name, contest.event_url, :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %>
+
+
+
+ ><%=contest.description.truncate(50, omission: '...')%>
+
+
+
+
+ 发布时间:<%=format_time contest.created_on %>
+
+
+
+ <% 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/welcome/index.html.erb b/app/views/welcome/index.html.erb
index 6c4cd3e6b..c1b5bba9f 100644
--- a/app/views/welcome/index.html.erb
+++ b/app/views/welcome/index.html.erb
@@ -245,7 +245,7 @@
-
+
当前网站状态
活跃项目:<%=@projectCount%>个
diff --git a/app/views/welcome/robots.html.erb b/app/views/welcome/robots.html.erb
index a55f4da1a..052c639e5 100644
--- a/app/views/welcome/robots.html.erb
+++ b/app/views/welcome/robots.html.erb
@@ -2,7 +2,10 @@
# by trustie team
#
User-agent: *
+Disallow: /projects/*
+Disallow: /users/*
+Disallow: /course/*
+Disallow: /contests/*
<% @projects.each do |p| -%>
Disallow: /projects/<%= p.to_param %>/repository
<% end -%>
-Disallow: /admin/
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/app/views/zipdown/assort.html.erb b/app/views/zipdown/assort.html.erb
new file mode 100644
index 000000000..c9056b4fa
--- /dev/null
+++ b/app/views/zipdown/assort.html.erb
@@ -0,0 +1,2 @@
+Download Status:
+<%= @error.class %>
\ No newline at end of file
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 a006ae53c..5cc7b7d8d 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -741,6 +741,7 @@ zh:
label_latest_revision_plural: 最近的修订版本
label_view_revisions: 查看修订
label_view_all_revisions: 查看所有修订
+ label_no_file_uploaded: 未上传文件
label_max_size: 最大文件大小
label_sort_highest: 置顶
label_sort_higher: 上移
@@ -1549,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: 作业
@@ -1746,6 +1749,7 @@ zh:
label_exit_course: 退出课程
label_new_join: 加入
label_new_course_password: 课程密码
+ label_new_course_school: 开课学校
label_new_course_description: 课程描述
label_new_join_order: 请输入课程密码
label_task_submit_form_accessory: 作业最终以附件形式提交
@@ -1811,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 ec3440cec..17e09f5a8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,561 +1,611 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write tobthe Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-RedmineApp::Application.routes.draw do
- resources :stores do
- collection do
- match 'search', via: [:get, :post]
- end
- end
-
- resources :forums do
- collection do
- match 'search_forum', :via => [:get, :post]
- end
- member do
- match 'search_memo', :via => [:get, :post]
- end
- resources :memos do
- collection do
- get "quote"
- end
- end
- end
-
-
- resources :shares
-
- #added by william
- get "tags/index"
-
- get "tags/show"
-
- get "praise_tread/praise_plus"
-
- get "praise_tread/tread_plus"
- #end
-
- root :to => 'welcome#index', :as => 'home'
-
- #added by baiyu
- match 'git_usage/ch_usage', :controller => 'git_usage', :action => 'ch_usage', :via => :get, :as => 'ch_usage'
- match 'git_usage/en_usage', :controller => 'git_usage', :action => 'en_usage', :via => :get, :as => 'en_usage'
- #added by nie
- match '/projects/search', :controller => 'projects', :action => 'search', :via => [:get, :post]
- match '/users/search', :controller => 'users', :action => 'search', :via => [:get, :post]
- #end
- match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post]
- match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post]
- match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register'
- match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password'
- match 'account/activate', :to => 'account#activate', :via => :get
-
- match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put]
- match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue', :via => [:get, :post, :put]
- match '/issues/preview/edit/:id', :to => 'previews#issue', :as => 'preview_edit_issue', :via => [:get, :post, :put]
- match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue', :via => [:get, :post, :put]
-
- match 'projects/:id/wiki', :to => 'wikis#edit', :via => :post
- match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post]
-
- # boards
- match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post], :as => 'new_board_message'
- get 'boards/:board_id/topics/:id', :to => 'messages#show', :as => 'board_message'
- match 'boards/:board_id/topics/quote/:id', :to => 'messages#quote', :via => [:get, :post]
- get 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
-
- post 'boards/:board_id/topics/preview', :to => 'messages#preview', :as => 'preview_board_message'
- post 'boards/:board_id/topics/:id/replies', :to => 'messages#reply'
- post 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
- post 'boards/:board_id/topics/:id/destroy', :to => 'messages#destroy'
- # boards end
- post 'bids/homework_destroy', :to => 'bids#homework_destroy'
-
- # Misc issue routes. TODO: move into resources
- match '/issues/auto_complete', :to => 'auto_completes#issues', :via => :get, :as => 'auto_complete_issues'
- match '/issues/context_menu', :to => 'context_menus#issues', :as => 'issues_context_menu', :via => [:get, :post]
- match '/issues/changes', :to => 'journals#index', :as => 'issue_changes', :via => :get
- match '/issues/:id/quoted', :to => 'journals#new', :id => /\d+/, :via => :post, :as => 'quoted_issue'
-
- match '/journals/diff/:id', :to => 'journals#diff', :id => /\d+/, :via => :get
- match '/journals/edit/:id', :to => 'journals#edit', :id => /\d+/, :via => [:get, :post]
- match '/journals/destroy/:id', :to => 'journals#destroy', :id => /\d+/, :via => [:get, :post]
-
-
- get '/projects/:project_id/issues/gantt', :to => 'gantts#show', :as => 'project_gantt'
- get '/issues/gantt', :to => 'gantts#show'
-
- get '/projects/:project_id/issues/calendar', :to => 'calendars#show', :as => 'project_calendar'
- get '/issues/calendar', :to => 'calendars#show'
-
- get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report'
- get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details'
- post '/users/:id/user_activities', :to => 'users#show', :as => "user_activities"
-
- #added by young
- resources :users do
- member do
- match 'user_projects', :to => 'users#user_projects', :via => :get
- match 'user_activities', :to => 'users#show', :via => :get, :as => "user_activities"
- match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback"
- match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post]
- match 'info', :to => 'users#info', :via => [:get , :post], :as => 'user_info'
- match 'user_watchlist', :to => 'users#user_watchlist', :via => :get, :as => "user_watchlist" #add by huang
- match 'user_fanslist', :to => 'users#user_fanslist', :via => :get, :as => "user_fanslist" #add by huang
- match 'user_courses', :to => 'users#user_courses', :via => :get
- match 'user_homeworks', :to => 'users#user_homeworks', :via => :get
- match 'watch_projects', :to => 'users#watch_projects', :via => :get
- # added by bai
- match 'show_score', :to => 'users#show_score', :via => :get
- match 'topic_score_index', :controller => 'users', :action => 'topic_score_index', :via => [:get, :post]
- match 'project_score_index', :to => 'users#project_score_index', :via => :get
- match 'activity_score_index', :to => 'users#activity_score_index', :via => :get
- match 'influence_score_index', :to => 'users#influence_score_index', :via => :get
- match 'score_index', :to => 'users#score_index', :via => :get
-
- match 'show_projects_score', :to => 'projects#show_projects_score', :via => [:get, :post]
- match 'issue_score_index', :to => 'projects#issue_score_index', :via => [:get, :post]
- match 'news_score_index', :to => 'projects#news_score_index', :via => [:get, :post]
- match 'file_score_index', :to => 'projects#file_score_index', :via => [:get, :post]
- match 'code_submit_score_index', :to => 'projects#code_submit_score_index', :via => [:get, :post]
- match 'projects_topic_score_index', :to => 'projects#projects_topic_score_index', :via => [:get, :post]
- # end
- end
- end
- match 'users/:id/user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "feedback"
- match 'users/:id/user_projects', :controller => 'users', :action => 'user_projects', :via => :get
- #match 'user/:id/watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post]
-
- #end
- match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post]
- match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post]
- match 'my/page', :controller => 'my', :action => 'page', :via => :get
- match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page
- match 'my/reset_rss_key', :controller => 'my', :action => 'reset_rss_key', :via => :post
- match 'my/reset_api_key', :controller => 'my', :action => 'reset_api_key', :via => :post
- match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post]
- match 'my/page_layout', :controller => 'my', :action => 'page_layout', :via => :get
- match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post
- match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post
- match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post
-
- resources :users
- match 'users/:id/memberships/:membership_id', :to => 'users#edit_membership', :via => :put, :as => 'user_membership'
- match 'users/:id/memberships/:membership_id', :to => 'users#destroy_membership', :via => :delete
- match 'users/:id/memberships', :to => 'users#edit_membership', :via => :post, :as => 'user_memberships'
- ################# added by william
- match 'users/tag_save', :to => 'users#tag_save', :via => :post, :as => 'tag'
-
- post 'watchers/watch', :to => 'watchers#watch', :as => 'watch'
- delete 'watchers/watch', :to => 'watchers#unwatch'
- get 'watchers/new', :to => 'watchers#new'
- post 'watchers', :to => 'watchers#create'
- post 'watchers/append', :to => 'watchers#append'
- delete 'watchers', :to => 'watchers#destroy'
- get 'watchers/autocomplete_for_user', :to => 'watchers#autocomplete_for_user'
- # Specific routes for issue watchers API
- post 'issues/:object_id/watchers', :to => 'watchers#create', :object_type => 'issue'
- delete 'issues/:object_id/watchers/:user_id' => 'watchers#destroy', :object_type => 'issue'
-
- resources :bids, :only=>[:edit,:update,:show] do
- member do
- match 'homework_ajax_modal'
- end
- end
- resources :projects do
- member do
- post 'finishcourse'
- post 'restartcourse'
- get 'settings(/:tab)', :action => 'settings', :as => 'settings'
- #by young
- get 'member', :controller => 'projects', :action => 'member', :as => 'member'
- get 'file', :action => 'file', :as => 'file'
- get 'statistics', :action => 'statistics', :as => 'statistics'
- get 'feedback', :action => 'feedback', :as => 'project_feedback'
- get 'watcherlist', :action=> 'watcherlist'
- match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang
- get 'homework', :action => 'homework', :as => 'homework'
- get 'new_homework', :action => 'new_homework', :as => 'new_homework'
- #get 'news', :action => 'news', :as => 'news'
- #end
- post 'modules'
- post 'archive'
- post 'unarchive'
- post 'close'
- post 'reopen'
- match 'copy', :via => [:get, :post]
- end
-
-
- #by young
- match '/member', :controller => 'projects', :action => 'member', :as => 'member', :via => :get
- match '/file', :controller => 'projects', :action => 'file', :as => 'file', :via => :get
- match '/statistics', :controller => 'projects', :action => 'statistics', :as => 'statistics', :via => :get
- # match '/investor', :controller => 'projects', :action => 'investor', :as => 'investor', :via => :get
- match '/homework', :controller => 'projects', :action => 'homework', :as => 'homework', :via => :get
-
-
- # match '/activity', :controller => 'activities', :action => 'index', :as => 'activity', :via => :get
- # match '/repository', :controller => 'repositories', :action => 'show', :repository_id => nil, :path => nil, :rev => nil, :as => 'repository', :via => :get
- # match '/', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get
- # get 'projects/:project_id/show', :to => 'projects#show', :as => 'project_show'
- # get 'projects/:project_id/repository', :to => 'repositories#show', :as => 'project_repository'
-
- # match '/show', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get
- match '/watcherlist', :controller=>'projects', :action=> 'watcherlist', :as => 'watcherlist', :via => :get #add by huang
- # matche '/news', :controller => 'news', :action => 'index', :as => 'news', :via => :get
- #end
-
- resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do
- collection do
- get 'autocomplete'
- end
- end
-
- resource :enumerations, :controller => 'project_enumerations', :only => [:update, :destroy]
-
- get 'issues/:copy_from/copy', :to => 'issues#new', :as => 'copy_issue'
- resources :issues, :only => [:index, :new, :create] do
- resources :time_entries, :controller => 'timelog' do
- collection do
- get 'report'
- end
- end
- end
- # issue form update
- match 'issues/update_form', :controller => 'issues', :action => 'update_form', :via => [:put, :post], :as => 'issue_form'
-
- resources :files, :only => [:index, :new, :create]
-
- resources :versions, :except => [:index, :show, :edit, :update, :destroy] do
- collection do
- put 'close_completed'
- end
- end
- get 'versions.:format', :to => 'versions#index'
- get 'roadmap', :to => 'versions#index', :format => false
- get 'versions', :to => 'versions#index'
-
- resources :news, :except => [:show, :edit, :update, :destroy]
- resources :time_entries, :controller => 'timelog' do
- get 'report', :on => :collection
- end
- resources :queries, :only => [:new, :create]
- resources :issue_categories, :shallow => true
- resources :documents, :except => [:show, :edit, :update, :destroy]
- resources :boards
- resources :repositories, :shallow => true, :except => [:index, :show] do
- member do
- match 'committers', :via => [:get, :post]
- end
- end
- resources :repositories, :except => [:index, :show] do
- member do
- get 'newrepo', :via => [:get, :post]
- # get 'create', :via=>[:get, :post]
- end
- end
- match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
- resources :wiki, :except => [:index, :new, :create], :as => 'wiki_page' do
- member do
- get 'rename'
- post 'rename'
- get 'history'
- get 'diff'
- match 'preview', :via => [:post, :put]
- post 'protect'
- post 'add_attachment'
- end
- collection do
- get 'export'
- get 'date_index'
- end
- end
- match 'wiki', :controller => 'wiki', :action => 'show', :via => :get
- get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/}
- delete 'wiki/:id/:version', :to => 'wiki#destroy_version'
- get 'wiki/:id/:version/annotate', :to => 'wiki#annotate'
- get 'wiki/:id/:version/diff', :to => 'wiki#diff'
- end
-
- resources :issues do
- collection do
- match 'bulk_edit', :via => [:get, :post]
- post 'bulk_update'
- end
- resources :time_entries, :controller => 'timelog' do
- collection do
- get 'report'
- end
- end
- resources :relations, :shallow => true, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
- end
- match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete
-
- resources :queries, :except => [:show]
-
- resources :news, :only => [:index, :show, :edit, :update, :destroy]
- match '/news/:id/comments', :to => 'comments#create', :via => :post
- match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete
-
- resources :versions, :only => [:show, :edit, :update, :destroy] do
- post 'status_by', :on => :member
- end
-
- resources :documents, :only => [:show, :edit, :update, :destroy] do
- post 'add_attachment', :on => :member
- end
-
- match '/time_entries/context_menu', :to => 'context_menus#time_entries', :as => :time_entries_context_menu, :via => [:get, :post]
-
- resources :time_entries, :controller => 'timelog', :except => :destroy do
- collection do
- get 'report'
- get 'bulk_edit'
- post 'bulk_update'
- end
- end
- match '/time_entries/:id', :to => 'timelog#destroy', :via => :delete, :id => /\d+/
- # TODO: delete /time_entries for bulk deletion
- match '/time_entries/destroy', :to => 'timelog#destroy', :via => :delete
-
- get 'projects/:id/activity', :to => 'activities#index'
- get 'projects/:id/activity.:format', :to => 'activities#index'
- get 'activity', :to => 'activities#index'
-
- # repositories routes
- get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
- get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
-
- get 'projects/:id/repository/:repository_id/changes(/*path(.:ext))', :to => 'repositories#changes'
-
- get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision'
- get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision'
- post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue'
- delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
- get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions'
- get 'projects/:id/repository/:repository_id/revisions/:rev/:action(/*path(.:ext))',
- :controller => 'repositories',
- :format => false,
- :constraints => {
- :action => /(browse|show|entry|raw|annotate|diff)/,
- :rev => /[a-z0-9\.\-_]+/
- }
-
- get 'projects/:id/repository/statistics', :to => 'repositories#stats'
- get 'projects/:id/repository/graph', :to => 'repositories#graph'
-
- get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes'
-
- get 'projects/:id/repository/revisions', :to => 'repositories#revisions'
- get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision'
- get 'projects/:id/repository/revision', :to => 'repositories#revision'
- post 'projects/:id/repository/revisions/:rev/issues', :to => 'repositories#add_related_issue'
- delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
- get 'projects/:id/repository/revisions/:rev/:action(/*path(.:ext))',
- :controller => 'repositories',
- :format => false,
- :constraints => {
- :action => /(browse|show|entry|raw|annotate|diff)/,
- :rev => /[a-z0-9\.\-_]+/
- }
- get 'projects/:id/repository/:repository_id/:action(/*path(.:ext))',
- :controller => 'repositories',
- :action => /(browse|show|entry|raw|changes|annotate|diff)/
- get 'projects/:id/repository/:action(/*path(.:ext))',
- :controller => 'repositories',
- :action => /(browse|show|entry|raw|changes|annotate|diff)/
-
- get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil
- get 'projects/:id/repository', :to => 'repositories#show', :path => nil
-
- # additional routes for having the file name at the end of url
- get 'attachments/:id/:filename', :to => 'attachments#show', :id => /\d+/, :filename => /.*/, :as => 'named_attachment'
- get 'attachments/download/:id/:filename', :to => 'attachments#download', :id => /\d+/, :filename => /.*/, :as => 'download_named_attachment'
- get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/
- get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail'
- get 'attachments/autocomplete'
- match 'attachments/autocomplete', :to => 'attachments#autocomplete', via: [:post]
- post 'attachments/relationfile', to: 'attachments#add_exist_file_to_project', as: 'attach_relation'
- resources :attachments, :only => [:show, :destroy]
-
- resources :groups do
- member do
- get 'autocomplete_for_user'
- end
- end
-
- match 'groups/:id/users', :controller => 'groups', :action => 'add_users', :id => /\d+/, :via => :post, :as => 'group_users'
- match 'groups/:id/users/:user_id', :controller => 'groups', :action => 'remove_user', :id => /\d+/, :via => :delete, :as => 'group_user'
- match 'groups/destroy_membership/:id', :controller => 'groups', :action => 'destroy_membership', :id => /\d+/, :via => :post
- match 'groups/edit_membership/:id', :controller => 'groups', :action => 'edit_membership', :id => /\d+/, :via => :post
-
- resources :trackers, :except => :show do
- collection do
- match 'fields', :via => [:get, :post]
- end
- end
- resources :issue_statuses, :except => :show do
- collection do
- post 'update_issue_done_ratio'
- end
- end
- resources :custom_fields, :except => :show
- resources :roles do
- collection do
- match 'permissions', :via => [:get, :post]
- end
- end
- resources :enumerations, :except => :show
- match 'enumerations/:type', :to => 'enumerations#index', :via => :get
-
- get 'projects/:id/search', :controller => 'search', :action => 'index'
- get 'search', :controller => 'search', :action => 'index'
-
- match 'mail_handler', :controller => 'mail_handler', :action => 'index', :via => :post
-
- match 'admin', :controller => 'admin', :action => 'index', :via => :get
- match 'admin/projects', :controller => 'admin', :action => 'projects', :via => :get
- match 'admin/plugins', :controller => 'admin', :action => 'plugins', :via => :get
- match 'admin/info', :controller => 'admin', :action => 'info', :via => :get
- match 'admin/test_email', :controller => 'admin', :action => 'test_email', :via => :get
- match 'admin/default_configuration', :controller => 'admin', :action => 'default_configuration', :via => :post
-
- resources :auth_sources do
- member do
- get 'test_connection', :as => 'try_connection'
- end
- collection do
- get 'autocomplete_for_new_user'
- end
- end
-
-
-
- match 'workflows', :controller => 'workflows', :action => 'index', :via => :get
- match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post]
- match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post]
- match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post]
- match 'settings', :controller => 'settings', :action => 'index', :via => :get
- match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post]
- match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post], :as => 'plugin_settings'
-
- match 'sys/projects', :to => 'sys#projects', :via => :get
- match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post
- match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => :get
-
- match 'uploads', :to => 'attachments#upload', :via => :post
- # Added by Tao
- match 'upload_avatar', :to => 'avatar#upload', :via => :post
- # Endof Tao's code
- get 'robots.txt', :to => 'welcome#robots'
-
- Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir|
- file = File.join(plugin_dir, "config/routes.rb")
- if File.exists?(file)
- begin
- instance_eval File.read(file)
- rescue Exception => e
- puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}."
- exit 1
- end
- end
- end
-
- ##############测试留言功能 fq
- post 'words/new', :to => 'words#new'
- post 'words/create', :to => 'words#create'
- post 'words/append', :to => 'words#append'
- post 'words/create_reply', :to => 'words#create_reply'
- delete 'words/destroy', :to => 'words#destroy'
- get 'words/more', :to => 'words#more'
- get 'words/back', :to=> 'words#back'
- ############## fq
- post 'calls/create', :to => 'bids#create'
- delete 'calls/destroy', :to => 'bids#destroy'
- match 'calls/new', :controller => 'bids', :action => 'new', :via => [:get , :post]
- get 'calls/more', :to => 'bids#more'
- get 'calls/back', :to=> 'bids#back'
- match 'calls/new_bid', :controller => 'bids', :action => 'new_bid'
- match 'contest/new_contest', :controller => 'bids', :action => 'new_contest' #huang
- match 'calls/:id/show_project', :controller => 'bids', :action => 'show_project', :as => 'project_for_bid'
- match 'calls/:id/show_project_homework', :controller => 'bids', :action => 'show_project_homework', :as => 'project_for_bid_homework' # by huang
- match 'calls/:id/add', :controller => 'bids', :action => 'add'
- match 'calls/:id/add_homework', :controller => 'bids', :action => 'add_homework', via: :post
- match 'calls/:id/new_submit_homework', to: 'bids#new_submit_homework', via: :get, as: 'new_submit_homework'
- match 'words/add_project_respond', :controller => 'words', :action => 'add_project_respond'
- match 'words/:id/leave_project_message', :controller => 'words', :action => 'leave_project_message'
-
- match 'projects/:id/feedback', :to => 'projects#feedback', :via => :get, :as => 'project_feedback'
- match 'calls/create_bid', :to => 'bids#create_bid'
- match 'contest/create_contest', :to => 'bids#create_contest' #huang
- match 'calls/create_homework', :to => 'bids#create_homework'
- match 'calls/:id/homework_respond', :to => 'bids#homework_respond'
- match 'calls/:id/homework_statistics', :to => 'bids#homework_statistics'
- match 'calls/:id/fork', :to => 'bids#fork', :as => 'fork'
- match 'calls/:id/create_fork', :to => 'bids#create_fork'
- match 'project/enterprise_course', :to => 'projects#enterprise_course'
- match 'project/course_enterprise', :to => 'projects#course_enterprise'
- match 'calls/:id/show_course', :to => 'bids#show_course', :as => 'show_course'
- match 'calls/:id/show_bid_project', :to => 'bids#show_bid_project', :as => 'show_bid_project'
- match 'calls/:id/show_bid_user', :to => 'bids#show_bid_user', :as => 'show_bid_user'
-
- match 'project/:id/share', :to => 'projects#share', :as => 'share_show' #share
-
- post 'join_in/join', :to => 'courses#join', :as => 'join'
- delete 'join_in/join', :to => 'courses#unjoin'
- post 'calls/:id/join_in_contest', :to => 'bids#join_in_contest', :as => 'join_in_contest'
- delete 'calls/:id/join_in_contest', :to => 'bids#unjoin_in_contest'
- match 'calls/:id/show_participator', :to => 'bids#show_participator' #bai
- match 'calls/:id/update_contest', :to => 'bids#update_contest' #bai
- match 'calls/:id/settings', :to => 'bids#settings' #bai
-
- delete 'attachment/:id', :to => 'attachments#delete_homework'
- match 'new_join', :to => 'projects#new_join', :as => 'try_join'
- match 'new_join_in_contest', :to => 'bids#new_join', :as => 'try_join_in_contest'
- match 'projects/:id/respond', :to => 'projects#project_respond', :via => :post
- match 'calls/:id/manage',:to => 'bids#manage',:via => [:get,:post]
- match 'project/course', :to => 'projects#course', :as => 'course'
-
- #added by william
- # match 'calls/:id/set_results',:controller => 'bids', :action => 'set_results',:via => [:get,:post],:as => 'set_results'
- # match 'calls/:id/set_prizes',:controller => 'bids',:action => 'set_prizes',:as => 'set_prizes'
- match 'calls/:id/set_reward',:controller => 'bids',:action => 'set_reward',:as => 'set_reward'
-
- ## 测试用
- match 'test/index', :controller => 'test', :action => 'index'
- # added by young
- match 'calls', :controller => 'bids', :action => 'index'
-
- match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond'
- match 'contest', :controller => 'bids', :action => 'contest', :as => 'contest'
-
- ######added by nie
- match 'tags/show_projects_tags',:to => 'tags#show_projects_tags'
- ########### added by liuping
- match 'tags/add_tag',:to => 'tags#add_tag',:as=>"add_tag"
- match 'tags/delete_tag',:to => 'tags#delete_tag',:as=>"add_tag"
- match 'tags/show_all',:to => 'tags#show_all'
- match 'parise_tread/praise_plus',:to => 'parise_tread#praise_plus',:as=>"praise"
- match 'parise_tread/tread_plus',:to => 'parise_tread#tread_plus',:as=>"tread"
- match 'tags/delete',:to=>'tags#delete'
- match 'tags/remove_tag',:to=>'tags#remove_tag',:as=>"remove_tag"
-
- match 'words/add_brief_introdution', :controller => 'words', :action => 'add_brief_introdution'
-
- get ':controller(/:action(/:id))'
-end
+# Redmine - project management software
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write tobthe Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+RedmineApp::Application.routes.draw do
+ namespace :zipdown do
+ match 'assort'
+ end
+ namespace :test 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]
+ end
+ end
+
+ resources :forums do
+ collection do
+ match 'search_forum', :via => [:get, :post]
+ end
+ member do
+ post 'create_memo'
+ match 'search_memo', :via => [:get, :post]
+ end
+ resources :memos do
+ collection do
+ get "quote"
+ end
+ end
+ end
+
+
+ resources :shares
+
+ #added by william
+ get "tags/index"
+
+ get "tags/show"
+
+ get "praise_tread/praise_plus"
+
+ get "praise_tread/tread_plus"
+ #end
+
+ root :to => 'welcome#index', :as => 'home'
+
+ #added by baiyu
+ match 'git_usage/ch_usage', :controller => 'git_usage', :action => 'ch_usage', :via => :get, :as => 'ch_usage'
+ match 'git_usage/en_usage', :controller => 'git_usage', :action => 'en_usage', :via => :get, :as => 'en_usage'
+ #added by nie
+ match '/projects/search', :controller => 'projects', :action => 'search', :via => [:get, :post]
+ match '/users/search', :controller => 'users', :action => 'search', :via => [:get, :post]
+ #end
+ match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post]
+ match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post]
+ match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register'
+ match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password'
+ match 'account/activate', :to => 'account#activate', :via => :get
+
+ match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put]
+ match '/issues/preview/new/:project_id', :to => 'previews#issue', :as => 'preview_new_issue', :via => [:get, :post, :put]
+ match '/issues/preview/edit/:id', :to => 'previews#issue', :as => 'preview_edit_issue', :via => [:get, :post, :put]
+ match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue', :via => [:get, :post, :put]
+
+ match 'projects/:id/wiki', :to => 'wikis#edit', :via => :post
+ match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post]
+
+ # boards
+ match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post], :as => 'new_board_message'
+ get 'boards/:board_id/topics/:id', :to => 'messages#show', :as => 'board_message'
+ match 'boards/:board_id/topics/quote/:id', :to => 'messages#quote', :via => [:get, :post]
+ get 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
+
+ post 'boards/:board_id/topics/preview', :to => 'messages#preview', :as => 'preview_board_message'
+ post 'boards/:board_id/topics/:id/replies', :to => 'messages#reply'
+ post 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
+ post 'boards/:board_id/topics/:id/destroy', :to => 'messages#destroy'
+ # boards end
+ post 'bids/homework_destroy', :to => 'bids#homework_destroy'
+
+ # Misc issue routes. TODO: move into resources
+ match '/issues/auto_complete', :to => 'auto_completes#issues', :via => :get, :as => 'auto_complete_issues'
+ match '/issues/context_menu', :to => 'context_menus#issues', :as => 'issues_context_menu', :via => [:get, :post]
+ match '/issues/changes', :to => 'journals#index', :as => 'issue_changes', :via => :get
+ match '/issues/:id/quoted', :to => 'journals#new', :id => /\d+/, :via => :post, :as => 'quoted_issue'
+
+ match '/journals/diff/:id', :to => 'journals#diff', :id => /\d+/, :via => :get
+ match '/journals/edit/:id', :to => 'journals#edit', :id => /\d+/, :via => [:get, :post]
+ match '/journals/destroy/:id', :to => 'journals#destroy', :id => /\d+/, :via => [:get, :post]
+
+
+ get '/projects/:project_id/issues/gantt', :to => 'gantts#show', :as => 'project_gantt'
+ get '/issues/gantt', :to => 'gantts#show'
+
+ get '/projects/:project_id/issues/calendar', :to => 'calendars#show', :as => 'project_calendar'
+ get '/issues/calendar', :to => 'calendars#show'
+
+ get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report'
+ get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details'
+ post '/users/:id/user_activities', :to => 'users#show', :as => "user_activities"
+
+ #added by young
+ resources :users do
+ member do
+ match 'user_projects', :to => 'users#user_projects', :via => :get
+ match 'user_activities', :to => 'users#show', :via => :get, :as => "user_activities"
+ match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback"
+ match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post]
+ match 'info', :to => 'users#info', :via => [:get , :post], :as => 'user_info'
+ match 'user_watchlist', :to => 'users#user_watchlist', :via => :get, :as => "user_watchlist" #add by huang
+ match 'user_fanslist', :to => 'users#user_fanslist', :via => :get, :as => "user_fanslist" #add by huang
+ match 'user_courses', :to => 'users#user_courses', :via => :get
+ match 'user_homeworks', :to => 'users#user_homeworks', :via => :get
+ match 'watch_projects', :to => 'users#watch_projects', :via => :get
+ # added by bai
+ match 'show_score', :to => 'users#show_score', :via => :get
+ match 'topic_score_index', :controller => 'users', :action => 'topic_score_index', :via => [:get, :post]
+ match 'project_score_index', :to => 'users#project_score_index', :via => :get
+ match 'activity_score_index', :to => 'users#activity_score_index', :via => :get
+ match 'influence_score_index', :to => 'users#influence_score_index', :via => :get
+ match 'score_index', :to => 'users#score_index', :via => :get
+
+ match 'show_projects_score', :to => 'projects#show_projects_score', :via => [:get, :post]
+ match 'issue_score_index', :to => 'projects#issue_score_index', :via => [:get, :post]
+ match 'news_score_index', :to => 'projects#news_score_index', :via => [:get, :post]
+ match 'file_score_index', :to => 'projects#file_score_index', :via => [:get, :post]
+ match 'code_submit_score_index', :to => 'projects#code_submit_score_index', :via => [:get, :post]
+ match 'projects_topic_score_index', :to => 'projects#projects_topic_score_index', :via => [:get, :post]
+ # end
+ end
+ end
+ match 'users/:id/user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "feedback"
+ match 'users/:id/user_projects', :controller => 'users', :action => 'user_projects', :via => :get
+ #match 'user/:id/watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post]
+
+ #end
+ match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post]
+ match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post]
+ match 'my/page', :controller => 'my', :action => 'page', :via => :get
+ match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page
+ match 'my/reset_rss_key', :controller => 'my', :action => 'reset_rss_key', :via => :post
+ match 'my/reset_api_key', :controller => 'my', :action => 'reset_api_key', :via => :post
+ match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post]
+ match 'my/page_layout', :controller => 'my', :action => 'page_layout', :via => :get
+ match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post
+ match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post
+ match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post
+
+ resources :users
+ match 'users/:id/memberships/:membership_id', :to => 'users#edit_membership', :via => :put, :as => 'user_membership'
+ match 'users/:id/memberships/:membership_id', :to => 'users#destroy_membership', :via => :delete
+ match 'users/:id/memberships', :to => 'users#edit_membership', :via => :post, :as => 'user_memberships'
+ ################# added by william
+ match 'users/tag_save', :to => 'users#tag_save', :via => :post, :as => 'tag'
+
+ post 'watchers/watch', :to => 'watchers#watch', :as => 'watch'
+ delete 'watchers/watch', :to => 'watchers#unwatch'
+ get 'watchers/new', :to => 'watchers#new'
+ post 'watchers', :to => 'watchers#create'
+ post 'watchers/append', :to => 'watchers#append'
+ delete 'watchers', :to => 'watchers#destroy'
+ get 'watchers/autocomplete_for_user', :to => 'watchers#autocomplete_for_user'
+ # Specific routes for issue watchers API
+ post 'issues/:object_id/watchers', :to => 'watchers#create', :object_type => 'issue'
+ delete 'issues/:object_id/watchers/:user_id' => 'watchers#destroy', :object_type => 'issue'
+
+ resources :bids, :only=>[:edit,:update,:show] do
+ member do
+ match 'homework_ajax_modal'
+ end
+ end
+ resources :projects do
+ member do
+ post 'finishcourse'
+ post 'restartcourse'
+ get 'settings(/:tab)', :action => 'settings', :as => 'settings'
+ #by young
+ get 'member', :controller => 'projects', :action => 'member', :as => 'member'
+ get 'file', :action => 'file', :as => 'file'
+ get 'statistics', :action => 'statistics', :as => 'statistics'
+ get 'feedback', :action => 'feedback', :as => 'project_feedback'
+ get 'watcherlist', :action=> 'watcherlist'
+ match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang
+ get 'homework', :action => 'homework', :as => 'homework'
+ get 'new_homework', :action => 'new_homework', :as => 'new_homework'
+ #get 'news', :action => 'news', :as => 'news'
+ #end
+ post 'modules'
+ post 'archive'
+ post 'unarchive'
+ post 'close'
+ post 'reopen'
+ match 'copy', :via => [:get, :post]
+ end
+
+
+ #by young
+ match '/member', :controller => 'projects', :action => 'member', :as => 'member', :via => :get
+ match '/file', :controller => 'projects', :action => 'file', :as => 'file', :via => :get
+ match '/statistics', :controller => 'projects', :action => 'statistics', :as => 'statistics', :via => :get
+ # match '/investor', :controller => 'projects', :action => 'investor', :as => 'investor', :via => :get
+ match '/homework', :controller => 'projects', :action => 'homework', :as => 'homework', :via => :get
+
+
+ # match '/activity', :controller => 'activities', :action => 'index', :as => 'activity', :via => :get
+ # match '/repository', :controller => 'repositories', :action => 'show', :repository_id => nil, :path => nil, :rev => nil, :as => 'repository', :via => :get
+ # match '/', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get
+ # get 'projects/:project_id/show', :to => 'projects#show', :as => 'project_show'
+ # get 'projects/:project_id/repository', :to => 'repositories#show', :as => 'project_repository'
+
+ # match '/show', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get
+ match '/watcherlist', :controller=>'projects', :action=> 'watcherlist', :as => 'watcherlist', :via => :get #add by huang
+ # matche '/news', :controller => 'news', :action => 'index', :as => 'news', :via => :get
+ #end
+
+ resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do
+ collection do
+ get 'autocomplete'
+ end
+ end
+
+ resource :enumerations, :controller => 'project_enumerations', :only => [:update, :destroy]
+
+ get 'issues/:copy_from/copy', :to => 'issues#new', :as => 'copy_issue'
+ resources :issues, :only => [:index, :new, :create] do
+ resources :time_entries, :controller => 'timelog' do
+ collection do
+ get 'report'
+ end
+ end
+ end
+ # issue form update
+ match 'issues/update_form', :controller => 'issues', :action => 'update_form', :via => [:put, :post], :as => 'issue_form'
+
+ resources :files, :only => [:index, :new, :create]
+
+ resources :versions, :except => [:index, :show, :edit, :update, :destroy] do
+ collection do
+ put 'close_completed'
+ end
+ end
+ get 'versions.:format', :to => 'versions#index'
+ get 'roadmap', :to => 'versions#index', :format => false
+ get 'versions', :to => 'versions#index'
+
+ resources :news, :except => [:show, :edit, :update, :destroy]
+ resources :time_entries, :controller => 'timelog' do
+ get 'report', :on => :collection
+ end
+ resources :queries, :only => [:new, :create]
+ resources :issue_categories, :shallow => true
+ resources :documents, :except => [:show, :edit, :update, :destroy]
+ resources :boards
+ resources :repositories, :shallow => true, :except => [:index, :show] do
+ member do
+ match 'committers', :via => [:get, :post]
+ end
+ end
+ resources :repositories, :except => [:index, :show] do
+ member do
+ get 'newrepo', :via => [:get, :post]
+ # get 'create', :via=>[:get, :post]
+ end
+ end
+ match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
+ resources :wiki, :except => [:index, :new, :create], :as => 'wiki_page' do
+ member do
+ get 'rename'
+ post 'rename'
+ get 'history'
+ get 'diff'
+ match 'preview', :via => [:post, :put]
+ post 'protect'
+ post 'add_attachment'
+ end
+ collection do
+ get 'export'
+ get 'date_index'
+ end
+ end
+ match 'wiki', :controller => 'wiki', :action => 'show', :via => :get
+ get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/}
+ delete 'wiki/:id/:version', :to => 'wiki#destroy_version'
+ get 'wiki/:id/:version/annotate', :to => 'wiki#annotate'
+ get 'wiki/:id/:version/diff', :to => 'wiki#diff'
+ end
+
+ resources :issues do
+ collection do
+ match 'bulk_edit', :via => [:get, :post]
+ post 'bulk_update'
+ end
+ resources :time_entries, :controller => 'timelog' do
+ collection do
+ get 'report'
+ end
+ end
+ resources :relations, :shallow => true, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
+ end
+ match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete
+
+ resources :queries, :except => [:show]
+
+ resources :news, :only => [:index, :show, :edit, :update, :destroy]
+ match '/news/:id/comments', :to => 'comments#create', :via => :post
+ match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete
+
+ resources :versions, :only => [:show, :edit, :update, :destroy] do
+ post 'status_by', :on => :member
+ end
+
+ resources :documents, :only => [:show, :edit, :update, :destroy] do
+ post 'add_attachment', :on => :member
+ end
+
+ match '/time_entries/context_menu', :to => 'context_menus#time_entries', :as => :time_entries_context_menu, :via => [:get, :post]
+
+ resources :time_entries, :controller => 'timelog', :except => :destroy do
+ collection do
+ get 'report'
+ get 'bulk_edit'
+ post 'bulk_update'
+ end
+ end
+ match '/time_entries/:id', :to => 'timelog#destroy', :via => :delete, :id => /\d+/
+ # TODO: delete /time_entries for bulk deletion
+ match '/time_entries/destroy', :to => 'timelog#destroy', :via => :delete
+
+ get 'projects/:id/activity', :to => 'activities#index'
+ get 'projects/:id/activity.:format', :to => 'activities#index'
+ get 'activity', :to => 'activities#index'
+
+ # repositories routes
+ get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
+ get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
+
+ get 'projects/:id/repository/:repository_id/changes(/*path(.:ext))', :to => 'repositories#changes'
+
+ get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision'
+ get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision'
+ post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue'
+ delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
+ get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions'
+ get 'projects/:id/repository/:repository_id/revisions/:rev/:action(/*path(.:ext))',
+ :controller => 'repositories',
+ :format => false,
+ :constraints => {
+ :action => /(browse|show|entry|raw|annotate|diff)/,
+ :rev => /[a-z0-9\.\-_]+/
+ }
+
+ get 'projects/:id/repository/statistics', :to => 'repositories#stats'
+ get 'projects/:id/repository/graph', :to => 'repositories#graph'
+
+ get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes'
+
+ get 'projects/:id/repository/revisions', :to => 'repositories#revisions'
+ get 'projects/:id/repository/revisions/:rev', :to => 'repositories#revision'
+ get 'projects/:id/repository/revision', :to => 'repositories#revision'
+ post 'projects/:id/repository/revisions/:rev/issues', :to => 'repositories#add_related_issue'
+ delete 'projects/:id/repository/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
+ get 'projects/:id/repository/revisions/:rev/:action(/*path(.:ext))',
+ :controller => 'repositories',
+ :format => false,
+ :constraints => {
+ :action => /(browse|show|entry|raw|annotate|diff)/,
+ :rev => /[a-z0-9\.\-_]+/
+ }
+ get 'projects/:id/repository/:repository_id/:action(/*path(.:ext))',
+ :controller => 'repositories',
+ :action => /(browse|show|entry|raw|changes|annotate|diff)/
+ get 'projects/:id/repository/:action(/*path(.:ext))',
+ :controller => 'repositories',
+ :action => /(browse|show|entry|raw|changes|annotate|diff)/
+
+ get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil
+ get 'projects/:id/repository', :to => 'repositories#show', :path => nil
+
+ # additional routes for having the file name at the end of url
+ get 'attachments/:id/:filename', :to => 'attachments#show', :id => /\d+/, :filename => /.*/, :as => 'named_attachment'
+ get 'attachments/download/:id/:filename', :to => 'attachments#download', :id => /\d+/, :filename => /.*/, :as => 'download_named_attachment'
+ get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/
+ get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail'
+ get 'attachments/autocomplete'
+ match 'attachments/autocomplete', :to => 'attachments#autocomplete', via: [:post]
+ post 'attachments/relationfile', to: 'attachments#add_exist_file_to_project', as: 'attach_relation'
+ resources :attachments, :only => [:show, :destroy]
+
+ resources :groups do
+ member do
+ get 'autocomplete_for_user'
+ end
+ end
+
+ match 'groups/:id/users', :controller => 'groups', :action => 'add_users', :id => /\d+/, :via => :post, :as => 'group_users'
+ match 'groups/:id/users/:user_id', :controller => 'groups', :action => 'remove_user', :id => /\d+/, :via => :delete, :as => 'group_user'
+ match 'groups/destroy_membership/:id', :controller => 'groups', :action => 'destroy_membership', :id => /\d+/, :via => :post
+ match 'groups/edit_membership/:id', :controller => 'groups', :action => 'edit_membership', :id => /\d+/, :via => :post
+
+ resources :trackers, :except => :show do
+ collection do
+ match 'fields', :via => [:get, :post]
+ end
+ end
+ resources :issue_statuses, :except => :show do
+ collection do
+ post 'update_issue_done_ratio'
+ end
+ end
+ resources :custom_fields, :except => :show
+ resources :roles do
+ collection do
+ match 'permissions', :via => [:get, :post]
+ end
+ end
+ resources :enumerations, :except => :show
+ match 'enumerations/:type', :to => 'enumerations#index', :via => :get
+
+ get 'projects/:id/search', :controller => 'search', :action => 'index'
+ get 'search', :controller => 'search', :action => 'index'
+
+ match 'mail_handler', :controller => 'mail_handler', :action => 'index', :via => :post
+
+ match 'admin', :controller => 'admin', :action => 'index', :via => :get
+ match 'admin/projects', :controller => 'admin', :action => 'projects', :via => :get
+ match 'admin/plugins', :controller => 'admin', :action => 'plugins', :via => :get
+ match 'admin/info', :controller => 'admin', :action => 'info', :via => :get
+ match 'admin/test_email', :controller => 'admin', :action => 'test_email', :via => :get
+ match 'admin/default_configuration', :controller => 'admin', :action => 'default_configuration', :via => :post
+
+ resources :auth_sources do
+ member do
+ get 'test_connection', :as => 'try_connection'
+ end
+ collection do
+ get 'autocomplete_for_new_user'
+ end
+ end
+
+
+
+ match 'workflows', :controller => 'workflows', :action => 'index', :via => :get
+ match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post]
+ match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post]
+ match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post]
+ match 'settings', :controller => 'settings', :action => 'index', :via => :get
+ match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post]
+ match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post], :as => 'plugin_settings'
+
+ match 'sys/projects', :to => 'sys#projects', :via => :get
+ match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post
+ match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => :get
+
+ match 'uploads', :to => 'attachments#upload', :via => :post
+ # Added by Tao
+ match 'upload_avatar', :to => 'avatar#upload', :via => :post
+ # Endof Tao's code
+ get 'robots.txt', :to => 'welcome#robots'
+
+ Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir|
+ file = File.join(plugin_dir, "config/routes.rb")
+ if File.exists?(file)
+ begin
+ instance_eval File.read(file)
+ rescue Exception => e
+ puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}."
+ exit 1
+ end
+ end
+ end
+
+ ##############测试留言功能 fq
+ post 'words/new', :to => 'words#new'
+ post 'words/create', :to => 'words#create'
+ post 'words/append', :to => 'words#append'
+ post 'words/create_reply', :to => 'words#create_reply'
+ delete 'words/destroy', :to => 'words#destroy'
+ get 'words/more', :to => 'words#more'
+ get 'words/back', :to=> 'words#back'
+ ############## fq
+ post 'calls/create', :to => 'bids#create'
+ delete 'calls/destroy', :to => 'bids#destroy'
+ match 'calls/new', :controller => 'bids', :action => 'new', :via => [:get , :post]
+ get 'calls/more', :to => 'bids#more'
+ get 'calls/back', :to=> 'bids#back'
+ match 'calls/new_bid', :controller => 'bids', :action => 'new_bid'
+ match 'contest/new_contest', :controller => 'bids', :action => 'new_contest' #huang
+ match 'calls/:id/show_project', :controller => 'bids', :action => 'show_project', :as => 'project_for_bid'
+ match 'calls/:id/show_project_homework', :controller => 'bids', :action => 'show_project_homework', :as => 'project_for_bid_homework' # by huang
+ match 'calls/:id/add', :controller => 'bids', :action => 'add'
+ match 'calls/:id/add_homework', :controller => 'bids', :action => 'add_homework', via: :post
+ match 'calls/:id/new_submit_homework', to: 'bids#new_submit_homework', via: :get, as: 'new_submit_homework'
+ match 'words/add_project_respond', :controller => 'words', :action => 'add_project_respond'
+ match 'words/:id/leave_project_message', :controller => 'words', :action => 'leave_project_message'
+
+ match 'projects/:id/feedback', :to => 'projects#feedback', :via => :get, :as => 'project_feedback'
+ match 'calls/create_bid', :to => 'bids#create_bid'
+ match 'contest/create_contest', :to => 'bids#create_contest' #huang
+ match 'calls/create_homework', :to => 'bids#create_homework'
+ match 'calls/:id/homework_respond', :to => 'bids#homework_respond'
+ match 'calls/:id/homework_statistics', :to => 'bids#homework_statistics'
+ match 'calls/:id/fork', :to => 'bids#fork', :as => 'fork'
+ match 'calls/:id/create_fork', :to => 'bids#create_fork'
+ match 'project/enterprise_course', :to => 'projects#enterprise_course'
+ match 'project/course_enterprise', :to => 'projects#course_enterprise'
+ match 'calls/:id/show_course', :to => 'bids#show_course', :as => 'show_course'
+ match 'calls/:id/show_bid_project', :to => 'bids#show_bid_project', :as => 'show_bid_project'
+ match 'calls/:id/show_bid_user', :to => 'bids#show_bid_user', :as => 'show_bid_user'
+
+ match 'project/:id/share', :to => 'projects#share', :as => 'share_show' #share
+
+ post 'join_in/join', :to => 'courses#join', :as => 'join'
+ delete 'join_in/join', :to => 'courses#unjoin'
+ post 'calls/:id/join_in_contest', :to => 'bids#join_in_contest', :as => 'join_in_contest'
+ delete 'calls/:id/join_in_contest', :to => 'bids#unjoin_in_contest'
+ match 'calls/:id/show_participator', :to => 'bids#show_participator' #bai
+ match 'calls/:id/update_contest', :to => 'bids#update_contest' #bai
+ match 'calls/:id/settings', :to => 'bids#settings' #bai
+
+ delete 'attachment/:id', :to => 'attachments#delete_homework'
+ match 'new_join', :to => 'projects#new_join', :as => 'try_join'
+ match 'new_join_in_contest', :to => 'bids#new_join', :as => 'try_join_in_contest'
+ match 'projects/:id/respond', :to => 'projects#project_respond', :via => :post
+ match 'calls/:id/manage',:to => 'bids#manage',:via => [:get,:post]
+ match 'project/course', :to => 'projects#course', :as => 'course'
+
+ #added by william
+ # match 'calls/:id/set_results',:controller => 'bids', :action => 'set_results',:via => [:get,:post],:as => 'set_results'
+ # match 'calls/:id/set_prizes',:controller => 'bids',:action => 'set_prizes',:as => 'set_prizes'
+ match 'calls/:id/set_reward',:controller => 'bids',:action => 'set_reward',:as => 'set_reward'
+
+ # added by young
+ match 'calls', :controller => 'bids', :action => 'index'
+
+ match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond'
+ match 'contest', :controller => 'bids', :action => 'contests', :as => 'contest' #modified @20140403
+
+
+ ########################
+ ##added by wen##########
+ #######confusing########
+ post 'school/get_options/:province', :to => 'school#get_options'
+ get 'school/get_options/:province', :to => 'school#get_options'
+
+
+
+ ######added by nie
+ match 'tags/show_projects_tags',:to => 'tags#show_projects_tags'
+ ########### added by liuping
+ match 'tags/add_tag',:to => 'tags#add_tag',:as=>"add_tag"
+ match 'tags/delete_tag',:to => 'tags#delete_tag',:as=>"add_tag"
+ match 'tags/show_all',:to => 'tags#show_all'
+ match 'parise_tread/praise_plus',:to => 'parise_tread#praise_plus',:as=>"praise"
+ match 'parise_tread/tread_plus',:to => 'parise_tread#tread_plus',:as=>"tread"
+ match 'tags/delete',:to=>'tags#delete'
+ match 'tags/remove_tag',:to=>'tags#remove_tag',:as=>"remove_tag"
+
+ match 'words/add_brief_introdution', :controller => 'words', :action => 'add_brief_introdution'
+
+ get ':controller(/:action(/:id))'
+end
diff --git a/db/migrate/20130828004955_stored_status_procedure.rb b/db/migrate/20130828004955_stored_status_procedure.rb
index 884c47bba..248fc488c 100644
--- a/db/migrate/20130828004955_stored_status_procedure.rb
+++ b/db/migrate/20130828004955_stored_status_procedure.rb
@@ -8,17 +8,15 @@ BEGIN
DECLARE user_changesets_count int(10);
DECLARE _done tinyint(1) DEFAULT 0;
DECLARE cur_user CURSOR FOR
- SELECT
- user_id,
- COUNT(*)
- FROM changesets
- WHERE user_id != ''
- GROUP BY user_id;
+ SELECT
+ users.id
+ FROM users
+ WHERE users.type = 'User' AND users.status = 1 AND users.admin = 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = 1;
OPEN cur_user;
loop_xxx:
LOOP
- FETCH cur_user INTO user_uid, user_changesets_count;
+ FETCH cur_user INTO user_uid ;
IF _done = 1 THEN
LEAVE loop_xxx;
END IF;
@@ -35,7 +33,7 @@ LOOP
SELECT
COUNT(*) INTO journals_for_messages_count
FROM journals_for_messages
- WHERE user_id = user_uid;
+ WHERE user_id = user_uid ;
SELECT
COUNT(*) INTO journals_count
FROM journals
@@ -60,6 +58,12 @@ LOOP
COUNT(*) INTO activities_count
FROM activities
WHERE user_id = user_uid;
+ SELECT
+ COUNT(*) INTO user_changesets_count
+ FROM changesets
+ WHERE changesets.user_id = user_uid;
+
+
SET total_count = journals_for_messages_count * 0.05 +
journals_count * 0.1 +
@@ -97,7 +101,7 @@ BEGIN
projects.id
FROM projects
WHERE projects.status <> 9
- AND projects.is_public = 1 ;
+ AND projects.is_public = 1 AND projects.project_type = 0 ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = 1;
OPEN cur_project;
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/migrate/20140415090718_remove_schoolid_from_courses.rb b/db/migrate/20140415090718_remove_schoolid_from_courses.rb
new file mode 100644
index 000000000..96b3a4ace
--- /dev/null
+++ b/db/migrate/20140415090718_remove_schoolid_from_courses.rb
@@ -0,0 +1,11 @@
+class RemoveSchoolidFromCourses < ActiveRecord::Migration
+ def up
+ remove_column :courses, :school_id
+
+ end
+
+ def down
+ add_column :courses, :school_id, :integer
+
+ end
+end
diff --git a/db/migrate/20140415090829_add_school_name_to_courses.rb b/db/migrate/20140415090829_add_school_name_to_courses.rb
new file mode 100644
index 000000000..1c9175e12
--- /dev/null
+++ b/db/migrate/20140415090829_add_school_name_to_courses.rb
@@ -0,0 +1,6 @@
+class AddSchoolNameToCourses < ActiveRecord::Migration
+ def change
+ add_column :courses, :school_name, :string
+
+ end
+end
diff --git a/db/migrate/20140417085550_rename_courses_column_school_name.rb b/db/migrate/20140417085550_rename_courses_column_school_name.rb
new file mode 100644
index 000000000..9a7d81067
--- /dev/null
+++ b/db/migrate/20140417085550_rename_courses_column_school_name.rb
@@ -0,0 +1,9 @@
+class RenameCoursesColumnSchoolName < ActiveRecord::Migration
+ def up
+ rename_column :courses, :school_name, :school_id
+ end
+
+ def down
+ rename_column :courses, :school_id, :school_name
+ end
+end
diff --git a/db/migrate/20140417090022_change_courses_column_school_id.rb b/db/migrate/20140417090022_change_courses_column_school_id.rb
new file mode 100644
index 000000000..813dbfdf9
--- /dev/null
+++ b/db/migrate/20140417090022_change_courses_column_school_id.rb
@@ -0,0 +1,9 @@
+class ChangeCoursesColumnSchoolId < ActiveRecord::Migration
+ def up
+ change_column :courses, :school_id, :integer
+ end
+
+ def down
+ change_column :courses, :school_id, :string
+ end
+end
diff --git a/db/migrate/20140417091429_add_school_id_to_user_extensions.rb b/db/migrate/20140417091429_add_school_id_to_user_extensions.rb
new file mode 100644
index 000000000..f97e8b9e3
--- /dev/null
+++ b/db/migrate/20140417091429_add_school_id_to_user_extensions.rb
@@ -0,0 +1,5 @@
+class AddSchoolIdToUserExtensions < ActiveRecord::Migration
+ def change
+ add_column :user_extensions, :school_id, :integer
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index a7e2244d2..bfbb7a26e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20140413022725) do
+ActiveRecord::Schema.define(:version => 20140417091429) do
create_table "activities", :force => true do |t|
t.integer "act_id", :null => false
@@ -23,15 +23,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type"
add_index "activities", ["user_id"], :name => "index_activities_on_user_id"
- create_table "apply_project_masters", :force => true do |t|
- t.integer "user_id"
- t.string "apply_type"
- t.integer "apply_id"
- t.integer "status"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
create_table "attachments", :force => true do |t|
t.integer "container_id"
t.string "container_type", :limit => 30
@@ -71,20 +62,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type"
- create_table "bak_mentioned", :primary_key => "Id", :force => true do |t|
- t.string "this_real_name", :limit => 1000
- t.integer "is_mentioned_in"
- t.string "context", :limit => 2000
- end
-
- add_index "bak_mentioned", ["this_real_name", "is_mentioned_in"], :name => "name_mention", :length => {"this_real_name"=>900, "is_mentioned_in"=>nil}
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name"
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_2"
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_3", :length => {"this_real_name"=>900}
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_4"
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_5"
- add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_6"
-
create_table "biding_projects", :force => true do |t|
t.integer "project_id"
t.integer "bid_id"
@@ -124,11 +101,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id"
add_index "boards", ["project_id"], :name => "boards_project_id"
- create_table "categories", :primary_key => "Id", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "proj_categories"
- end
-
create_table "changes", :force => true do |t|
t.integer "changeset_id", :null => false
t.string "action", :limit => 1, :default => "", :null => false
@@ -185,6 +157,38 @@ ActiveRecord::Schema.define(:version => 20140413022725) 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"
@@ -261,14 +265,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "documents", ["created_on"], :name => "index_documents_on_created_on"
add_index "documents", ["project_id"], :name => "documents_project_id"
- create_table "eco_projects", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.integer "eco_proj_id"
- t.datetime "date_collected"
- end
-
- add_index "eco_projects", ["proj_id"], :name => "proj_id"
-
create_table "enabled_modules", :force => true do |t|
t.integer "project_id"
t.string "name", :null => false
@@ -290,137 +286,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type"
add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id"
- create_table "events", :primary_key => "event_id", :force => true do |t|
- t.string "job_name"
- t.datetime "event_time"
- t.string "event_type", :limit => 20
- end
-
- create_table "fm_article", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "article_title", :limit => 16777215
- t.text "article_link", :limit => 16777215
- t.text "article_time", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_article", ["proj_id"], :name => "proj_id"
-
- create_table "fm_bugtracker_link", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_bugtracker_link", ["proj_id"], :name => "proj_id"
-
- create_table "fm_datametric_link", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_datametric_link", ["proj_id"], :name => "proj_id"
-
- create_table "fm_dependency_link", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_dependency_link", ["proj_id"], :name => "proj_id"
-
- create_table "fm_download_link", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "download_link", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_download_link", ["proj_id"], :name => "proj_id"
-
- create_table "fm_heartbeat", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.float "popularity_score", :limit => 12
- t.float "vitality_score", :limit => 12
- t.integer "subscription"
- t.integer "voting_score"
- t.integer "voting_count"
- t.datetime "date_collected"
- end
-
- add_index "fm_heartbeat", ["proj_id"], :name => "proj_id"
-
- create_table "fm_license", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_license", ["proj_id"], :name => "proj_id"
-
- create_table "fm_mailinglist_link", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_mailinglist_link", ["proj_id"], :name => "proj_id"
-
- create_table "fm_operating_system", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_operating_system", ["proj_id"], :name => "proj_id"
-
- create_table "fm_programming_language", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_programming_language", ["proj_id"], :name => "proj_id"
-
- create_table "fm_project_spotlight", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.text "project_name", :limit => 16777215
- t.text "project_spotlight_link", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_project_spotlight", ["proj_id"], :name => "proj_id"
-
- create_table "fm_release", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.text "release_version", :limit => 16777215
- t.text "release_time", :limit => 16777215
- t.text "release_tag", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_release", ["proj_id"], :name => "proj_id"
-
- create_table "fm_submit", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "submitter", :limit => 16777215
- t.text "submitter_link", :limit => 16777215
- t.text "submit_time", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_submit", ["proj_id"], :name => "proj_id"
-
- create_table "fm_summary", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.text "description", :limit => 16777215
- t.datetime "date_collected"
- end
-
- add_index "fm_summary", ["proj_id"], :name => "proj_id"
-
create_table "forums", :force => true do |t|
t.string "name", :null => false
t.string "description", :default => ""
@@ -521,6 +386,13 @@ ActiveRecord::Schema.define(:version => 20140413022725) 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"
@@ -646,22 +518,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "news", ["created_on"], :name => "index_news_on_created_on"
add_index "news", ["project_id"], :name => "news_project_id"
- create_table "no_uses", :force => true do |t|
- t.integer "user_id", :null => false
- t.string "no_use_type"
- t.integer "no_use_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "ohloh_tagged", :force => true do |t|
- t.integer "proj_id", :default => 0, :null => false
- t.string "description", :limit => 100, :null => false
- t.datetime "date_collected"
- end
-
- add_index "ohloh_tagged", ["proj_id"], :name => "proj_id"
-
create_table "open_id_authentication_associations", :force => true do |t|
t.integer "issued"
t.integer "lifetime"
@@ -677,19 +533,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
t.string "salt", :null => false
end
- create_table "open_source_projects", :force => true do |t|
- t.string "name"
- t.text "description"
- t.integer "commit_count", :default => 0
- t.integer "code_line", :default => 0
- t.integer "users_count", :default => 0
- t.date "last_commit_time"
- t.string "url"
- t.date "date_collected"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
create_table "praise_tread_caches", :force => true do |t|
t.integer "object_id", :null => false
t.string "object_type"
@@ -769,23 +612,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "queries", ["project_id"], :name => "index_queries_on_project_id"
add_index "queries", ["user_id"], :name => "index_queries_on_user_id"
- create_table "relative_memos", :force => true do |t|
- t.integer "osp_id", :null => false
- t.integer "parent_id"
- t.string "subject", :null => false
- t.text "content", :null => false
- t.integer "author_id"
- t.integer "replies_count", :default => 0
- t.integer "last_reply_id"
- t.boolean "lock", :default => false
- t.boolean "sticky", :default => false
- t.boolean "is_quote", :default => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "viewed_count_crawl", :default => 0
- t.integer "viewed_count_local", :default => 0
- end
-
create_table "repositories", :force => true do |t|
t.integer "project_id", :default => 0, :null => false
t.string "url", :default => "", :null => false
@@ -812,8 +638,10 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
end
create_table "schools", :force => true do |t|
- t.string "name"
- t.string "province"
+ t.string "name"
+ t.string "province"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
end
create_table "seems_rateable_cached_ratings", :force => true do |t|
@@ -856,6 +684,21 @@ ActiveRecord::Schema.define(:version => 20140413022725) 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"
@@ -921,22 +764,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id"
add_index "tokens", ["value"], :name => "tokens_value", :unique => true
- create_table "tprojects", :force => true do |t|
- t.string "name", :limit => 1000, :default => "0"
- t.text "description", :limit => 16777215
- t.string "commit_count", :limit => 100, :default => "0"
- t.string "code_line", :limit => 100
- t.string "last_commit_time", :limit => 100
- t.string "url", :limit => 1000
- t.datetime "date_collected"
- t.string "created_at", :limit => 100
- t.string "updated_at", :limit => 100
- t.integer "proj_id", :null => false
- t.string "user_count", :limit => 100
- end
-
- add_index "tprojects", ["proj_id"], :name => "proj_id"
-
create_table "trackers", :force => true do |t|
t.string "name", :limit => 30, :default => "", :null => false
t.boolean "is_in_chlog", :default => false, :null => false
@@ -962,6 +789,7 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
t.string "teacher_realname"
t.string "student_realname"
t.string "location_city"
+ t.integer "school_id"
end
create_table "user_grades", :force => true do |t|
@@ -985,19 +813,6 @@ ActiveRecord::Schema.define(:version => 20140413022725) do
add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id"
- create_table "user_scores", :force => true do |t|
- t.integer "user_id", :null => false
- t.integer "collaboration"
- t.integer "influence"
- t.integer "skill"
- t.integer "active"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "level"
- t.integer "file"
- t.integer "issue"
- end
-
create_table "user_statuses", :force => true do |t|
t.integer "changesets_count"
t.integer "watchers_count"
diff --git a/lib/redmine.rb b/lib/redmine.rb
index 0ede4d1d8..2c935074b 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/lib/tasks/rubyzip.rake b/lib/tasks/rubyzip.rake
new file mode 100644
index 000000000..349ced29b
--- /dev/null
+++ b/lib/tasks/rubyzip.rake
@@ -0,0 +1,38 @@
+desc "nyan ruby zip operation"
+task :zip do
+ puts "input rake zip:clean_tmp will removed tmp/*.zip ."
+end
+
+namespace :zip do
+ desc "ruby zip sweeper"
+ task :clean_tmp do
+ unless File.exist?(Dir.pwd+"/tmp/archiveZip")
+ puts "tmp/archiveZip folder is not exist. "
+ next
+ end
+
+ puts "ruby zip sweeping..."
+ Dir.chdir('tmp/archiveZip') do
+ Dir['*'].select do |file|
+ if file =~ /archive_\d+\.zip/
+ File.delete(file)
+ puts "#{file} is deleted."
+ end
+ end
+ end
+ puts "ruby zip sweeping is done."
+ end
+end
+
+desc "create tmp file, to test"
+file 'tmp/test.yml' do
+ require 'yaml'
+ var = {
+ :name => "name",
+ :age => "age",
+ :agent => "agent"
+ }
+ File.open('tmp/test.yml', 'w') do |f|
+ f.write YAML.dump({'conf' => var })
+ end
+end
\ No newline at end of file
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/images/android_0.jpg b/public/images/android_0.jpg
new file mode 100644
index 000000000..6aadab331
Binary files /dev/null and b/public/images/android_0.jpg differ
diff --git a/public/images/footer_logo/buaa_scse.png b/public/images/footer_logo/buaa_scse.png
new file mode 100644
index 000000000..c224a5668
Binary files /dev/null and b/public/images/footer_logo/buaa_scse.png differ
diff --git a/public/images/footer_logo/inforbus.png b/public/images/footer_logo/inforbus.png
new file mode 100644
index 000000000..ba1ce65f9
Binary files /dev/null and b/public/images/footer_logo/inforbus.png differ
diff --git a/public/images/footer_logo/iscas.png b/public/images/footer_logo/iscas.png
new file mode 100644
index 000000000..f3cbac371
Binary files /dev/null and b/public/images/footer_logo/iscas.png differ
diff --git a/public/images/footer_logo/nudt.png b/public/images/footer_logo/nudt.png
new file mode 100644
index 000000000..68ff07fe0
Binary files /dev/null and b/public/images/footer_logo/nudt.png differ
diff --git a/public/images/footer_logo/peking_eecs.png b/public/images/footer_logo/peking_eecs.png
new file mode 100644
index 000000000..6c7164f08
Binary files /dev/null and b/public/images/footer_logo/peking_eecs.png 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/javascripts/attachments.js b/public/javascripts/attachments.js
index 7b8394fe8..3d1520f84 100644
--- a/public/javascripts/attachments.js
+++ b/public/javascripts/attachments.js
@@ -7,14 +7,14 @@ function addFile(inputEl, file, eagerUpload) {
var attachmentId = addFile.nextAttachmentId++;
- var fileSpan = $('', { id: 'attachments_' + attachmentId });
+ var fileSpan = $('', { 'id': 'attachments_' + attachmentId, 'class':'attachment' });
fileSpan.append(
- $(' ', { type: 'text', 'class': 'filename readonly', name: 'attachments[' + attachmentId + '][filename]', readonly: 'readonly'} ).val(file.name),
- $(' ', { type: 'text', 'class': 'description', name: 'attachments[' + attachmentId + '][description]', maxlength: 255, placeholder: $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload),
- $('  ').attr({ href: "#", 'class': 'remove-upload', 'data-confirm' : "您确定要删除吗?" }).click(removeFile).toggle(!eagerUpload)
+ $(' ', { 'type': 'text', 'class': 'filename readonly', 'name': 'attachments[' + attachmentId + '][filename]', 'readonly': 'readonly'} ).val(file.name),
+ $(' ', { 'type': 'text', 'class': 'description', 'name': 'attachments[' + attachmentId + '][description]', 'maxlength': 255, 'placeholder': $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload),
+ $('  ').attr({ 'href': "#", 'class': 'remove-upload', 'data-confirm' : "您确定要删除吗?" }).click(removeFile).toggle(!eagerUpload)
).appendTo('#attachments_fields');
-
+
if(eagerUpload) {
ajaxUpload(file, attachmentId, fileSpan, inputEl);
}
@@ -63,6 +63,22 @@ function ajaxUpload(file, attachmentId, fileSpan, inputEl) {
}
form.dequeue('upload');
});
+
+ //gcm files count and add delete_all link
+
+ var count=$('#attachments_fields>span').length;
+ $('#upload_file_count').html("已上传"+""+count+" "+"个文件");
+
+ if(count>=1){
+ var add_attachs=$('.add_attachment');
+ var delete_all=$('.remove_all');
+ if(delete_all.length<1){
+ add_attachs.append($("  ").attr({"href":"javascript:void(0)", 'class': 'remove_all',"onclick": "removeAll()"}));
+ }
+ }
+
+ //gcm
+
}
var progressSpan = $('').insertAfter(fileSpan.find('input.filename'));
@@ -84,6 +100,16 @@ function removeFile() {
return false;
}
+//gcm delete all file
+function removeAll(){
+ if(confirm("您确定要删除所有文件吗?")){
+ $(".remove-upload").removeAttr("data-confirm");
+ $(".remove-upload").click();
+ }
+// return false;
+}
+//gcm
+
function uploadBlob(blob, uploadUrl, attachmentId, options) {
var actualOptions = $.extend({
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index e60316841..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;
@@ -1727,7 +1735,7 @@ ul.properties li span {font-style:italic;}
/*end*/
.autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
-#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 60%; }
+/*#user_login, #user_firstname, #user_lastname, #user_mail, #my_account_form select, #user_form select, #user_identity_url { width: 45%; }*/
#workflow_copy_form select { width: 200px; }
table.transitions td.enabled {background: #bfb;}
@@ -1821,6 +1829,11 @@ span.required {color: #bb0000;}
a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block; padding-left:16px;}
a.remove-upload:hover {text-decoration:none !important;}
+/*gcm upload file count and deleteall*/
+#upload_file_count #count {color:red; font-size:1.5em;}
+span.add_attachment .remove_all {background:none;background: url(../images/delete.png) no-repeat 1px 50%; width:1px; display:inline-block;position:absolute;right:21px;text-decoration:none;}
+
+
div.fileover { background-color: lavender; }
div.attachments { margin-top: 12px; }
@@ -2693,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/public/themes/redpenny-master/stylesheets/application.css b/public/themes/redpenny-master/stylesheets/application.css
index c68e36cd7..748b8aab4 100644
--- a/public/themes/redpenny-master/stylesheets/application.css
+++ b/public/themes/redpenny-master/stylesheets/application.css
@@ -456,6 +456,7 @@ ul.projects li.root
width:auto;
float:center;
min-height:800px;
+ border: 1px solid #ffffff;
}
/*by huang*/
@@ -541,13 +542,13 @@ ul.projects li.root
#footer a:hover
{
- background:#666 none repeat scroll 0 0;
- color:#FFF!important
+ /*background:#666 none repeat scroll 0 0;*/
+ /*color:#FFF!important*/
}
#footer a:link,#footer a:visited
{
- color:#666
+ /*color:#666*/
}
#footer .bgr:after
@@ -981,7 +982,8 @@ hr
}
p
{
- font-size: 13px
+ font-size: 13px;
+ position:relative;/*gcm*/
}
/*end*/
div.issue
@@ -1906,6 +1908,10 @@ input[type="submit"], .button_submit {
text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2), 0px 1px 0px rgb(255, 255, 255);
cursor: pointer;
}
+.button_submit_font_white{
+ color: white !important ;
+ font-weight: 400;
+}
input[type="button-submit"] {
padding-bottom: 5px;
@@ -2228,4 +2234,17 @@ ul.messages-for-user-reply li {
}
.sub_menu li{
width: 90%;
-}
\ No newline at end of file
+}
+
+/*gcm*/
+.footer_logo_link{
+ margin:5px;
+}
+#copyright,#contact_us,#record{
+ margin-left:20px;
+}
+
+/*.footer_text_link{
+ margin-left:20px;
+}*/
+/*gcm*/
\ No newline at end of file
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/functional/zipdown_controller_test.rb b/test/functional/zipdown_controller_test.rb
new file mode 100644
index 000000000..f74dcc1c0
--- /dev/null
+++ b/test/functional/zipdown_controller_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class ZipdownControllerTest < ActionController::TestCase
+ # test "the truth" do
+ # assert true
+ # 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/helpers/zipdown_helper_test.rb b/test/unit/helpers/zipdown_helper_test.rb
new file mode 100644
index 000000000..ca30cb362
--- /dev/null
+++ b/test/unit/helpers/zipdown_helper_test.rb
@@ -0,0 +1,4 @@
+require 'test_helper'
+
+class ZipdownHelperTest < 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