From 272be122e548e57c667f11346504696bdb1b575d Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Thu, 3 Apr 2014 16:46:22 +0800 Subject: [PATCH 01/94] =?UTF-8?q?=E6=8C=89=E6=97=B6=E9=97=B4=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/files_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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' From 120e84cfc794eeed84bef0b2867d4f743745a264 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Thu, 3 Apr 2014 17:26:56 +0800 Subject: [PATCH 02/94] =?UTF-8?q?=E6=96=B0=E7=AB=9E=E8=B5=9B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/praise_tread_controller.rb | 2 + app/controllers/projects_controller.rb | 3 + app/controllers/users_controller.rb | 27 ++- app/controllers/welcome_controller.rb | 4 +- app/controllers/words_controller.rb | 4 + app/helpers/application_helper.rb | 46 +++- app/helpers/watchers_helper.rb | 59 ++++- app/models/project.rb | 1 + app/models/user.rb | 2 + app/views/welcome/contest.html.erb | 240 ++++++++++++++++++++- app/views/words/destroy.js.erb | 2 +- config/locales/zh.yml | 13 ++ config/routes.rb | 22 ++ lib/redmine.rb | 10 + 14 files changed, 424 insertions(+), 11 deletions(-) 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..81135865d 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 @@ -567,6 +569,7 @@ class ProjectsController < ApplicationController "show_messages" => true, "show_news" => true, "show_bids" => true, + "show_contests" => true, "show_journals_for_messages" => true } @date_to ||= Date.today + 1 diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 5fcac2d59..e9e649181 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 diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 904920c5a..d35be75d2 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -81,7 +81,7 @@ class WelcomeController < ApplicationController end def contest - + end def search @@ -120,7 +120,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..416b40db0 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -190,6 +190,8 @@ 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) else raise 'create reply obj unknow type.' end @@ -204,6 +206,8 @@ 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 else raise 'create reply obj unknow type.' end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6047fcf2b..c606d0535 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1410,6 +1410,50 @@ 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_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_fans_picture(obj) + html = '' + if obj.watcher_users.count == 0 + html << (content_tag "span", l(:label_project_no_follow)) + else + obj.watcher_users.take(12).each do |user| + html << (link_to image_tag(url_to_avatar(user), :class => "avatar"), user_path(user), :class => "avatar", :title => user.name) + end + end + html.html_safe + end #display fans picture def show_more_fans?(obj) @@ -1500,7 +1544,7 @@ module ApplicationHelper courses_link = link_to l(:label_course_practice), {:controller => 'projects', :action => 'course', :project_type => 1, :host => Setting.course_domain} projects_link = link_to l(:label_project_deposit), {:controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain} users_link = link_to l(:label_software_user), {:controller => 'users', :action => 'index', :host => Setting.user_domain} - contest_link = link_to l(:label_contest_innovate), {:controller => 'bids', :action => 'contest', :project_type => 1 , :host => Setting.contest_domain} + contest_link = link_to l(:label_contest_innovate), {:controller => 'contests', :action => 'index'} bids_link = link_to l(:label_requirement_enterprise), {:controller => 'bids', :action => 'index'} forum_link = link_to l(:label_project_module_forums), {:controller => "forums", :action => "index"} stores_link = link_to l(:label_stores_index), {:controller => 'stores', :action=> 'index'} 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/models/project.rb b/app/models/project.rb index fd576b637..0f68d3ab2 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/user.rb b/app/models/user.rb index 4042fd84f..8c867512e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -78,11 +78,13 @@ 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 ##ended by xianbo #####fq has_many :jours, :class_name => 'JournalsForMessage', :dependent => :destroy has_many :bids, :foreign_key => 'author_id', :dependent => :destroy + has_many :contests, :foreign_key => 'author_id', :dependent => :destroy has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :new_jours, :as => :jour, :class_name => 'JournalsForMessage', :conditions => "status=1" has_many :journal_replies, :dependent => :destroy diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 6a0a8413f..a343f2ea2 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -1,8 +1,244 @@ +<%= stylesheet_link_tag 'welcome' %> + + + +
-
- 正在升级中。。。。。。。。。。。。 + +
+
+ <%= l(:label_welcome_trustie) %><%= l(:label_welcome_trustie_contest) %> , <%= l(:label_welcome_trustie_contest_description) %> +
+ +
+ +
+ +
+

热门项目

+ <%= link_to "更多>>", { :controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain}, :target => "_blank" %> +
+
    + <% find_miracle_project(10, 3).map do |project| %> +
  • +
    + <%= image_tag(get_project_avatar(project), :class => "avatar-4") %> +
    + +
    + <%= link_to( project.name, project_path(project.id), :class => "d-g-blue d-p-project-name",:title => "#{project.name}" )%> + (<%= link_to "#{projectCount(project)}人", project_member_path(project) ,:course =>'0' %>) +
    +
    + ><%=project.description.truncate(50, omission: '...')%> +
    +
    + <%= content_tag "span", show_grade(project), + :style => "cursor: pointer; display: inline-block; float: right; color: #ec6300; ", + :title => "项目得分,综合考虑了项目的各项活动,反映了该项目的活跃程度", + :class => "tooltip", + :id => "tooltip-#{project.id}" %> +

    +
    +
  • + <% end; reset_cycle %> +
+
+
+ +
+
    +

    用户动态

    + <%= link_to "更多>>", { :controller => 'users', :action => 'index'}, :target => "_blank" %> +
    + <% find_all_activities.each do |event| %> +
  • +
    + <%= image_tag url_to_avatar(event.event_author), :class => "avatar-3" %> +
    + +
    + <%= link_to event.event_author, (user_path(event.event_author) if event.event_author), :style => "color:green;", :target => "_blank" %><%= show_user_content event %> +

    <%= l(:field_updated_on) %><%= time_tag_welcome event.event_datetime %>前     <%= show_event_reply event %>

    +
    +
  • + <% end %> +
    +
+
+ +
+
    +
    +

    + 贴吧动态 + <%= 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(7).each do |topic|%> +
  • +
    +       + <%= link_to topic.subject.truncate(30, omission: '...'), topic.event_url, :class => "gray" , :style => "font-size: 10pt !important;", :target => "_blank" %> + +
    + <%= 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);", :target => "_blank" %> 发表 + + 回复(<%= link_to (topic.parent ? topic.parent.replies_count : topic.replies_count), topic.event_url, :target => "_blank" %>) +
    +
  • + <% end %> +
    +
+
+ + + + + + + + +
+
+ + +






diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb index c583e0449..d3f3acc91 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'].include? @journal_destroyed.jour_type)%> var destroyedItem = $('#word_li_<%=@journal_destroyed.id%>') destroyedItem.fadeOut(600,function(){ destroyedItem.remove(); diff --git a/config/locales/zh.yml b/config/locales/zh.yml index a006ae53c..e2b69082d 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1549,8 +1549,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: 作业 @@ -1811,3 +1813,14 @@ 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_application: 参赛应用 diff --git a/config/routes.rb b/config/routes.rb index 8ad29472b..e72f83aca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,28 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do + ## 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 'update_contest' , via: [:put] + match 'show_contest' , via: :get + match 'show_project' , via: :get + match 'show_application' , via: :get + match 'show_participator' , via: :get + match 'add' , via: [:get, :post] + match 'create' , via: :post + match 'settings' , via: [:get, :post] + end + end + resources :stores do collection do match 'search', via: [:get, :post] diff --git a/lib/redmine.rb b/lib/redmine.rb index 0f8b3acc3..cce178a55 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_application_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 From 1e7e0a1bb54cdd0d198aad32ae97148c1a21684c Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Thu, 3 Apr 2014 22:15:19 +0800 Subject: [PATCH 03/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E7=AB=9E=E8=B5=9B=E5=92=8C=E9=80=80=E5=87=BA=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=E6=96=B0=E5=BB=BA=E9=A1=B9=E7=9B=AE=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= =?UTF-8?q?=E7=AB=9E=E8=B5=9B=E5=88=97=E8=A1=A8=E5=92=8C=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=90=9C=E7=B4=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/bids_controller.rb | 10 +++++----- app/controllers/welcome_controller.rb | 4 ++-- app/views/welcome/contest.html.erb | 8 +++++--- config/locales/zh.yml | 3 +++ config/routes.rb | 2 +- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index 32878a2cd..ebe8342d4 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -461,22 +461,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/welcome_controller.rb b/app/controllers/welcome_controller.rb index d35be75d2..a7b3b421a 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -81,7 +81,7 @@ class WelcomeController < ApplicationController end def contest - + end def search @@ -120,7 +120,7 @@ class WelcomeController < ApplicationController def entry_select_contest if request.original_url.match(/contest\.trustie\.net/) contest - render :contest + render :contest return 0 end end diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index a343f2ea2..222ff7dc6 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -100,13 +100,15 @@
<%= l(:label_welcome_trustie) %><%= l(:label_welcome_trustie_contest) %> , <%= l(:label_welcome_trustie_contest_description) %>
-
- +
diff --git a/config/locales/zh.yml b/config/locales/zh.yml index e2b69082d..448690b46 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1824,3 +1824,6 @@ zh: label_participate: 参赛者 label_contest_project: 参赛项目 label_contest_application: 参赛应用 + button_contesting_as_project: 我要参赛(新建项目) + button_contesting_as_application: 我要参赛(发布应用) + diff --git a/config/routes.rb b/config/routes.rb index e72f83aca..7a782449b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -560,7 +560,7 @@ RedmineApp::Application.routes.draw do match 'calls', :controller => 'bids', :action => 'index' match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond' - match 'contest', :controller => 'bids', :action => 'contest', :as => 'contest' + match 'contest', :controller => 'bids', :action => 'contests', :as => 'contest' #modified @20140403 ######added by nie match 'tags/show_projects_tags',:to => 'tags#show_projects_tags' From 2a278e0a2d7fbb0c46ba71b176c023a41fcd9f35 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Thu, 3 Apr 2014 22:38:18 +0800 Subject: [PATCH 04/94] all --- app/controllers/contests_controller.rb | 428 ++++++++++++++++++ app/helpers/contests_helper.rb | 158 +++++++ app/models/contest.rb | 117 +++++ app/models/contesting_project.rb | 51 +++ app/models/join_in_competition.rb | 10 + app/views/contests/_application_list.html.erb | 15 + app/views/contests/_contest_list.html.erb | 49 ++ app/views/contests/_form_contest.html.erb | 36 ++ app/views/contests/_history.html.erb | 53 +++ app/views/contests/_list_projects.html.erb | 102 +++++ app/views/contests/_new.html.erb | 53 +++ app/views/contests/_new_join.html.erb | 57 +++ app/views/contests/_pre_show.html.erb | 13 + app/views/contests/_project_list.html.erb | 15 + app/views/contests/_set_join.js.erb | 8 + app/views/contests/add.js.erb | 4 + app/views/contests/back.js.erb | 2 + app/views/contests/create.js.erb | 4 + app/views/contests/destroy.js.erb | 2 + app/views/contests/index.html.erb | 38 ++ app/views/contests/more.js.erb | 2 + app/views/contests/new.js.erb | 5 + app/views/contests/new_contest.html.erb | 10 + app/views/contests/new_join.js.erb | 3 + app/views/contests/set_reward.js.erb | 31 ++ app/views/contests/settings.html.erb | 30 ++ app/views/contests/show_application.html.erb | 67 +++ app/views/contests/show_contest.html.erb | 34 ++ app/views/contests/show_contest_user.html.erb | 30 ++ app/views/contests/show_participator.html.erb | 71 +++ app/views/contests/show_project.html.erb | 99 ++++ app/views/layouts/base_newcontest.html.erb | 264 +++++++++++ db/migrate/20140327071420_create_contests.rb | 15 + ...140327073052_create_contesting_projects.rb | 12 + ...ge_created_at_of_contests_to_created_on.rb | 11 + ...21611_add_reward_to_contesting_projects.rb | 5 + ...40402023357_create_join_in_competitions.rb | 10 + 37 files changed, 1914 insertions(+) create mode 100644 app/controllers/contests_controller.rb create mode 100644 app/helpers/contests_helper.rb create mode 100644 app/models/contest.rb create mode 100644 app/models/contesting_project.rb create mode 100644 app/models/join_in_competition.rb create mode 100644 app/views/contests/_application_list.html.erb create mode 100644 app/views/contests/_contest_list.html.erb create mode 100644 app/views/contests/_form_contest.html.erb create mode 100644 app/views/contests/_history.html.erb create mode 100644 app/views/contests/_list_projects.html.erb create mode 100644 app/views/contests/_new.html.erb create mode 100644 app/views/contests/_new_join.html.erb create mode 100644 app/views/contests/_pre_show.html.erb create mode 100644 app/views/contests/_project_list.html.erb create mode 100644 app/views/contests/_set_join.js.erb create mode 100644 app/views/contests/add.js.erb create mode 100644 app/views/contests/back.js.erb create mode 100644 app/views/contests/create.js.erb create mode 100644 app/views/contests/destroy.js.erb create mode 100644 app/views/contests/index.html.erb create mode 100644 app/views/contests/more.js.erb create mode 100644 app/views/contests/new.js.erb create mode 100644 app/views/contests/new_contest.html.erb create mode 100644 app/views/contests/new_join.js.erb create mode 100644 app/views/contests/set_reward.js.erb create mode 100644 app/views/contests/settings.html.erb create mode 100644 app/views/contests/show_application.html.erb create mode 100644 app/views/contests/show_contest.html.erb create mode 100644 app/views/contests/show_contest_user.html.erb create mode 100644 app/views/contests/show_participator.html.erb create mode 100644 app/views/contests/show_project.html.erb create mode 100644 app/views/layouts/base_newcontest.html.erb create mode 100644 db/migrate/20140327071420_create_contests.rb create mode 100644 db/migrate/20140327073052_create_contesting_projects.rb create mode 100644 db/migrate/20140327082704_change_created_at_of_contests_to_created_on.rb create mode 100644 db/migrate/20140401121611_add_reward_to_contesting_projects.rb create mode 100644 db/migrate/20140402023357_create_join_in_competitions.rb diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb new file mode 100644 index 000000000..39e9a2053 --- /dev/null +++ b/app/controllers/contests_controller.rb @@ -0,0 +1,428 @@ +# fq +# class BidsController < ApplicationController +class ContestsController < ApplicationController + menu_item :respond + menu_item :project, :only => :show_project + menu_item :application, :only => :show_application + before_filter :find_contest, :only => [:show_contest, :show_project, :show_application, :create,:destroy,:more,:back,:add,: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_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 = [] + @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 + respond_to do |format| + format.html { + render :layout => 'base_newcontest' + } + format.api + end + end + ############ + ##显示参赛的应用 + def show_application + 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 = @contest.contesting_projects + + 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/helpers/contests_helper.rb b/app/helpers/contests_helper.rb new file mode 100644 index 000000000..e13641b1d --- /dev/null +++ b/app/helpers/contests_helper.rb @@ -0,0 +1,158 @@ +#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 + + # def sort_bid(state, project_type) + # content = ''.html_safe + # case state + # when 0 + # content << content_tag('li', link_to(l(:label_sort_by_active), calls_path(:bid_sort_type => '1', :project_type => project_type))) + # content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:bid_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(:bid_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected") + # content << content_tag('li', link_to(l(:label_sort_by_time), calls_path(:bid_sort_type => '0', :project_type => project_type))) + # end + # content = content_tag('ul', content) + # content_tag('div', content, :class => "tabs") + # end + + #huang + def sort_contest(state) + content = ''.html_safe + case state + when 0 + content << content_tag('li', link_to(l(:label_sort_by_active), contest_path(:contest_sort_type => '1'))) + content << content_tag('li', link_to(l(:label_sort_by_time), contest_path(:contest_sort_type => '0'), :class=>"selected"), :class=>"selected") + + when 1 + content << content_tag('li', link_to(l(:label_sort_by_active), contest_path(:contest_sort_type => '1'), :class=>"selected"), :class=>"selected") + content << content_tag('li', link_to(l(:label_sort_by_time), contest_path(:contest_sort_type => '0'))) + end + content = content_tag('ul', content) + content_tag('div', content, :class => "tabs") + end + #end + + # def course_options_for_select(courses) + # # + # html = '' + # courses.each do |course| + # 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_user + contests = Contest.find(:id) + @users = [] + for contest in contests + for project in contest.projects + @users += project.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 + +end \ No newline at end of file diff --git a/app/models/contest.rb b/app/models/contest.rb new file mode 100644 index 000000000..a4427d24c --- /dev/null +++ b/app/models/contest.rb @@ -0,0 +1,117 @@ +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 :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..773c04c68 --- /dev/null +++ b/app/models/contesting_project.rb @@ -0,0 +1,51 @@ +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/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/views/contests/_application_list.html.erb b/app/views/contests/_application_list.html.erb new file mode 100644 index 000000000..081a9f4de --- /dev/null +++ b/app/views/contests/_application_list.html.erb @@ -0,0 +1,15 @@ + +<%= render_flash_messages %> + + + + <% if User.current.logged? %> + + <% end %> +
<%= l(:label_bidding_project) %> +
+ <%= toggle_link l(:button_contesting_as_project), 'put-bid-form' %> +
+
+ +<%#= render :partial=> "list_projects" %> diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb new file mode 100644 index 000000000..cdc390410 --- /dev/null +++ b/app/views/contests/_contest_list.html.erb @@ -0,0 +1,49 @@ + +<% contests.each do |contest|%> + + + + + +
<%= link_to(image_tag(url_to_avatar(contest.author), :class => 'avatar'), user_path(contest.author), :class => "avatar") %> + + + + + + + + + + + +
<%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>:  <%= link_to(contest.name, show_contest_contest_path(contest), :class => 'bid_path') %>
+ + + + + + + + + +
+ <%= l(:label_contests_reward_method) %><%= contest.budget%> +
<%= l(:label_x_biding_project, :count => contest.contesting_projects.count) %>(<%= link_to contest.contesting_projects.count %>) + <%= l(:label_x_bids_responses, :count => contest.commit) %>(<%= link_to contest.commit, respond_path(contest) %>) + <%= l(:label_x_followers, :count => contest.watcher_users.count) %>(<%= link_to contest.watcher_users.count, respond_path(contest) %>) +
<%= l :label_create_time %>: <%= format_time contest.created_on %>
+
+ + + + +
<%= contest.description%>
+
+<% end %> + + diff --git a/app/views/contests/_form_contest.html.erb b/app/views/contests/_form_contest.html.erb new file mode 100644 index 000000000..5dc824d28 --- /dev/null +++ b/app/views/contests/_form_contest.html.erb @@ -0,0 +1,36 @@ + + +<%= error_messages_for 'contest' %> + +

<%= l(:label_bids_form_contest_new_description) %>

+

<%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Contest::NAME_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_name)}" %>

+ +

<%= f.text_area :description, :rows => 8, :class => 'wiki-edit', :style => "font-size:small;width:490px;margin-left:10px;", :maxlength => Contest::DESCRIPTION_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_description)}" %>

+ +

<%= f.text_field :password, :size => 60, :style => "width:488px;margin-left: 10px;" %>

+ +

+ <%= f.text_field :budget, :required => true, :size => 60, :style => "width:350px;", :placeholder => l(:label_bids_reward_what) %> + + +

+ +

<%= f.text_field :deadline, :required => true, :size => 60, :style => "width:150px;", :placeholder => "#{l(:label_deadline)}" %><%= calendar_for('contest_deadline')%>

diff --git a/app/views/contests/_history.html.erb b/app/views/contests/_history.html.erb new file mode 100644 index 000000000..6be572c65 --- /dev/null +++ b/app/views/contests/_history.html.erb @@ -0,0 +1,53 @@ +<% reply_allow = JournalsForMessage.create_by_user? User.current %> +<% tip1 = l(:label_user_response) %> +

<%=tip1%>

+ +
+ <%= render :partial => 'new', :locals => {:contest => @contest, :sta => @state} %> +
+ + +<% if journals.size >0 %> +
    + <% for journal in journals%> +
  • + <%= image_tag(url_to_avatar(journal.user), :class => "avatar") %> + + <%= link_to journal.user, user_path(journal.user)%> + <% label = l(:label_contest_requirement) %> +
    <%= textilizable journal.notes%>
    + <%= l(:label_bids_published) %> <%= time_tag(journal.created_on).html_safe %> <%= l(:label_bids_published_ago) %> + + <% ids = 'project_respond_form_'+ journal.id.to_s%> + + + <% if reply_allow %> + <%#= link_to(l(:button_quote), {:controller => 'contests', :action => 'new', :id => contest, :journal_id => journal}, :remote => true, :method => 'post', :title => l(:button_quote))%> + <%= link_to(l(:button_quote), contests_path(:id => contest, :journal_id => journal), :remote => true, :method => 'post', :title => l(:button_quote))%> + <%= link_to l(:label_bid_respond_quote),'', + {:focus => 'project_respond', :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea'), '#{l(:label_reply_plural)} #{journal.user.show_name}: '); $('##{ids} textarea') ;return false;"}%> + <% end %> + + <% if @user==User.current|| User.current.admin? %> + <%#= link_to(l(:label_bid_respond_delete), {:controller => 'bids', :action => 'destroy', :object_id => journal, :id => bid},:confirm => l(:label_delete_confirm), + :remote => true, :method => 'delete', :class => "delete", :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %> + <%= link_to(l(:label_bid_respond_delete), {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %> + <% end %> + +
    + +
    + <% ids = 'project_respond_form_'+ journal.id.to_s%> + <% if reply_allow %> +
    + <%= render :partial => 'words/new_respond', :locals => {:journal => journal, :m_reply_id => journal} %> +
    + <% end %> +
    +
    + <%= render :partial => "words/journal_reply", :locals => {:journal => journal } %> +
    +
  • + <% end %> +
+<% end %> diff --git a/app/views/contests/_list_projects.html.erb b/app/views/contests/_list_projects.html.erb new file mode 100644 index 000000000..6a778819d --- /dev/null +++ b/app/views/contests/_list_projects.html.erb @@ -0,0 +1,102 @@ + +<% 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/_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 %> + + + + <% if User.current.logged? %> + + <% end %> +
<%= l(:label_bidding_project) %>(<%= contesting_project.count%>) +
+ <%= toggle_link l(:button_contesting_as_project), 'put-bid-form' %> +
+
+ +<%= 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/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/back.js.erb b/app/views/contests/back.js.erb new file mode 100644 index 000000000..d806c1481 --- /dev/null +++ b/app/views/contests/back.js.erb @@ -0,0 +1,2 @@ +$('#history').html('<%= escape_javascript(render(:partial => 'history', :locals => {:contest => @contest, :journals => @jour, :state => @state})) %>'); +$('#contest_message_reference_user_id').val(""); \ No newline at end of file diff --git a/app/views/contests/create.js.erb b/app/views/contests/create.js.erb new file mode 100644 index 000000000..9246d939c --- /dev/null +++ b/app/views/contests/create.js.erb @@ -0,0 +1,4 @@ +$('#history').html('<%= escape_javascript(render(:partial => 'contests/history', :locals => {:contest => @contest, :journals => @jour, :state => true})) %>'); +$('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => nil})) %>'); +$('#contest_message_message').val(""); +$('#contest_message_reference_user_id').val(""); diff --git a/app/views/contests/destroy.js.erb b/app/views/contests/destroy.js.erb new file mode 100644 index 000000000..a2f0fb2da --- /dev/null +++ b/app/views/contests/destroy.js.erb @@ -0,0 +1,2 @@ +$('#history').html('<%= escape_javascript(render(:partial => 'history', :locals => {:contest => @contest, :journals => @jour, :state => false})) %>'); +$('#contest_message_reference_user_id').val(""); \ No newline at end of file diff --git a/app/views/contests/index.html.erb b/app/views/contests/index.html.erb new file mode 100644 index 000000000..3a7bde1e5 --- /dev/null +++ b/app/views/contests/index.html.erb @@ -0,0 +1,38 @@ +
+ <%= form_tag({:controller => 'contests', :action => 'index'}, :method => :get) do %> + + + + + + + + + + + +
<%= l(:label_contest_innovate) %><%= l(:label_user_location) %> : + <% if User.current.logged? %> + <% unless User.current.user_extensions.identity == 1 %> + <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add') %> + <% end %> + <% end %> + + +
<%= 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_application.html.erb b/app/views/contests/show_application.html.erb new file mode 100644 index 000000000..da06a7cb0 --- /dev/null +++ b/app/views/contests/show_application.html.erb @@ -0,0 +1,67 @@ + + + + + + <% if User.current.logged? %> + + + + <% end %> +
+ <%= render :partial => 'application_list' %> +
+ 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..f43d5048e --- /dev/null +++ b/app/views/contests/show_project.html.erb @@ -0,0 +1,99 @@ + + + + + + <% if User.current.logged? %> + + + + <% end %> +
+ <%= render :partial => 'project_list', :locals => {:contesting_project => @contesting_project,:contest => @contest} %> +
+ diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb new file mode 100644 index 000000000..1b3a99966 --- /dev/null +++ b/app/views/layouts/base_newcontest.html.erb @@ -0,0 +1,264 @@ +<% @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) %> : + +
<%=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'%> +
+
+
+ + + + +
+ <%= call_hook :view_layouts_base_body_bottom %> + + 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 From 8fb185681ab13f0622302c8bfa2525d17bfbc992 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 4 Apr 2014 09:38:31 +0800 Subject: [PATCH 05/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2=E8=AF=B4=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/contests/_application_list.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/contests/_application_list.html.erb b/app/views/contests/_application_list.html.erb index 081a9f4de..4d79e1251 100644 --- a/app/views/contests/_application_list.html.erb +++ b/app/views/contests/_application_list.html.erb @@ -6,7 +6,7 @@ <% if User.current.logged? %>
- <%= toggle_link l(:button_contesting_as_project), 'put-bid-form' %> + <%= toggle_link l(:button_contesting_as_application), 'put-bid-form' %>
<% end %> From c86af5f483e66f624ebdeb89f4650f796526a1bb Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 4 Apr 2014 11:17:50 +0800 Subject: [PATCH 06/94] =?UTF-8?q?=E4=B8=8Eshow=5Fapplication=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E6=89=80=E6=9C=89=E5=86=85=E5=AE=B9=E6=94=B9?= =?UTF-8?q?=E4=B8=BAshow=5Fsoftapplication=EF=BC=8C=E4=BB=A5=E9=98=B2?= =?UTF-8?q?=E5=92=8C=E7=B3=BB=E7=BB=9F=E4=B8=AD=E7=9A=84application?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/contests_controller.rb | 6 +- app/views/contests/_application_list.html.erb | 15 -- app/views/contests/show_application.html.erb | 67 ------- app/views/layouts/base_newcontest.html.erb | 2 +- app/views/welcome/contest.html.erb | 2 +- config/routes.rb | 5 +- db/schema.rb | 175 +++++++++++------- lib/redmine.rb | 2 +- 8 files changed, 118 insertions(+), 156 deletions(-) delete mode 100644 app/views/contests/_application_list.html.erb delete mode 100644 app/views/contests/show_application.html.erb diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index 39e9a2053..f65686628 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -3,8 +3,8 @@ class ContestsController < ApplicationController menu_item :respond menu_item :project, :only => :show_project - menu_item :application, :only => :show_application - before_filter :find_contest, :only => [:show_contest, :show_project, :show_application, :create,:destroy,:more,:back,:add,:new,:show_results, :set_reward, + menu_item :application, :only => :show_softapplication + before_filter :find_contest, :only => [:show_contest, :show_project, :show_softapplication, :create,:destroy,:more,:back,:add,: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 @@ -218,7 +218,7 @@ class ContestsController < ApplicationController end ############ ##显示参赛的应用 - def show_application + def show_softapplication respond_to do |format| format.html { render :layout => 'base_newcontest' diff --git a/app/views/contests/_application_list.html.erb b/app/views/contests/_application_list.html.erb deleted file mode 100644 index 4d79e1251..000000000 --- a/app/views/contests/_application_list.html.erb +++ /dev/null @@ -1,15 +0,0 @@ - -<%= render_flash_messages %> - - - - <% if User.current.logged? %> - - <% end %> -
<%= l(:label_bidding_project) %> -
- <%= toggle_link l(:button_contesting_as_application), 'put-bid-form' %> -
-
- -<%#= render :partial=> "list_projects" %> diff --git a/app/views/contests/show_application.html.erb b/app/views/contests/show_application.html.erb deleted file mode 100644 index da06a7cb0..000000000 --- a/app/views/contests/show_application.html.erb +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - <% if User.current.logged? %> - - - - <% end %> -
- <%= render :partial => 'application_list' %> -
- diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index 1b3a99966..f41969ea4 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -92,7 +92,7 @@ <%=link_to "#{@contest.projects.where('is_public=1').count}", :controller => 'contests', :action => 'show_project' %> - <%=link_to "#{@contest.projects.where('is_public=1').count}", :controller => 'contests', :action => 'show_application' %> + <%=link_to "#{@contest.projects.where('is_public=1').count}", :controller => 'contests', :action => 'show_softapplication' %> <%= l(:label_participate) %> diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 222ff7dc6..cbc035b42 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -112,7 +112,7 @@
-

热门项目

+

热门项目

<%= link_to "更多>>", { :controller => 'projects', :action => 'index', :project_type => 0, :host => Setting.project_domain}, :target => "_blank" %>
    diff --git a/config/routes.rb b/config/routes.rb index 7a782449b..181ecb0e0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,9 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do + resources :softapplications + + ## new added by linchun #新竞赛相关 resources :contests, only: [:index] do collection do @@ -30,7 +33,7 @@ RedmineApp::Application.routes.draw do match 'update_contest' , via: [:put] match 'show_contest' , via: :get match 'show_project' , via: :get - match 'show_application' , via: :get + match 'show_softapplication' , via: :get match 'show_participator' , via: :get match 'add' , via: [:get, :post] match 'create' , via: :post diff --git a/db/schema.rb b/db/schema.rb index 8c6085547..dab01aede 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,15 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20140320022724) do - - create_table "a_user_watchers", :force => true do |t| - t.string "name" - t.text "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "member_id" - end +ActiveRecord::Schema.define(:version => 20140404030103) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -31,6 +23,11 @@ ActiveRecord::Schema.define(:version => 20140320022724) 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 "andoidcontests", :force => true do |t| + 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 @@ -165,6 +162,28 @@ ActiveRecord::Schema.define(:version => 20140320022724) 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 "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" @@ -303,9 +322,9 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :null => false + t.integer "issue_from_id", :null => false + t.integer "issue_to_id", :null => false + t.string "relation_type", :default => "", :null => false t.integer "delay" end @@ -362,6 +381,13 @@ ActiveRecord::Schema.define(:version => 20140320022724) 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" @@ -473,22 +499,6 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" add_index "messages", ["parent_id"], :name => "messages_parent_id" - create_table "messages_for_bids", :force => true do |t| - t.string "message" - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "messages_for_users", :force => true do |t| - t.integer "messager_id" - t.integer "user_id" - t.string "message" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "news", :force => true do |t| t.integer "project_id" t.string "title", :limit => 60, :default => "", :null => false @@ -518,6 +528,19 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.string "salt", :null => false end + create_table "open_source_projects", :force => true do |t| + t.string "name" + t.string "description", :default => "" + 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" @@ -548,23 +571,11 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.integer "watchers_count" t.integer "project_id" t.integer "project_type" - t.integer "gitlab_group_id", :limit => 8 - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 end - add_index "project_statuses", ["changesets_count"], :name => "index_project_statuses_on_changesets_count" add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - add_index "project_statuses", ["watchers_count"], :name => "index_project_statuses_on_watchers_count" - - create_table "project_tags", :force => true do |t| - t.integer "project_id" - t.integer "tag_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "user_id" - end create_table "projects", :force => true do |t| t.string "name", :default => "", :null => false @@ -609,19 +620,33 @@ ActiveRecord::Schema.define(:version => 20140320022724) 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 + end + create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" + t.integer "project_id", :default => 0, :null => false + t.string "url", :default => "", :null => false + t.string "login", :limit => 60, :default => "" + t.string "password", :default => "" + t.string "root_url", :default => "" t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 + t.string "path_encoding", :limit => 64 + t.string "log_encoding", :limit => 64 t.text "extra_info" t.string "identifier" - t.boolean "is_default", :default => false - t.string "git_project_id" + t.boolean "is_default", :default => false end add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" @@ -642,6 +667,26 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.datetime "updated_at", :null => false end + create_table "seems_rateable_cached_ratings", :force => true do |t| + t.integer "cacheable_id", :limit => 8 + t.string "cacheable_type" + t.float "avg", :null => false + t.integer "cnt", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_rates", :force => true do |t| + t.integer "rater_id", :limit => 8 + t.integer "rateable_id" + t.string "rateable_type" + t.float "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "settings", :force => true do |t| t.string "name", :default => "", :null => false t.text "value" @@ -652,9 +697,9 @@ ActiveRecord::Schema.define(:version => 20140320022724) do create_table "shares", :force => true do |t| t.date "created_on" - t.string "title" - t.string "share_type" t.string "url" + t.string "title" + t.integer "share_type" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "project_id" @@ -662,10 +707,15 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.string "description" end - create_table "students", :force => true do |t| + create_table "softapplications", :force => true do |t| t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + 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 end create_table "students_for_courses", :force => true do |t| @@ -726,7 +776,7 @@ ActiveRecord::Schema.define(:version => 20140320022724) do create_table "tokens", :force => true do |t| t.integer "user_id", :default => 0, :null => false t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40 + t.string "value", :limit => 40, :default => "", :null => false t.datetime "created_on", :null => false end @@ -752,13 +802,12 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.integer "zip_code" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false - t.integer "identity" t.string "technical_title" + t.integer "identity" t.string "student_id" t.string "teacher_realname" t.string "student_realname" t.string "location_city" - t.string "git_token" end create_table "user_grades", :force => true do |t| @@ -795,14 +844,6 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - create_table "user_tags", :force => true do |t| - t.integer "user_id" - t.integer "tag_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "users", :force => true do |t| t.string "login", :default => "", :null => false t.string "hashed_password", :limit => 40, :default => "", :null => false diff --git a/lib/redmine.rb b/lib/redmine.rb index cce178a55..88d6f73ee 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -280,7 +280,7 @@ end 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_application_contest_path, :caption => :label_contest_application + 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 From a9e917144145d1a0d7c3e4b19cf0ef780552851c Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 4 Apr 2014 17:54:20 +0800 Subject: [PATCH 07/94] =?UTF-8?q?=E9=80=9A=E8=BF=87=E8=84=9A=E6=89=8B?= =?UTF-8?q?=E6=9E=B6=E6=96=B0=E5=BB=BA=E4=BA=86=E4=B8=80=E5=A5=97=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E4=B8=9C=E8=A5=BF=EF=BC=8C=E5=8C=85=E6=8B=AC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E7=9B=B8=E5=BA=94=E8=A1=A8?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=BB=BA=E4=BA=86=E5=8F=91=E5=B8=83=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E9=A1=B5=E9=9D=A2=EF=BC=8C=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8A=9F=E8=83=BD=E6=9C=AA=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=8C=E7=95=8C=E9=9D=A2=E6=A0=BC=E5=BC=8F=E8=BF=98=E9=9C=80?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/softapplications.js | 2 + app/assets/stylesheets/softapplications.css | 4 + .../softapplications_controller.rb | 83 +++++++++++++++++++ app/helpers/softapplications_helper.rb | 2 + app/models/softapplication.rb | 3 + .../contests/_softapplication_list.html.erb | 16 ++++ .../contests/show_softapplication.html.erb | 63 ++++++++++++++ app/views/softapplications/_form.html.erb | 64 ++++++++++++++ app/views/softapplications/edit.html.erb | 6 ++ app/views/softapplications/index.html.erb | 33 ++++++++ app/views/softapplications/new.html.erb | 12 +++ app/views/softapplications/show.html.erb | 35 ++++++++ config/locales/zh.yml | 11 ++- .../20140404030103_create_softapplications.rb | 14 ++++ public/stylesheets/application.css | 10 ++- test/fixtures/softapplications.yml | 17 ++++ .../softapplications_controller_test.rb | 49 +++++++++++ .../helpers/softapplications_helper_test.rb | 4 + test/unit/softapplication_test.rb | 7 ++ 19 files changed, 433 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/softapplications.js create mode 100644 app/assets/stylesheets/softapplications.css create mode 100644 app/controllers/softapplications_controller.rb create mode 100644 app/helpers/softapplications_helper.rb create mode 100644 app/models/softapplication.rb create mode 100644 app/views/contests/_softapplication_list.html.erb create mode 100644 app/views/contests/show_softapplication.html.erb create mode 100644 app/views/softapplications/_form.html.erb create mode 100644 app/views/softapplications/edit.html.erb create mode 100644 app/views/softapplications/index.html.erb create mode 100644 app/views/softapplications/new.html.erb create mode 100644 app/views/softapplications/show.html.erb create mode 100644 db/migrate/20140404030103_create_softapplications.rb create mode 100644 test/fixtures/softapplications.yml create mode 100644 test/functional/softapplications_controller_test.rb create mode 100644 test/unit/helpers/softapplications_helper_test.rb create mode 100644 test/unit/softapplication_test.rb diff --git a/app/assets/javascripts/softapplications.js b/app/assets/javascripts/softapplications.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/softapplications.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/softapplications.css b/app/assets/stylesheets/softapplications.css new file mode 100644 index 000000000..afad32db0 --- /dev/null +++ b/app/assets/stylesheets/softapplications.css @@ -0,0 +1,4 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb new file mode 100644 index 000000000..3bddec62c --- /dev/null +++ b/app/controllers/softapplications_controller.rb @@ -0,0 +1,83 @@ +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]) + + 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]) + + 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 + + # 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 +end 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/models/softapplication.rb b/app/models/softapplication.rb new file mode 100644 index 000000000..53440be81 --- /dev/null +++ b/app/models/softapplication.rb @@ -0,0 +1,3 @@ +class Softapplication < ActiveRecord::Base + attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id +end diff --git a/app/views/contests/_softapplication_list.html.erb b/app/views/contests/_softapplication_list.html.erb new file mode 100644 index 000000000..9a2576835 --- /dev/null +++ b/app/views/contests/_softapplication_list.html.erb @@ -0,0 +1,16 @@ + +<%= render_flash_messages %> + + + + <% if User.current.logged? %> + + <% end %> +
    <%= l(:label_bidding_project) %> +
    + + <%= link_to(l(:button_contesting_as_application), {:controller => 'softapplications', :action => 'new'}) %> +
    +
    + +<%#= render :partial=> "list_projects" %> diff --git a/app/views/contests/show_softapplication.html.erb b/app/views/contests/show_softapplication.html.erb new file mode 100644 index 000000000..b3e38d5f0 --- /dev/null +++ b/app/views/contests/show_softapplication.html.erb @@ -0,0 +1,63 @@ + + + + + + +
    + <%= render :partial => 'softapplication_list' %> +
    + 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)%> +

    + + + <%= l(:label_softapplication_version_available) %> + * : + <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %> + +

    + + + <%= l(:label_softapplication_type) %> + * : + <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> + +

    + + + + <%= l(:label_softapplication_description) %> + * : + <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %> + +

    + + +
    +
    + <%=l(:label_upload_softapplication_packets)%> :
    +

    + <%= render :partial => 'attachments/form' %> +

    +
    +
    + +
    +
    + <%=l(:label_upload_softapplication_photo)%> :(<%=l(:label_upload_softapplication_photo_condition)%>)
    +

    + <%= render :partial => 'attachments/form' %> +

    +
    +
    + +<% end %> + 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

    + + + + + + + + + + + + + + +<% @softapplications.each do |softapplication| %> + + + + + + + + + + + +<% end %> +
    NameDescriptionApp typeApp type nameAndroid min version availableUser
    <%= 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?' } %>
    + +
    + +<%= link_to 'New Softapplication', new_softapplication_path %> diff --git a/app/views/softapplications/new.html.erb b/app/views/softapplications/new.html.erb new file mode 100644 index 000000000..40c6a4059 --- /dev/null +++ b/app/views/softapplications/new.html.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/show.html.erb b/app/views/softapplications/show.html.erb new file mode 100644 index 000000000..faf8a93eb --- /dev/null +++ b/app/views/softapplications/show.html.erb @@ -0,0 +1,35 @@ +

    <%= notice %>

    + +

    + Name: + <%= @softapplication.name %> +

    + +

    + Description: + <%= @softapplication.description %> +

    + +

    + App type: + <%= @softapplication.app_type_id %> +

    + +

    + App type name: + <%= @softapplication.app_type_name %> +

    + +

    + Android min version available: + <%= @softapplication.android_min_version_available %> +

    + +

    + User: + <%= @softapplication.user_id %> +

    + + +<%= link_to 'Edit', edit_softapplication_path(@softapplication) %> | +<%= link_to 'Back', softapplications_path %> diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 448690b46..ffcfd1296 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1826,4 +1826,13 @@ zh: 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_name_condition: 25个汉字以内(50个字符) 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/public/stylesheets/application.css b/public/stylesheets/application.css index e60316841..514cb7685 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -2693,4 +2693,12 @@ 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 +} diff --git a/test/fixtures/softapplications.yml b/test/fixtures/softapplications.yml new file mode 100644 index 000000000..0ab48299f --- /dev/null +++ b/test/fixtures/softapplications.yml @@ -0,0 +1,17 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + name: MyString + description: MyString + app_type_id: 1 + app_type_name: MyString + android_min_version_available: MyString + user_id: 1 + +two: + name: MyString + description: MyString + app_type_id: 1 + app_type_name: MyString + android_min_version_available: MyString + user_id: 1 diff --git a/test/functional/softapplications_controller_test.rb b/test/functional/softapplications_controller_test.rb new file mode 100644 index 000000000..8c5611cb9 --- /dev/null +++ b/test/functional/softapplications_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class SoftapplicationsControllerTest < ActionController::TestCase + setup do + @softapplication = softapplications(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:softapplications) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create softapplication" do + assert_difference('Softapplication.count') do + post :create, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id } + end + + assert_redirected_to softapplication_path(assigns(:softapplication)) + end + + test "should show softapplication" do + get :show, id: @softapplication + assert_response :success + end + + test "should get edit" do + get :edit, id: @softapplication + assert_response :success + end + + test "should update softapplication" do + put :update, id: @softapplication, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id } + assert_redirected_to softapplication_path(assigns(:softapplication)) + end + + test "should destroy softapplication" do + assert_difference('Softapplication.count', -1) do + delete :destroy, id: @softapplication + end + + assert_redirected_to softapplications_path + end +end diff --git a/test/unit/helpers/softapplications_helper_test.rb b/test/unit/helpers/softapplications_helper_test.rb new file mode 100644 index 000000000..ad8173602 --- /dev/null +++ b/test/unit/helpers/softapplications_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class SoftapplicationsHelperTest < ActionView::TestCase +end diff --git a/test/unit/softapplication_test.rb b/test/unit/softapplication_test.rb new file mode 100644 index 000000000..b3872eec5 --- /dev/null +++ b/test/unit/softapplication_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SoftapplicationTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From bad170fdb2070f47ae3f571a4a4f4e1580356d5c Mon Sep 17 00:00:00 2001 From: nieguanghui Date: Wed, 9 Apr 2014 09:25:24 +0800 Subject: [PATCH 08/94] =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E9=99=84=E4=BB=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softapplications_controller.rb | 10 ++- app/models/attachment.rb | 3 +- app/models/homework_attach.rb | 2 +- app/models/softapplication.rb | 1 + app/views/softapplications/new.html.erb | 64 +++++++++++++++++-- config/routes.rb | 4 +- 6 files changed, 71 insertions(+), 13 deletions(-) diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 3bddec62c..e6fbd2e0e 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -14,7 +14,7 @@ class SoftapplicationsController < ApplicationController # GET /softapplications/1.json def show @softapplication = Softapplication.find(params[:id]) - + respond_to do |format| format.html # show.html.erb format.json { render json: @softapplication } @@ -41,7 +41,7 @@ class SoftapplicationsController < ApplicationController # POST /softapplications.json def create @softapplication = Softapplication.new(params[:softapplication]) - + @softapplication.save_attachments(params[:attachments]) respond_to do |format| if @softapplication.save format.html { redirect_to @softapplication, notice: 'Softapplication was successfully created.' } @@ -68,6 +68,12 @@ class SoftapplicationsController < ApplicationController end end end + + + def add_attach + @softapplication = Softapplication.find(params[:id]) + @softapplication.save_attachments(params[:attachments]) + end # DELETE /softapplications/1 # DELETE /softapplications/1.json diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 768be578f..8e607a685 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}.*", 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/softapplication.rb b/app/models/softapplication.rb index 53440be81..f661ea74b 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,3 +1,4 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id + acts_as_attachable end diff --git a/app/views/softapplications/new.html.erb b/app/views/softapplications/new.html.erb index 40c6a4059..820165819 100644 --- a/app/views/softapplications/new.html.erb +++ b/app/views/softapplications/new.html.erb @@ -1,12 +1,64 @@ -

    <%=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) %> +
    + <%= 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_attachment_plural) %> + + + <%= l(:label_softapplication_name) %> + * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %> + <%= l(:label_softapplication_name_condition)%> + +
    +
    + + + <%= l(:label_softapplication_version_available) %> + * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %> + + +
    +
    + + + <%= l(:label_softapplication_type) %> + + * : <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> + + +
    +
    + + + <%= l(:label_softapplication_description) %> + * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %> + + +
    +
    + <%= render_flash_messages %> +

    + <%= render :partial => 'attachments/form' %> +

    +
    + <%= submit_tag l(:button_create), :onclick => "return true" %> + +
    + <% end %>
    \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 181ecb0e0..c4ad9cdff 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,9 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do - resources :softapplications - - + resources :softapplications ## new added by linchun #新竞赛相关 resources :contests, only: [:index] do collection do From 92078e6ac832ae908999cf42d42015f4fd66880a Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Wed, 9 Apr 2014 10:24:44 +0800 Subject: [PATCH 09/94] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/welcome/contest.html.erb | 73 ++++++++++++++++++------------ 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index cbc035b42..5b00d4d17 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -100,45 +100,62 @@
    <%= l(:label_welcome_trustie) %><%= l(:label_welcome_trustie_contest) %> , <%= l(:label_welcome_trustie_contest_description) %>
    -
    - + +
    + + 竞赛总量: + +
    + + 竞赛总人数: + +
    + + 竞赛项目或应用总数: + +
- +
+

最新参赛应用

+ <%= link_to "更多>>", {:controller => 'bids', :action => 'contest', :project_type => 1, :host => Setting.contest_domain}, :target => "_blank" %> +
+
    + <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[10]) %> +
  • +

    + <%= link_to( contest.name, respond_path(contest.id), :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", + :style => "margin-left: 28px;", :target => "_blank") %> +

    +

    + <%= content_tag "span", contest.description.truncate(50, omission: '...'), :class => "d-p-project-intro" , :title => contest.description %> +

    +
  • + <% end %> +
+
+
    @@ -210,48 +225,6 @@
- - - - - -
diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 78f5e9726..352afe2a0 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1837,3 +1837,4 @@ zh: label_softapplication_developer: 开发者 label_softapplication_name_condition: 25个汉字以内(50个字符) label_user_login_softapplication_board: 您还没有登录,请登录后参与应用评价。 + label_contest_description_no: 暂无描述。 \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 41524a5de..c5397187b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do - + ##new added by linchun #以发布应用的形式参与竞赛 resources :softapplications do collection do @@ -38,6 +38,7 @@ RedmineApp::Application.routes.draw do 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 diff --git a/db/schema.rb b/db/schema.rb index dab01aede..8b443264f 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 => 20140404030103) do +ActiveRecord::Schema.define(:version => 20140411005214) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -23,11 +23,6 @@ ActiveRecord::Schema.define(:version => 20140404030103) 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 "andoidcontests", :force => true do |t| - 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 @@ -172,6 +167,16 @@ ActiveRecord::Schema.define(:version => 20140404030103) do 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" @@ -528,19 +533,6 @@ ActiveRecord::Schema.define(:version => 20140404030103) do t.string "salt", :null => false end - create_table "open_source_projects", :force => true do |t| - t.string "name" - t.string "description", :default => "" - 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" @@ -620,21 +612,6 @@ ActiveRecord::Schema.define(:version => 20140404030103) 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 - end - create_table "repositories", :force => true do |t| t.integer "project_id", :default => 0, :null => false t.string "url", :default => "", :null => false @@ -716,6 +693,9 @@ ActiveRecord::Schema.define(:version => 20140404030103) do 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" end create_table "students_for_courses", :force => true do |t| From 6baa87a8ea9921e77a8d910010ad5ac777d8d76b Mon Sep 17 00:00:00 2001 From: nieguanghui Date: Fri, 11 Apr 2014 10:53:51 +0800 Subject: [PATCH 13/94] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=88=86=E6=95=B0=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BD=9C=E4=B8=9A=E4=B8=AD=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=88=86=E6=95=B0=E5=92=8C=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=86=85=E9=83=A8=E5=88=86=E6=95=B0=E4=B8=8D=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user.rb | 1 + app/views/layouts/base_users.html.erb | 2 +- .../users/_activity_score_index.html.erb | 4 ++-- app/views/users/_score_index.html.erb | 2 +- app/views/users/_show_score.html.erb | 2 +- app/views/users/_user_show.html.erb | 2 +- .../20130828004955_stored_status_procedure.rb | 22 +++++++++++-------- 7 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 674e774d0..b9d752eb6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,6 +82,7 @@ class User < Principal #####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 :journals_for_messages, :as => :jour, :dependent => :destroy has_many :new_jours, :as => :jour, :class_name => 'JournalsForMessage', :conditions => "status=1" diff --git a/app/views/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb index 232103273..2063528cc 100644 --- a/app/views/layouts/base_users.html.erb +++ b/app/views/layouts/base_users.html.erb @@ -78,7 +78,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/_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/_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/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; From 3e1a674ed94f68585fb49d5139be2ef60afa2c6a Mon Sep 17 00:00:00 2001 From: yanxd Date: Fri, 11 Apr 2014 10:56:55 +0800 Subject: [PATCH 14/94] fix 3 --- app/views/bids/_homework_list.html.erb | 2 +- app/views/bids/show.html.erb | 2 +- app/views/projects/homework.html.erb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb index bae83f14a..8e0c93a79 100644 --- a/app/views/bids/_homework_list.html.erb +++ b/app/views/bids/_homework_list.html.erb @@ -22,7 +22,7 @@ - + - diff --git a/app/views/contests/_softapplication_list.html.erb b/app/views/contests/_softapplication_list.html.erb index 895926e38..221dc9dcf 100644 --- a/app/views/contests/_softapplication_list.html.erb +++ b/app/views/contests/_softapplication_list.html.erb @@ -12,5 +12,4 @@ <% end %>
<%= link_to homework.user, user_path(homework.user)%> 提交了作业 <%= link_to homework.user, user_path(homework.user)%> 已提交
  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/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); } From a4df4cf893d246796491069a0c2728c5db99bd7c Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 11 Apr 2014 16:40:09 +0800 Subject: [PATCH 15/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E5=92=8C=E5=8F=82=E4=B8=8E=E7=AB=9E=E8=B5=9B=E7=9A=84=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E5=BA=94=E7=94=A8=E4=B9=8B=E9=97=B4=E7=9A=84=E5=85=B3?= =?UTF-8?q?=E8=81=94=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/contests_controller.rb | 9 +++++---- app/helpers/contests_helper.rb | 16 +++++++++++++--- app/models/contest.rb | 4 ++-- app/models/contesting_project.rb | 5 +++++ app/models/softapplication.rb | 1 + app/models/user.rb | 1 + app/views/contests/_contest_list.html.erb | 7 ++++--- .../contests/_softapplication_list.html.erb | 3 +-- app/views/contests/show_softapplication.html.erb | 4 ++-- app/views/softapplications/show.html.erb | 5 +---- config/locales/zh.yml | 3 +++ config/routes.rb | 1 + 12 files changed, 39 insertions(+), 20 deletions(-) diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index acc874752..4ca1c1933 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -157,7 +157,7 @@ class ContestsController < ApplicationController contests = Contest.where('parent_id = ?', @contest.id) @softapplications = [] for contest in contests - @softapplications += contest.softapplications + @softapplications += contest.contesting_softapplications end respond_to do |format| @@ -240,6 +240,7 @@ class ContestsController < ApplicationController # @user = @contest.user @softapplication = Softapplication.all + @contesting_softapplication = @contest.contesting_softapplications # @temp = [] # @softapplicationt.each do |pro| @@ -292,15 +293,15 @@ class ContestsController < ApplicationController def add_softapplication softapplication = Softapplication.find(params[:contest]) contest_message = params[:contest_for_save][:contest_message] - if Softapplication.where("softapplication_id = ? and contest_id = ?", softapplication.id, @contest.id).size == 0 - if Softapplication.create_contesting(@contest.id, softapplication.id, contest_message) + if ContestingSoftapplication.where("softapplication_id = ? and contest_id = ?", softapplication.id, @contest.id).size == 0 + if ContestingSoftapplication.create_contesting(@contest.id, softapplication.id, contest_message) flash.now[:notice] = l(:label_bidding_contest_succeed) end else flash.now[:error] = l(:label_bidding_fail) end - @softapplication = @contest.softapplications + @contesting_softapplication = @contest.contesting_softapplications render :text => params.to_json # respond_to do |format| diff --git a/app/helpers/contests_helper.rb b/app/helpers/contests_helper.rb index d48342b59..00fb5b77c 100644 --- a/app/helpers/contests_helper.rb +++ b/app/helpers/contests_helper.rb @@ -105,7 +105,7 @@ module ContestsHelper contests = Contest.find(:id) @softapplications = [] for contest in contests - @softapplications += contest.contesting_projects + @softapplications += contest.contesting_softapplications end @projects.count end @@ -122,6 +122,16 @@ module ContestsHelper @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 @@ -152,8 +162,8 @@ module ContestsHelper end def select_option_app_helper options tmp = Hash.new - options.each do |project| - tmp[project.name] = project.id + options.each do |option| + tmp[option.name] = option.id end tmp end diff --git a/app/models/contest.rb b/app/models/contest.rb index b3e6c4f77..edc252574 100644 --- a/app/models/contest.rb +++ b/app/models/contest.rb @@ -5,8 +5,8 @@ class Contest < ActiveRecord::Base belongs_to :author, :class_name => 'User', :foreign_key => :author_id has_many :contesting_projects, :dependent => :destroy has_many :projects, :through => :contesting_projects - has_many :softapplications, :dependent => :destroy - # has_many :softapplications, :through => :softapplications + 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 diff --git a/app/models/contesting_project.rb b/app/models/contesting_project.rb index 773c04c68..c0c360548 100644 --- a/app/models/contesting_project.rb +++ b/app/models/contesting_project.rb @@ -19,6 +19,11 @@ class ContestingProject < ActiveRecord::Base :project_id => project_id, :description => description) end + def self.cerate_softapplication_contesting(contest_id, softapplication_id, description = nil) + self.create_softapplication(:user_id => User.current.id, :contest_id => contest_id, + :softapplication_id => softapplication_id, :description => description) + end + def update_reward(which) self.update_attribute(:reward,which) end diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 4cf76001a..e63eb428d 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -2,6 +2,7 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id acts_as_attachable has_many :journals_for_messages, :as => :jour, :dependent => :destroy + has_many :contesting_softapplications, :dependent => :destroy belongs_to :user belongs_to :contest diff --git a/app/models/user.rb b/app/models/user.rb index 1aa1e0382..0255b0da6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -79,6 +79,7 @@ class User < Principal ## 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 diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb index cdc390410..5a8bf6890 100644 --- a/app/views/contests/_contest_list.html.erb +++ b/app/views/contests/_contest_list.html.erb @@ -18,9 +18,10 @@
<%= l(:label_x_biding_project, :count => contest.contesting_projects.count) %>(<%= link_to contest.contesting_projects.count %>) - <%= l(:label_x_bids_responses, :count => contest.commit) %>(<%= link_to contest.commit, respond_path(contest) %>) - <%= l(:label_x_followers, :count => contest.watcher_users.count) %>(<%= link_to contest.watcher_users.count, respond_path(contest) %>) + <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to contest.contesting_projects.count %>) + <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to contest.contesting_softapplications.count %>) + <%= l(:label_contest_response, :count => contest.commit) %>(<%= link_to contest.commit, respond_path(contest) %>) + <%= l(:label_contest_watchers, :count => contest.watcher_users.count) %>(<%= link_to contest.watcher_users.count, respond_path(contest) %>)
- -<%= render :partial=> "list_softapplications",:locals => {:softapplication => softapplication,:contest => @contest }%> +<%= render :partial=> "list_softapplications",:locals => {:contesting_softapplication => contesting_softapplication,:contest => @contest }%> diff --git a/app/views/contests/show_softapplication.html.erb b/app/views/contests/show_softapplication.html.erb index 725992062..fd643a0bd 100644 --- a/app/views/contests/show_softapplication.html.erb +++ b/app/views/contests/show_softapplication.html.erb @@ -60,7 +60,7 @@
- <%= form_for "contest_for_save", :remote=>true, :url => {:controller => 'contests', :action => 'add_softapplication'}, :update => "softapplication_list", :complete => '$("#put-bid-form").hide();' do |f| %> + <%= form_for "contest_for_save", :remote=>true, :url => {:controller => 'contests', :action => 'add_softapplication'}, :update => "contesting_softapplication_list", :complete => '$("#put-bid-form").hide();' do |f| %> @@ -97,6 +97,6 @@
- <%#= render :partial => 'softapplication_list', :locals => {:softapplication => @softapplication,:contest => @contest} %> + <%= render :partial => 'softapplication_list', :locals => {:contesting_softapplication => @contesting_softapplication,:contest => @contest} %>
diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index d0043564a..e3e64900c 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -16,10 +16,7 @@ - - - - +
<%= select_tag 'contest', options_for_select(select_option_app_helper(@softapplication)), :name => 'contest', :class => 'grayline' %>开发者:<%= @softapplication.user.name %> 系统支持:<%= @softapplication.android_min_version_available %>
已提交竞赛: <%= @softapplication.contest.name%>
diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 352afe2a0..f5f120925 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1823,6 +1823,9 @@ zh: 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: 我要参赛(发布应用) diff --git a/config/routes.rb b/config/routes.rb index c5397187b..360c9399e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -45,6 +45,7 @@ RedmineApp::Application.routes.draw do 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 From 96fcdbacf232c25e74fc9f3390bd81be4bcc50de Mon Sep 17 00:00:00 2001 From: yanxd Date: Fri, 11 Apr 2014 16:43:05 +0800 Subject: [PATCH 16/94] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E9=87=8C=E6=90=9C?= =?UTF-8?q?=E4=B8=9C=E8=A5=BF=20=E6=B2=A1=E6=9C=89=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=87=8C=E4=B9=9F=E8=B7=B3=E5=87=BA=E6=9D=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index d3481e2ae..5c9fa7fce 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -218,8 +218,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'] From 28a5eff048e67664a1edba3940d103d780702386 Mon Sep 17 00:00:00 2001 From: yanxd Date: Fri, 11 Apr 2014 16:44:02 +0800 Subject: [PATCH 17/94] =?UTF-8?q?topics=E6=9C=AA=E7=99=BB=E5=BD=95footer?= =?UTF-8?q?=E9=A3=9E=E5=87=BA=E5=8E=BB=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E6=93=A6=E5=B1=81=E8=82=A1+10086,dom=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E8=BF=98=E6=9C=89=E9=94=99=EF=BC=8C=E6=89=BE=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_courses.html.erb | 10 +++++----- app/views/messages/show.html.erb | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index c9f6e8525..1862eb4c5 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -43,7 +43,7 @@ - <%=link_to request.host()+"/course", :controller => 'projects', :action => 'course' %> + <%=link_to request.host()+"/course", :controller => 'projects', :action => 'course' %>

<%=link_to "主页", home_path %> > <%=link_to l(:label_course_practice), :controller => 'projects', :action => 'course' %> > <%=link_to @project.name, nil %>

@@ -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,8 +233,8 @@ <% 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 %> 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') %> diff --git a/public/images/footer_logo/buaa_scse.jpg b/public/images/footer_logo/buaa_scse.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68ebbc1d3fb03ecac6b9cced609560a870bf9203 GIT binary patch literal 31121 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 literal 0 HcmV?d00001 diff --git a/public/images/footer_logo/inforbus.jpg b/public/images/footer_logo/inforbus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3249be16837447eb4c68c3bc60fd8e9e6180272 GIT binary patch literal 3066 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 RJ6x@U98`FckHXVO{{izZ$A|y` literal 0 HcmV?d00001 diff --git a/public/images/footer_logo/iscas.jpg b/public/images/footer_logo/iscas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a26ccad3822973ccff743ab9511e7e0b6511067e GIT binary patch literal 2602 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 nqnM$Ab~;y-g{j*cSl0DHfC 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 literal 0 HcmV?d00001 From 3f096f9167a16f59a3b34613ba8df84e0fa21cf4 Mon Sep 17 00:00:00 2001 From: kg Date: Sat, 12 Apr 2014 19:57:58 +0800 Subject: [PATCH 62/94] add pdl logo --- app/views/layouts/_base_footer.html.erb | 2 +- public/images/footer_logo/pdl.jpg | Bin 0 -> 3333 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/images/footer_logo/pdl.jpg diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index b754be2e9..aa983c0de 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -10,7 +10,7 @@

<%= link_to image_tag('/images/footer_logo/pdl.jpg',:size=>'150x40',:alt=>"国防科学技术大学并行与分布处理国家重点实验室",:style=>"border:1px solid"), "http://www.nudt.edu.cn/ArticleShow.asp?ID=47", :target=>"_blank"%> - <%= link_to "Trustie 开发团队","http://forge.trustie.net/projects/2/member",:target=>"_blank"%> + <%= link_to "Trustie 开发团队","http://forge.trustie.net/projects/2/member",:target=>"_blank",:style=>"position:relative; top:-15px; left:5px"%>

核心技术团队 diff --git a/public/images/footer_logo/pdl.jpg b/public/images/footer_logo/pdl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15adbbfd9cd8c69af8c556ee6317508bf75c9ec3 GIT binary patch literal 3333 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 nqnM$ Date: Sun, 13 Apr 2014 10:03:47 +0800 Subject: [PATCH 63/94] modify footer --- app/views/layouts/_base_footer.html.erb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index aa983c0de..6c4483d5d 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -9,21 +9,21 @@ 主办单位

- <%= link_to image_tag('/images/footer_logo/pdl.jpg',:size=>'150x40',:alt=>"国防科学技术大学并行与分布处理国家重点实验室",:style=>"border:1px solid"), "http://www.nudt.edu.cn/ArticleShow.asp?ID=47", :target=>"_blank"%> - <%= link_to "Trustie 开发团队","http://forge.trustie.net/projects/2/member",:target=>"_blank",:style=>"position:relative; top:-15px; left:5px"%> + <%= link_to image_tag('/images/footer_logo/pdl.jpg',:size=>'150x40',:alt=>"国防科学技术大学并行与分布处理国家重点实验室"), "http://www.nudt.edu.cn/ArticleShow.asp?ID=47", :target=>"_blank"%> + <%= link_to "Trustie 开发团队 ","http://forge.trustie.net/projects/2/member",:target=>"_blank",:style=>"position:relative; top:-15px; left:5px; font-weight: bold"%>

核心技术团队

-

- Trustie 2007~2014 +

+ 国防科学技术大学并行与分布处理国家重点实验室 版权@2007~2014 湘ICP备09019772

From c9b92b4197fe4c77448dd82d7bb60702194b0988 Mon Sep 17 00:00:00 2001 From: kg Date: Wed, 16 Apr 2014 22:11:10 +0800 Subject: [PATCH 64/94] modify status color --- app/views/welcome/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@
- +
From d450da9df89503ffaef594d1fc42224ae1805097 Mon Sep 17 00:00:00 2001 From: kg Date: Thu, 17 Apr 2014 08:33:44 +0800 Subject: [PATCH 65/94] footer , footer of base_course,upload files count and delete all upload --- app/views/attachments/_form.html.erb | 6 +++- app/views/attachments/destroy.js.erb | 7 ++++ app/views/attachments/upload.js.erb | 2 +- app/views/layouts/_base_footer.html.erb | 12 ------- app/views/layouts/base_courses.html.erb | 1 - config/locales/zh.yml | 1 + public/javascripts/attachments.js | 36 ++++++++++++++++--- public/stylesheets/application.css | 5 +++ .../stylesheets/application.css | 3 +- 9 files changed, 52 insertions(+), 21 deletions(-) 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/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index 6c4483d5d..0c1867a98 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -29,15 +29,3 @@ -<%= debug(params) if Rails.env.development? %> - - \ No newline at end of file diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index 7260a9c42..496f56417 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -244,7 +244,6 @@ - diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 2256ed863..2423b8485 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: 上移 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 e5a203a6d..c3572f930 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -1821,6 +1821,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; } diff --git a/public/themes/redpenny-master/stylesheets/application.css b/public/themes/redpenny-master/stylesheets/application.css index 51a41fea0..cc321a425 100644 --- a/public/themes/redpenny-master/stylesheets/application.css +++ b/public/themes/redpenny-master/stylesheets/application.css @@ -982,7 +982,8 @@ hr } p { - font-size: 13px + font-size: 13px; + position:relative;/*gcm*/ } /*end*/ div.issue From 4d727d80494dc0534d68b3861f82eb4bc8975a0e Mon Sep 17 00:00:00 2001 From: kg Date: Thu, 17 Apr 2014 09:03:39 +0800 Subject: [PATCH 66/94] revert the mistaken move:base_courses and base_project footer --- app/views/layouts/base_courses.html.erb | 10 +++++----- app/views/layouts/base_projects.html.erb | 4 +--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index 496f56417..968752ed5 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -240,15 +240,15 @@ <%= yield %> <%= call_hook :view_layouts_base_content %>
- + +
- + + <%= render :partial => 'layouts/base_footer'%> - - <%= render :partial => 'layouts/base_footer'%> + diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index d541124fc..1a4ed1b47 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -175,14 +175,12 @@ <%= call_hook :view_layouts_base_content %>
- + <%= render :partial => 'layouts/base_footer'%> - - <%= render :partial => 'layouts/base_footer'%> From 9206a30bd4aba7ecd27ff63b35b020106ebd79a1 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Thu, 17 Apr 2014 14:49:51 +0800 Subject: [PATCH 67/94] =?UTF-8?q?=E5=B0=86=E6=8F=90=E4=BA=A4=E5=92=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=8C=89=E9=92=AE=E6=94=BE=E5=88=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E7=9A=84=E6=A1=86=E5=86=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/bids/new_submit_homework.html.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 From 7c8ecd19441d2687270b213fb74bd0c5ba6ca32a Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Thu, 17 Apr 2014 16:50:36 +0800 Subject: [PATCH 68/94] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8A=A8=E6=80=81=E5=90=8E=E4=BE=9D=E7=84=B6=E8=83=BD?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=A1=B9=E7=9B=AE=E5=88=9B=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/projects/show.html.erb | 40 ++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index c49b08b5d..3ca41d072 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -1,4 +1,4 @@ -<% if @events_by_day.size >0 %> +

@@ -43,26 +43,30 @@ <% end %>

<% end -%> + + +
+
当前网站状态 活跃项目:<%=@projectCount%>个
+ + + + +
<%= 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) %> +
+
+
-<% else %> -
- - - - - -
<%= 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 %> + + + From 5699a947ec8d27d3bdd6e87c704bd78398a75403 Mon Sep 17 00:00:00 2001 From: Wen Date: Thu, 17 Apr 2014 17:36:41 +0800 Subject: [PATCH 69/94] =?UTF-8?q?=E5=BB=BA=E7=AB=8B=E4=BA=86=E5=AD=A6?= =?UTF-8?q?=E6=A0=A1=E4=B8=8E=E7=94=A8=E6=88=B7=E7=9A=84=E5=85=B3=E8=81=94?= =?UTF-8?q?=20=E8=AF=BE=E7=A8=8B=E4=B8=8E=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E5=AD=A6=E6=A0=A1=E5=AD=97=E6=AE=B5=E5=9D=87=E4=B8=BA=E5=AD=A6?= =?UTF-8?q?=E6=A0=A1id=E8=80=8C=E4=B8=8D=E5=86=8D=E6=98=AF=E5=AD=A6?= =?UTF-8?q?=E6=A0=A1=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 页面暂时改了想到的地方= = --- app/controllers/my_controller.rb | 4 +- app/controllers/projects_controller.rb | 2 +- app/controllers/school_controller.rb | 2 +- app/models/user_extensions.rb | 1 + app/views/layouts/base_users.html.erb | 550 +++++++++--------- app/views/my/account.html.erb | 2 +- app/views/projects/_course_form.html.erb | 2 +- ...85550_rename_courses_column_school_name.rb | 9 + ...7090022_change_courses_column_school_id.rb | 9 + ...091429_add_school_id_to_user_extensions.rb | 5 + db/schema.rb | 291 +++++++-- 11 files changed, 540 insertions(+), 337 deletions(-) create mode 100644 db/migrate/20140417085550_rename_courses_column_school_name.rb create mode 100644 db/migrate/20140417090022_change_courses_column_school_id.rb create mode 100644 db/migrate/20140417091429_add_school_id_to_user_extensions.rb 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/projects_controller.rb b/app/controllers/projects_controller.rb index 7db953a0b..c130d2ba6 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -390,7 +390,7 @@ class ProjectsController < ApplicationController # added by bai @course.term = params[:term] @course.time = params[:time] - @course.school_name = params[:occupation] + @course.school_id = params[:occupation] @course.setup_time = params[:setup_time] @course.endup_time = params[:endup_time] @course.class_period = params[:class_period] diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb index 63791795c..749491b69 100644 --- a/app/controllers/school_controller.rb +++ b/app/controllers/school_controller.rb @@ -6,7 +6,7 @@ class SchoolController < ApplicationController options = "" @school.each do |s| - options << "" + options << "" end render :text => options 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/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb index 2063528cc..6fdb2d9ea 100644 --- a/app/views/layouts/base_users.html.erb +++ b/app/views/layouts/base_users.html.erb @@ -1,275 +1,275 @@ -<% @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) %> : - -
<%=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'%> -
- - -
-
-
- <%= 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) %> : + +
<%=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'%> +
+ + +
+
+
+ <%= call_hook :view_layouts_base_body_bottom %> + + diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb index 6ff37ed7c..e46b25fc4 100644 --- a/app/views/my/account.html.erb +++ b/app/views/my/account.html.erb @@ -91,7 +91,7 @@

<%= 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", options_for_select([['安徽大学','安徽大学'],['合肥工业大学','合肥工业大学'],['中国科技大学','中国科技大学']]) %> + <%= select_tag "occupation" %>

diff --git a/app/views/projects/_course_form.html.erb b/app/views/projects/_course_form.html.erb index ca736b05a..944157a9b 100644 --- a/app/views/projects/_course_form.html.erb +++ b/app/views/projects/_course_form.html.erb @@ -289,7 +289,7 @@ <%=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)" %> - <%= select_tag "occupation", options_for_select([['安徽大学','安徽大学'],['合肥工业大学','合肥工业大学'],['中国科技大学','中国科技大学']]) %> + <%= select_tag "occupation" %>

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 a5cb5409c..669a6cb03 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 => 20140415090829) do +ActiveRecord::Schema.define(:version => 20140417091429) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -23,6 +23,15 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 @@ -62,6 +71,20 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -101,6 +124,11 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 @@ -157,38 +185,6 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -205,7 +201,7 @@ ActiveRecord::Schema.define(:version => 20140415090829) do t.string "setup_time" t.string "endup_time" t.string "class_period" - t.string "school_name" + t.integer "school_id" end create_table "custom_fields", :force => true do |t| @@ -265,6 +261,14 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 @@ -286,6 +290,137 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 => "" @@ -386,13 +521,6 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -518,6 +646,22 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -533,6 +677,19 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -612,6 +769,23 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 @@ -684,21 +858,6 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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" @@ -764,6 +923,22 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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 @@ -789,6 +964,7 @@ ActiveRecord::Schema.define(:version => 20140415090829) 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| @@ -820,6 +996,9 @@ ActiveRecord::Schema.define(:version => 20140415090829) do 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| From 5ee1c8e2f2f1a3dd5dfcada1d4b6db226dd99502 Mon Sep 17 00:00:00 2001 From: yanxd Date: Thu, 17 Apr 2014 19:19:42 +0800 Subject: [PATCH 70/94] refactory zip --- app/controllers/zipdown_controller.rb | 161 ++++++++++++++++---------- app/views/test/courselist.html.erb | 4 +- 2 files changed, 104 insertions(+), 61 deletions(-) diff --git a/app/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb index 12f1976e0..dd855bc74 100644 --- a/app/controllers/zipdown_controller.rb +++ b/app/controllers/zipdown_controller.rb @@ -1,68 +1,111 @@ class ZipdownController < ApplicationController - def assort - obj_class = params[:obj_class] - obj_id = params[:obj_id] - obj = obj_class.constantize.find(obj_id) - case obj.class.to_s.to_sym - when :Bid - zip obj - else - logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!" - end + SAVE_FOLDER = "#{Rails.root}/files" + OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip" - rescue NameError, ActiveRecord::RecordNotFound => e - logger.error "[ZipDown] ===> #{e}" - @error = e - end + 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 - private + rescue NameError, ActiveRecord::RecordNotFound => e + logger.error "[ZipDown] ===> #{e}" + @error = e + end - def zip bid - # Todo: User Access Controll - homeworks_attach_path = [] - 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}" - @error = e - end + private - 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" + def zip_bid(bid) + # Todo: User Access Controll - 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 + homeattaches = bid.homeworks + # 得到每一个人所有文件打包的zip文件 + # 并将每一个人的zip打包为一个并返回路径 + user_zip_paths = homeattaches.map do |homeattach| + zip_homework_by_user homeattach + end + zipping bid.name, user_zip_paths, OUTPUT_FOLDER - def detect_content_type(name) - content_type = Redmine::MimeType.of(name) - content_type.to_s - 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}" + # @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 homeattach.user.name, user_attaches_paths, OUTPUT_FOLDER + end + + + def zipping(zip_name_refer, files_paths, output_path) + # 输入待打包的文件列表,已经打包文件定位到ouput_path + ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') + #folder = SAVE_FOLDER + input_filename = files_paths + zipfile_name = "#{output_path}/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(zip_name_refer+"#{Time.now.to_s}") ), 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 - def filename_to_real name - attach = Attachment.find_by_disk_filename(name) - attach.filename - end end diff --git a/app/views/test/courselist.html.erb b/app/views/test/courselist.html.erb index 61cd69e13..959d6a4be 100644 --- a/app/views/test/courselist.html.erb +++ b/app/views/test/courselist.html.erb @@ -17,14 +17,14 @@ <% @courses.each do |course| %>
- <%= course.name %> + <%= course.name %> <% course.homeworks.each do |homework| %> <% homeworks_attach_path = [] %>
<%= link_to homework.name, respond_path(homework) %>(<%=homework.homeworks.count %>)<%#Bid%>
- <%= link_to "package", test_zip_path(:homework_id => homework.id)%>
+ <%= 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%>) From f30513217eea8f8d4107aa84d1889bf1e3bf830f Mon Sep 17 00:00:00 2001 From: xx Date: Fri, 18 Apr 2014 05:18:15 +0800 Subject: [PATCH 71/94] zip factory --- app/controllers/zipdown_controller.rb | 30 +++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb index dd855bc74..57078a436 100644 --- a/app/controllers/zipdown_controller.rb +++ b/app/controllers/zipdown_controller.rb @@ -15,9 +15,9 @@ class ZipdownController < ApplicationController 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 + #rescue NameError, ActiveRecord::RecordNotFound => e + #logger.error "[ZipDown] ===> #{e}" + #@error = e end private @@ -31,7 +31,7 @@ class ZipdownController < ApplicationController user_zip_paths = homeattaches.map do |homeattach| zip_homework_by_user homeattach end - zipping bid.name, user_zip_paths, OUTPUT_FOLDER + zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER #@paths = homeworks_attach_path #zipfile = ziping homeworks_attach_path @@ -50,24 +50,28 @@ class ZipdownController < ApplicationController #length = attach.storage_path.length homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1) end - zipping homeattach.user.name, user_attaches_paths, OUTPUT_FOLDER + 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) + def zipping(zip_name_refer, files_paths, output_path, is_attachment=false) # 输入待打包的文件列表,已经打包文件定位到ouput_path ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') - #folder = SAVE_FOLDER input_filename = files_paths - zipfile_name = "#{output_path}/archive_#{Time.now.to_i}.zip" + + 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| - zipfile.add(ic.iconv(filename_to_real(zip_name_refer+"#{Time.now.to_s}") ), filename) - end - zipfile.get_output_stream('ReadMe') do |os| + 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 From abef68d13a19d78e30845dbde72e3395634d195e Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 09:06:52 +0800 Subject: [PATCH 72/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=97=B6=E4=B8=8D=E8=83=BD=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/contests_controller.rb | 2 +- db/schema.rb | 235 ++++++++++++++++++++++++- 2 files changed, 235 insertions(+), 2 deletions(-) diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index 2c09a8809..5511b15ca 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -286,7 +286,7 @@ class ContestsController < ApplicationController flash.now[:error] = l(:label_bidding_fail) end - @contesting_project = @contest.contesting_projects + @contesting_project = paginateHelper @contest.contesting_projects respond_to do |format| diff --git a/db/schema.rb b/db/schema.rb index 54947fe75..b4a9ba972 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 => 20140414012423) do +ActiveRecord::Schema.define(:version => 20140417091429) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -23,6 +23,15 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 @@ -62,6 +71,20 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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" @@ -101,6 +124,11 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 @@ -265,6 +293,14 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 @@ -286,6 +322,137 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 => "" @@ -518,6 +685,22 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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" @@ -533,6 +716,19 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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" @@ -612,6 +808,23 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 @@ -764,6 +977,22 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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 @@ -789,6 +1018,7 @@ ActiveRecord::Schema.define(:version => 20140414012423) 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| @@ -820,6 +1050,9 @@ ActiveRecord::Schema.define(:version => 20140414012423) do 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| From e136254c8d1d2bee9726bc6f282850530c9f00c5 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 09:28:44 +0800 Subject: [PATCH 73/94] =?UTF-8?q?=E5=9B=9E=E5=A4=8D=E4=BA=86=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E9=A1=B5=E9=9D=A2=E4=B8=AD=E7=9A=84=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_projects.html.erb | 2 +- lib/redmine.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb index af9ad87eb..1a4ed1b47 100644 --- a/app/views/layouts/base_projects.html.erb +++ b/app/views/layouts/base_projects.html.erb @@ -53,7 +53,7 @@ <% @project = Project.find_by_id(@project.id)%> - + 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/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 */ From 775774ad634559b6b64564999f85436f94adc607 Mon Sep 17 00:00:00 2001 From: Wen Date: Fri, 18 Apr 2014 14:46:32 +0800 Subject: [PATCH 75/94] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8E=AA=E6=96=BD?= =?UTF-8?q?=EF=BC=9A=E5=8D=B3=E4=BD=BF=E7=94=A8=E6=88=B7=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=A1=AB=E5=86=99=E5=8D=95=E4=BD=8D=EF=BC=8C=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=AD=A3=E5=B8=B8=E6=89=93=E5=BC=80?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/base_users.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/base_users.html.erb b/app/views/layouts/base_users.html.erb index 6fdb2d9ea..5c6f24524 100644 --- a/app/views/layouts/base_users.html.erb +++ b/app/views/layouts/base_users.html.erb @@ -166,7 +166,11 @@ <% unless @user.user_extensions.nil? %> <% unless @user.user_extensions.identity == 2 %> - + <% end %> From 76ccfe8ac434a902b6784c898de3df06aba2676f Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 16:35:48 +0800 Subject: [PATCH 76/94] fix --- .idea/.generators | 8 + .idea/.name | 1 + .idea/.rakeTasks | 7 + .idea/encodings.xml | 5 + .idea/misc.xml | 5 + .idea/modules.xml | 9 + .idea/scopes/scope_settings.xml | 5 + .idea/trustie2.iml | 65 ++ .idea/vcs.xml | 7 + .idea/workspace.xml | 989 +++++++++++++++++++++ Gemfile.lock | 4 - app/helpers/application_helper.rb | 4 +- app/models/softapplication.rb | 3 +- app/views/layouts/_base_header.html.erb | 4 + app/views/layouts/base_newcontest.html.erb | 1 - app/views/softapplications/show.html.erb | 2 +- public/images/android_0.jpg | Bin 0 -> 1658 bytes 17 files changed, 1110 insertions(+), 9 deletions(-) create mode 100644 .idea/.generators create mode 100644 .idea/.name create mode 100644 .idea/.rakeTasks create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/trustie2.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 public/images/android_0.jpg diff --git a/.idea/.generators b/.idea/.generators new file mode 100644 index 000000000..48c69bb77 --- /dev/null +++ b/.idea/.generators @@ -0,0 +1,8 @@ + + diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 000000000..2327e6ef0 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +trustie2 \ No newline at end of file diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks new file mode 100644 index 000000000..212558e83 --- /dev/null +++ b/.idea/.rakeTasks @@ -0,0 +1,7 @@ + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..e206d70d8 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..12817166a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..eb86c781f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 000000000..922003b84 --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/trustie2.iml b/.idea/trustie2.iml new file mode 100644 index 000000000..897cad7ea --- /dev/null +++ b/.idea/trustie2.iml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..c80f2198b --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..2bb1461a3 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,989 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CSS + + + Code style issuesJavaScript + + + Control flow issuesJavaScript + + + JavaScript + + + JavaScript function metricsJavaScript + + + JavaScript validity issuesJavaScript + + + Potentially confusing code constructsJavaScript + + + Ruby + + + SQL + + + + + CoffeeScript + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1397784941950 + 1397784941950 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gemfile.lock b/Gemfile.lock index 42cb62272..d60847b17 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,9 +79,6 @@ GEM rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) - seems_rateable (1.0.13) - jquery-rails - rails sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -112,4 +109,3 @@ DEPENDENCIES rails (= 3.2.13) rdoc (>= 2.4.2) ruby-openid (~> 2.1.4) - seems_rateable diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index cae7b8b1e..1d639726f 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1567,7 +1567,8 @@ 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} @@ -1586,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 diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 603279fbd..71caf059c 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,8 +1,7 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers acts_as_attachable - seems_rateable :allow_update => true, :dimensions => :quality - seems_rateable_rater + has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user diff --git a/app/views/layouts/_base_header.html.erb b/app/views/layouts/_base_header.html.erb index 4c3884a05..d340ea9e9 100644 --- a/app/views/layouts/_base_header.html.erb +++ b/app/views/layouts/_base_header.html.erb @@ -13,6 +13,10 @@ @nav_dispaly_home_path_label = 1 @nav_dispaly_main_course_label = 1 @nav_dispaly_main_project_label = 1 + @nav_dispaly_main_contest_label = 1 + elsif (realUrl.match(/contest\.trustie\.net\/*/)) + @nav_dispaly_contest_label = 1 + @nav_dispaly_store_all_label = 1 else @nav_dispaly_project_all_label = 1 @nav_dispaly_course_all_label = 1 diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index c0e23bf21..190209ae4 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -10,7 +10,6 @@ <%= favicon %> <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> - <%= seems_rateable_stylesheet %> <%= javascript_heads %> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index fcd746776..c2cea19b5 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -35,7 +35,7 @@ - + diff --git a/public/images/android_0.jpg b/public/images/android_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6aadab331ac0ffc74177b2212880d4d221fb0894 GIT binary patch literal 1658 zcmbV}c{tR09LIlinK916B<$|U5k>BCgs2?3b3~LSITJ-q4H_c3_Gx+$GAe4_iglMG zGmJr*EFBoRORizYeKtF@+tWVJ{=pgXWhrR;gvaqC z_ek!Ql2+WWqCC@5^7 zCZE_*NBFrgaXGD6gv7Db$CVU*d2J^a+9$jhxko`~T#?N~`;+Y7fyMnVvhQGjb1?ux z2#C8p2nsL(c6Z8^*5WswiBMW@lM-qb@6bv#+MAmnm}ivxMWby1>tZRzhMPrF`tVwx zW26ntWDC_xlrq5qQYy_Wf*mb`CuH=;PcIf61;>Urp5)uK_#FfR#sc)w?41Cr`a#Ob zfn}E|tLaUT_<|_opBRT4*9_R$<_CnB&N`Eem}Hgm9Car7YWk(mgraRe+b>-`wh=?? zJ2}7LHXGdfG1ZIh_-M@?)wi|9^8tOIWQRVwce|4qE{4_%vU{8~D0dY!-UyrSe8Pw~ z*_)cM((&oJTPbH_*tj_p@DVwD!XyoY^vU}9LjiG)Dw(X+MNoM<8{J*tb!b^A|E92M z7fma8$zEhKWhIP=owd*R^9u?N4Wb>Szp_&vp6M@(#8ML5kA$3wVNGvOq$pQRSN9`X zi;S2xyQ+=Ev1T7H!J!!s`{vS7O7X0u9-nEJk3{O_YYB|YpI@G8L-i=h7qjb`eq${F zetgH65LQknz*ZmS;IPEl7{d9YVb3O;OR)BL8a1MwUvCIiS-J}7*pgL~Jc!xbz8f;s zNaC~eK^%Y|yF$X%tcM|tu*LS+9K4!*-Sf;2UnOQ`hfZagjtp5$KAcD#2@SqCUM*{9nM+~e3*Q@P4uE9r+>rjsVEHL64d*bQt8|4>L|T+P&Z6``RQiTA;UpjjhWlonzRoY!P#Dp?z8m{xmH4qhwesWLXVl6s{FP zcbgC)6C}q>2K`x!Nf?Uj`nsERJPPmZp1op|<9$clOO6~+t@1-kTMt57JYyJx{Wxb* z*VEP_h`;OnRt+cQv{wh$XoZ#NT^O|`McKHkErgtFINj~+fNpYnk)rFr+g+;Fd!meG zq%=-ftw60la8n&sbs8>EsaNt(8#ZrWAT_5OT;9Oi4bMF>4ow-WiD5XjGCHVHmyqHW z0~h+|XS}x(VhMhJB@Jf&zI6?m==z6L>!piC3!l_ZGD;>xWffBMhOIYWnYU3!+oDzB z)I|sOH^&ssMixE{z8XjSx<)%=b!Z{`N2$z{b*^l28Rfu9P^_$m{BGt7!O)h)e3|hK zpKjj3D!+X_FR1=QdTXe6+*GiYU(ASEr!W1UHUC*yz*rhWIZsdo9ZmKU{wlkp`@YF= z!qC%!s^>w?a+CC6?)K-D8PlnbX6sBpEMniIu&%&12bFl?dFqp!hh@|U>+KUKqEjbA zEWOwk4PP-Ns}*D2tts{SU9o`rDF4j8lXs+YJJSMhS@)sc^JxO&<`O62oWVZ;5SHHB literal 0 HcmV?d00001 From 651710929abdcafa0ed74c7bb75ce2ca775aa054 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 17:04:29 +0800 Subject: [PATCH 77/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E6=96=B0=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/contests/show_softapplication.html.erb | 2 +- app/views/softapplications/new.html.erb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/views/contests/show_softapplication.html.erb b/app/views/contests/show_softapplication.html.erb index f320393ea..14c907d82 100644 --- a/app/views/contests/show_softapplication.html.erb +++ b/app/views/contests/show_softapplication.html.erb @@ -68,7 +68,7 @@ diff --git a/app/views/softapplications/new.html.erb b/app/views/softapplications/new.html.erb index d7ea95799..d5ff2c9c2 100644 --- a/app/views/softapplications/new.html.erb +++ b/app/views/softapplications/new.html.erb @@ -1,6 +1,5 @@ -

<%= l(:label_release_softapplication)%>

From 25bbf791f9f4a18864df279e3b920931a93bde36 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 17:53:22 +0800 Subject: [PATCH 78/94] dsfsd --- app/views/softapplications/show.html.erb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index c2cea19b5..047ecf8dc 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -28,16 +28,15 @@
- + - - -
<%= image_tag(url_to_avatar(@project), :class => 'avatar2') %>
<%= @project.name %> diff --git a/lib/redmine.rb b/lib/redmine.rb index 88d6f73ee..8ecf91cc1 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -279,7 +279,7 @@ 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 :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 } From 8f6d9fc6a58a077eb333bea7a37f8a00628813c6 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 10:46:29 +0800 Subject: [PATCH 74/94] 0418 --- Gemfile | 1 + Gemfile.lock | 4 ++++ app/helpers/application_helper.rb | 4 ++++ app/models/softapplication.rb | 2 ++ app/views/layouts/base_newcontest.html.erb | 5 +++-- app/views/softapplications/show.html.erb | 4 ++++ config/application.rb | 1 + public/javascripts/application.js | 1 + 8 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index dd19b4435..dc4db9c84 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,6 @@ source 'https://rubygems.org' +gem "seems_rateable" gem "rails", "3.2.13" gem "jquery-rails", "~> 2.0.2" gem "i18n", "~> 0.6.0" diff --git a/Gemfile.lock b/Gemfile.lock index d60847b17..42cb62272 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -79,6 +79,9 @@ GEM rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) + seems_rateable (1.0.13) + jquery-rails + rails sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -109,3 +112,4 @@ DEPENDENCIES rails (= 3.2.13) rdoc (>= 2.4.2) ruby-openid (~> 2.1.4) + seems_rateable diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 9b3a672c3..dd900bf37 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1601,5 +1601,9 @@ module ApplicationHelper end content_tag :ul, content_li.html_safe end + + def current_user + User.current + end end diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index fa90881bf..603279fbd 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,6 +1,8 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers acts_as_attachable + seems_rateable :allow_update => true, :dimensions => :quality + seems_rateable_rater has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index f8c7056b6..c0e23bf21 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -8,8 +8,9 @@ <%= csrf_meta_tag %> <%= favicon %> - <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %> + <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> + <%= seems_rateable_stylesheet %> <%= javascript_heads %> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> @@ -148,7 +149,7 @@
- +
+ + + +
<%= render :partial => 'tags/tag', :locals => {:obj => @contest, :object_flag => "7"}%> diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index 0e2ee738d..fcd746776 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -34,6 +34,10 @@ 开发人员:<%= @softapplication.application_developers %>
rate: <%=rating_for @softapplication, :dimension => :qulity %>
<%= l(:field_occupation) %>:<%= @user.user_extensions.school.name %><%= l(:field_occupation) %>: + <% unless @user.user_extensions.school.nil? %> + <%= @user.user_extensions.school.name %> + <% end %> +
开发人员:<%= @softapplication.application_developers %>
rate: <%=rating_for @softapplication, :dimension => :qulity %>

- <%= link_to '发布应用', new_softapplication_path(:target=>'_blank'), :target=>'_blank' %> + <%= link_to '发布应用', new_softapplication_path(:target=>'_blank'), :target=>'_blank' %>

系统支持:<%= @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 %>
@@ -82,5 +81,5 @@
-<%#= link_to '返回竞赛页面', show_softapplication_contest_path(contest)) %> +<%#= link_to '返回竞赛页面', show_softapplication_contest_path(@softapplication.contest) %>
From bdefa322cc0928ca844cf6a8f7cf9fd8b77fc2b0 Mon Sep 17 00:00:00 2001 From: kg Date: Fri, 18 Apr 2014 17:57:11 +0800 Subject: [PATCH 79/94] modify foot --- app/controllers/welcome_controller.rb | 1 + app/views/layouts/_base_footer.html.erb | 31 +++++++++---------- .../stylesheets/application.css | 21 ++++++++++--- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 31168595e..5e00642a1 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 diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index 0c1867a98..98baaf169 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -1,31 +1,28 @@
diff --git a/public/themes/redpenny-master/stylesheets/application.css b/public/themes/redpenny-master/stylesheets/application.css index cc321a425..748b8aab4 100644 --- a/public/themes/redpenny-master/stylesheets/application.css +++ b/public/themes/redpenny-master/stylesheets/application.css @@ -542,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 @@ -2234,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 From 647081539c8f7101701a7d6c19e93d3393748000 Mon Sep 17 00:00:00 2001 From: xianbo Date: Fri, 18 Apr 2014 19:50:42 +0800 Subject: [PATCH 80/94] fix --- app/helpers/activities_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 982ff342fdfb6cbc707a7981436a753ac3b915d1 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Fri, 18 Apr 2014 22:18:04 +0800 Subject: [PATCH 81/94] =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8F=82=E8=B5=9B=E9=A1=B9=E7=9B=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/redmine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine.rb b/lib/redmine.rb index 43e47a26a..2c935074b 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -279,7 +279,7 @@ 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 :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 } From 7efaa8aba3e764929d9b4a2b88b8a04880eb2e7d Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 09:13:08 +0800 Subject: [PATCH 82/94] gitignore idea --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index daa8b3ace..cf96fa998 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /.project +/.idea /.bundle /config/database.yml From bbf4f25a02cfbf94026883e5792233a8f6e4c4ba Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 09:16:23 +0800 Subject: [PATCH 83/94] idea/: --- .idea/.generators | 8 - .idea/.name | 1 - .idea/.rakeTasks | 7 - .idea/encodings.xml | 5 - .idea/misc.xml | 5 - .idea/modules.xml | 9 - .idea/scopes/scope_settings.xml | 5 - .idea/trustie2.iml | 65 --- .idea/vcs.xml | 7 - .idea/workspace.xml | 989 -------------------------------- 10 files changed, 1101 deletions(-) delete mode 100644 .idea/.generators delete mode 100644 .idea/.name delete mode 100644 .idea/.rakeTasks delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/scopes/scope_settings.xml delete mode 100644 .idea/trustie2.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/.generators b/.idea/.generators deleted file mode 100644 index 48c69bb77..000000000 --- a/.idea/.generators +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 2327e6ef0..000000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -trustie2 \ No newline at end of file diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks deleted file mode 100644 index 212558e83..000000000 --- a/.idea/.rakeTasks +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index e206d70d8..000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 12817166a..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index eb86c781f..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml deleted file mode 100644 index 922003b84..000000000 --- a/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/trustie2.iml b/.idea/trustie2.iml deleted file mode 100644 index 897cad7ea..000000000 --- a/.idea/trustie2.iml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index c80f2198b..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 2bb1461a3..000000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,989 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CSS - - - Code style issuesJavaScript - - - Control flow issuesJavaScript - - - JavaScript - - - JavaScript function metricsJavaScript - - - JavaScript validity issuesJavaScript - - - Potentially confusing code constructsJavaScript - - - Ruby - - - SQL - - - - - CoffeeScript - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1397784941950 - 1397784941950 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 369c015097252aee0aedc5900a1bd1568e220355 Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 09:42:48 +0800 Subject: [PATCH 84/94] board show --- app/views/boards/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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} %> From 2c7615b545af315267ad7380e31df491657b602a Mon Sep 17 00:00:00 2001 From: xianbo Date: Sat, 19 Apr 2014 10:04:55 +0800 Subject: [PATCH 85/94] fix robots rule --- app/views/welcome/robots.html.erb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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/ From 3d02cb7ce0147357d30b204052bbf1d5a2f5e2cd Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 10:56:18 +0800 Subject: [PATCH 86/94] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=83=A8=E5=88=86=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/softapplication.rb | 3 +-- app/views/layouts/base_newcontest.html.erb | 2 +- app/views/softapplications/show.html.erb | 5 +---- app/views/welcome/contest.html.erb | 5 +++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 603279fbd..71caf059c 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,8 +1,7 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers acts_as_attachable - seems_rateable :allow_update => true, :dimensions => :quality - seems_rateable_rater + has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index c0e23bf21..9813905ca 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -10,7 +10,7 @@ <%= favicon %> <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> - <%= seems_rateable_stylesheet %> + <%= javascript_heads %> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index fcd746776..5ddd752d3 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -34,10 +34,7 @@ 开发人员:<%= @softapplication.application_developers %> - - rate: <%=rating_for @softapplication, :dimension => :qulity %> - - + diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index f3d7f092e..38afd6091 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -154,8 +154,9 @@

- <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %>) - <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %>) + + 发布时间:<%=format_time contest.created_on %>
From a4ab29f49dff0648495f3cbe78e66afaacb0bfd1 Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 11:04:44 +0800 Subject: [PATCH 87/94] footer logo modify --- app/views/layouts/_base_footer.html.erb | 10 +++++----- public/images/footer_logo/buaa_scse.png | Bin 0 -> 7040 bytes public/images/footer_logo/inforbus.png | Bin 0 -> 6154 bytes public/images/footer_logo/iscas.png | Bin 0 -> 5361 bytes public/images/footer_logo/nudt.png | Bin 0 -> 7383 bytes public/images/footer_logo/peking_eecs.png | Bin 0 -> 5215 bytes 6 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 public/images/footer_logo/buaa_scse.png create mode 100644 public/images/footer_logo/inforbus.png create mode 100644 public/images/footer_logo/iscas.png create mode 100644 public/images/footer_logo/nudt.png create mode 100644 public/images/footer_logo/peking_eecs.png diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index 98baaf169..bba5b2166 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -15,11 +15,11 @@

diff --git a/public/images/footer_logo/buaa_scse.png b/public/images/footer_logo/buaa_scse.png new file mode 100644 index 0000000000000000000000000000000000000000..c224a5668ad965a530536f3f856d99fd6eb83536 GIT binary patch literal 7040 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 P00000NkvXXu0mjfx_TT? literal 0 HcmV?d00001 diff --git a/public/images/footer_logo/nudt.png b/public/images/footer_logo/nudt.png new file mode 100644 index 0000000000000000000000000000000000000000..68ff07fe0fc51756342f41bac2c5542298d6a178 GIT binary patch literal 7383 zcmV;|94O<7P)FgJ7n030t# zL_t(&f$e&Cm{e7^@7gETIj3^2>QJ2<=q5E16a^Io1#wJQ9Wjo|;3%fi>*#ev#d)R? zpNSbRU<3@Hh@gmQD_LSg(+zYE)v0nmRp-EVh)pyojXN6zw zwf5P2BaAWp6aP3M{-+)IC(gt_3Hb*D^_PUt{PB6qu8w^RcpW(_EM#4nP#Xx)G9)Ig zG)0$F6xGR7><8;!{qWQOE{Fer2Rhk9WLX9P0Gg&@0Q#xh@4n|2LeuIbjcP5lS_ec; zdglCz7d&|X4fpJN?A6C>x_W!>A_+2|5|U{})pQ2V`0?kje|QK0K+$BN2>QP_5QN|_ z^+PnA0MIbtw!bjuue{^`7EDu$U}V{dQJ6&M?CUu8uDYZDljMx~GZfPHAn{wO#y8j-#+3K>JY*Hc}tNmc}nxc-O zo<(_#DULH1O}}IIl7ruFVi{KVw+3QD47wG$&;=vsOgj6R5(1D1{VTGdI}kb%Fq+~3 z|_1<>a62@(55lDn;c6{f{~XvZI@k9SuXypA!G@uYV2TgWHHwejUg# z`YbU5sz5#%sar1j#QGeUU96*-S=mSgAPxRA#wwabl88}n`0cGD)4B8~S5CS7&iQli z+O^=N$Ir_N!oS4QF%Jji4vi%C%91?6X0?>)dHxeoO1l#o@gkDaVTZ%wh=hXv)i1pB z>~#;_{BST6nYMlT=F9&Y8P=(#Ac@&8867iQBV-Uo?FD&2eH{14P6YyE0V-T0rfC@0 z=Tr#-Te}OfiU&~*1)id^BZ2VHsLMx9LO(>hK!>TJq56)ea2_usYpr0k^LH8y+zOsG z?k#r>f7-wle)s7ci}M&`KnOw6g;lR{oIc$4)uBJ2Iy7fwMctcHK7U0r5N`_Z8vs;@ zY_*fdt&1k(krBg3{>#CJA8z1{{71o1XbEl<7n~|@3IM7?@9BN+TZQJ}6F7>WJ0rNxgr;ih@>PG*4aLI`c^!otwlsYA`6G)T zyDv1*9wq~fbVQfGo01_1ydqm~&MQ*_+0iO(05djS;b+oX{2fETs_0BG67wTOWG8J2si zs-SYKASR~nYuh{r$P;q}V+{RK|AGFL{}W+jyHMbS3C7|cE-RQ; zNo{6R+mVlp-Nn-_4F46z;;J)x4Fv!eZYxPL0A9GzQCo6mpem?XQwanZj0_JtQWuwU z*`xd04_tt3=!%oG9sq!#DHc9IxNW}GYT5bLvu{3X>REl_?#J&d0RUL@;#>QxNY|ZxiO`MFNVK-tRrK8VOE=tvRAt<4 zPs}fevn;KV5mlSVdws}g9G=l~LmaDrjb{uUm{0-ia2WuAw|0Eq;dB-wf*^p9zUr)R zS?_WBT7f)K5*X4RFEYAU6ni}z_P4b@PO9{Dn$-1-zv|ppgb)A)qX?21O=y%~M;gD0 z3(?UCX)i)Gcg`tC0+LZh+Jw8--Tg4fy5?sk1u%h9zF{NaysM@#HiP~GIV-)HSEX-A zg1Fwmn=B4{`7*-bh@GCqX_uc5KtYkF<-y=Cm>R{&GhKl*VtGxd`mnXeeALauDcbp`p<%~@P_q^SG{}sJ1r*1U}Jk@ z?UsXEUbfraeW2Hsos>QQ;^J&77h6csh@U(2_B|^<_;8rRWDSOs;kf{yok0eV07mdz zJRZ-&VZO3YGx?NbC>faSHhW(%@y0B8xlxElV4w_xqL5!wVlDV?)`S^NXoB8$r03B0 zz`)f208)1(5t0Y=Tbp*g5zk0ByNuogWzNd?>ulprtdw}P(#RVmIiGuUSJO^cEE`|X za=N~<(hBX4nZE>7iY9;=o*;mOw32;U2WTnJ=)Vr7W0$zhF6d1RT+3V7X<}Xon)Un^ zx7~42BWcYa4PNUpx#mMHeWI^;k#5I8<3fsN7Rj0lI-t{#BaElVj4_7U6KAe3bQXQa z5#(wzBdxh;?DXS4kFT8|kOIPK`I&vsH4oWLmYR-$|JH;MXU0^HT{CCWWw(8`^Q(J( zo}vLoMFC%-FPzN9r@ph{-8u1WZ1xkkK6053F{u4`_h3PBfxXFpe6q*p+} z^&cg3Dc@jI>tx)6;ex9!JWtib{mE=b2qZ$4@mTmU1f>UGSo8)gS^wt+ec_(PpytCP zD<|JFvS5U^t7Z59?mN)*A&%fbPP+C2lfr2A@nkG9luWH94E%1F!yvFZx+j-cMy93E zk-VgU%~td)tO=JS(vh27dgoiRBHq=zxf{?3-Q=nfBbG>tNK=UX-eI;uEG1kOPp9~3 zH1HUyD$8e1ycE7ay5k#~WiOE-4`No>3TgEzXpy&{ENK(3yBHW26?%*=OHJvB*5zNn zTgvE|Um0}fIAFB?*p7XL5QA+e#}gXXZa3(yuah#|H=?BaYlq#na_ipuxxT{UhIB4& zJ=AmXp)dD*vEtMEb-#{gQx{9J3~z5(`Q+;Qb${@S!B-A+G+gH^Dp?zfCnnbouk$C8 zVQV5Q9GOr%=_UhX*z~7Q-@oo88MX>1fWveiK@(sw8D6bm978(b;}mN;)}QXvV~v=i zs<;<=0ho&mJ>A)%`&2|E(_-dIilQ%MIc_-)U})`XsU{J=o27Y%rLB7_trg9!fn!sX zQlt*-Fu{F(jU|#z-%((;-FI%)xihAZn$~vp=-FcT>cicyUAh{Fqd_A>F#D_)OHZ+* zXz;N~_us6DxfPjw?n?i$o?-w1NaSe=R5u2)HX|f23dDo7tmGAjM2#>YtWlaoNQp^< z!|d8Gs}=k84MGUboL>#u;Lz@CF1&P-fwyfs*nV)~Jx|;NPLucftb!b1 zHkPB&2*A!fn$1c)0q~_L=Upj57{f9Adv>$+Ef7Hl0NAy6Tc&>?^lx%BGJ-(_MAFIU z(Rj~K^~Va}usW_6iM%_K7}y2?0Lkb`F|B0>qtO;rfB+RE3i(cJ>Ux8|@!x*)i2l)q z4?BTEK2k?#Ry_B{cYU$G@eFM#>)CL$s=Bc1L!M*7>u?>d)7#62 zb@X&kkk#zUvY9T*9~pc#oroWVRC*h90|3p{=#cJ+!)#im<5)zJIyaWpKt7wu0tOoZ z0Petmn`2z%s>gkk*W~kW`ThKbBg-mYUHS!UOfR9?=D z`IE*xHZv$Hj;1q7UY2r21W8O1DWV2w2xW4a#hG;Sb43+R(PX^D2HY~EqC`bSRAQJ-M$QD`6PWa>e-~PMG7_K(y%~$9ctpoRBz-bI1in}O+z#LV>W-Hw80pviD5m(eFu5k(MW0s}Rx z$n7ondR)K@8F zGLHp>#Ge?J>A?(F2LL7jfZA)Of_a4RUPO|m{oS4SBqEV1LM#cK)p#NBx+BPotQccx z?p;|P4uv+SQyI{k$cvmN^9DgkemBtFS$F)0BTqs5X@oGOu2Riu@u6_2Qplxr2vFro z;pbb{%)Mmdj8*=CKT%*Wh)y3r?W@_7X8n0gSxtX3lNj~LE%!ev%5v?~uRO=0AD6dk zUMm2g#r{ZeST>W>lbAeZP6`V^BQ%PqDc~7yNujy$X;Q%es&=`aW9M-+H!Yo$l1fGr zHHw(k9qlhIb(O9%vU)@i=;KH-CW8Vy0RXac_Va{3{VmY25&$5Y?wiUR7#9HK000^S zjmkrJFWfPA>TU9@v6qF9FZ%YQQ_XV_L?M@Xz-hHE-n?(?`4;Tnm`*1a8ckL(yGl~c zRTZ-=)fEvyc<;bK*XMz+d%7N(aTSO;@exFj69FI$0Kn1==otORd~bLjZWC2}SOQ4r zZzX^PtJOUUM7SIPpmTc@+1k~)BCp9$>LjG26w(2L^k>|T0S{sI^rlYnyx}NdEo|gD zlF^Y`Hk+*hfXx5^#YKgEpKSSbfsr$L%e{s5{gJ*Il9uZ9$6dYs09E<<2d zebWuBJ_)rD006*;G?;z+OA5eL%RE@+t$yfm=YcQbh};DL@bdf1F7o(Ft_sJ4`%Xjx(6FW+po(6F zhfe!y_rpqo7^HG$(=@01{TaMBY?oa6Y-v=G!9(d}(WBWeb z{F6dTDW+-Wke1B+{-o`*ZPjB90|2~ZG|hM?lm7P9b5x4JSzbENV9-0XNa_KcKKnL5 z!WhFv^Dh5GaY3<qgABWI80XHW^K(E5S&WmNuN!$jOR?(Ry&L=f9`(P~h8GHe1~>R|!{2{q zf)GMb0Jj1GI_QUGKX>jz007uo)4EtVs*WE%?nqJy-Cf}Iwq_*hx1)U zzSX6!!j(cs;H-MbUXQJyeN5?y`T}?HD__02zOJRUc{)RJwJdEgm|26-Vl;R7;~{qK z%WF2D)hYnQjs<@>Nd^D_#`rKE#PxqK89zeQ@r+FAXgm}N{uk8$IxxmVcmV&G$oNqo z;{p60?!!Mz2Eb`2hUedT>BA*XpQ+I4@b*Odrxn->Uke4orfgmqC@3y$A~Dvw2mQ6h z9$$MRkt{TrOvf{c_y{4NDJ!uRr=n7#Hk6FqIJSKB>&RGxEs~r^I-0@A zfuP7#0DWBp006*`Dgc%sAlV)THG6`Ce|`K>@VYADw-5aq001tWFdDY|j{y!UP%-lY zP*MqqMdI+_EjPjUoqHhA7KV;J$AO<{CCUm)mMMfLwY4Zo3`q zK*5f6+fN1VEG&hB8Visr2}Tv5Ze$&NooNMzV4z561E3H9gJIu+LlD{B30OIir$x{H z0hly~hG;9S-MSid4i}VGRY1#<-SE`&4?=`TaG_PBwR#^AZx}OLE0GM*?B`^9MMc7^BqlO~>SyqGjGeyBe zStZYtK*SlAO%Nnf@>zw;NrFYsuoOW^crcy5(P^*+%RIhswm0mW$&>8c8<(!#cslbF zu9$oQLo)+MdJcA*83O9Y%^GJhTYa&wbRiuZS)1y?v`es+v<_Z%c=sK4t`x{Gni{QlkpH% zsbe-koX=NoKhS>6+1As_YBCPqaoxN&9i@^VZ(rj*+;I%49r2#)XI(`e?dvHfZRUZi zCr{TMX=<+Wd5ZI|KJ)U?GcGyoc>mkqop;+MPbKmhPfgW`jYFYS%&VcDJtHFG-)_x^mvmRKF zq6$TbAv3_V zu?GFNKzQIdi;>Ey#=3G(m6Ee&m(#q_S5R1ZS4t6g?P)x)hozXy@<`4Bz|sG7R`J7o z-#(KSvh{lp?=R3ayiLz=d&d-yXe9wT5{dZD2;<42ba<{L=Pxa^xqqGb!;ayiMykbD9_?eGVCYQmA|7z&XbfeDvQ?ne&KU}ahjTPX8O?@%6K@X5c{OY2%=(}hv$S=0iHa=7 zC|b8?`#bep0RU80MkGo9r>=G5g|{7Cw{0zLHrPx98PVG39|$y3JB|;jxd;%L;|-=Z zF_zhlRL$cy+0AhwE2T4nud{nl@AA561JAdP95$j=RHbzN&h0YDAWDeX(KgU#vF@|E zc*2~}0kb`m&*=z`>(WUu7>_2I{#5jU7EkkxtXksHP@mUZAsbo4cLD{tHx>VqYj4lf zH1`9oBlluWrD=uCsIuIV&ZT;?Nzvl0Fn1cf)%&}pA)UgK`kW$Tq>+RW&q@=EC-iI@ ztp5NUsMI43M#$qM&-7#~2>}3japBSo0DJ@hF!jz$$8nl&oIf&HnG*!F-E0cwRe5tsS>@q> zf8?dX)Ai0q1^__g!M%kOE625~6e6@}mm4I_a_DfEFPcrn#+@^9<1}AnbWv784VC4Y_~hAF@002ov JPDHLkV1lCc6&(No literal 0 HcmV?d00001 diff --git a/public/images/footer_logo/peking_eecs.png b/public/images/footer_logo/peking_eecs.png new file mode 100644 index 0000000000000000000000000000000000000000..13638d5f0c41059e978a0a536cf18fcb400d97a4 GIT binary patch literal 5215 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 Date: Sat, 19 Apr 2014 11:22:33 +0800 Subject: [PATCH 88/94] modify pku.png --- public/images/footer_logo/buaa_scse.jpg | Bin 31121 -> 0 bytes public/images/footer_logo/inforbus.jpg | Bin 3066 -> 0 bytes public/images/footer_logo/iscas.jpg | Bin 2602 -> 0 bytes public/images/footer_logo/nudt.jpg | Bin 3333 -> 0 bytes public/images/footer_logo/pdl.jpg | Bin 3333 -> 0 bytes public/images/footer_logo/peking_eecs.jpg | Bin 22936 -> 0 bytes public/images/footer_logo/peking_eecs.png | Bin 5215 -> 5229 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/footer_logo/buaa_scse.jpg delete mode 100644 public/images/footer_logo/inforbus.jpg delete mode 100644 public/images/footer_logo/iscas.jpg delete mode 100644 public/images/footer_logo/nudt.jpg delete mode 100644 public/images/footer_logo/pdl.jpg delete mode 100644 public/images/footer_logo/peking_eecs.jpg diff --git a/public/images/footer_logo/buaa_scse.jpg b/public/images/footer_logo/buaa_scse.jpg deleted file mode 100644 index 68ebbc1d3fb03ecac6b9cced609560a870bf9203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31121 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 diff --git a/public/images/footer_logo/inforbus.jpg b/public/images/footer_logo/inforbus.jpg deleted file mode 100644 index f3249be16837447eb4c68c3bc60fd8e9e6180272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3066 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 RJ6x@U98`FckHXVO{{izZ$A|y` diff --git a/public/images/footer_logo/iscas.jpg b/public/images/footer_logo/iscas.jpg deleted file mode 100644 index a26ccad3822973ccff743ab9511e7e0b6511067e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 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 nqnM$wg_ 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 nqnM$Ab~;y-g{j*cSl0DHfC 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 diff --git a/public/images/footer_logo/peking_eecs.png b/public/images/footer_logo/peking_eecs.png index 13638d5f0c41059e978a0a536cf18fcb400d97a4..6c7164f08c1e8b990a4fdb319b0752e8a26c57c8 100644 GIT binary patch delta 5129 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 From 8775eab3dd5ead1f7c97884d77579334dc2ddaff Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 12:47:59 +0800 Subject: [PATCH 89/94] iscas modify --- public/images/footer_logo/iscas.png | Bin 5361 -> 4857 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/footer_logo/iscas.png b/public/images/footer_logo/iscas.png index f81fda8ceaaa5419f689907c454c4a19e35f66b6..f3cbac371f21ab19c19a48b88384279c390cef76 100644 GIT binary patch delta 4770 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 delta 5278 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 From 43064c4bc24726776cd645a519fc9c2b0c0ec58b Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 13:10:25 +0800 Subject: [PATCH 90/94] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E9=A6=96=E9=A1=B5=E4=B8=AD=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E7=AB=9E=E8=B5=9B=EF=BC=9A=E6=97=A2=E6=9C=89=E6=97=A7?= =?UTF-8?q?=E7=9A=84=E7=AB=9E=E8=B5=9B=E5=8F=88=E6=9C=89=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E7=AB=9E=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/welcome_helper.rb | 17 ++++++++++++++++- app/views/welcome/contest.html.erb | 7 +++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/helpers/welcome_helper.rb b/app/helpers/welcome_helper.rb index 10e8a4471..9970ee9c6 100644 --- a/app/helpers/welcome_helper.rb +++ b/app/helpers/welcome_helper.rb @@ -98,7 +98,14 @@ module WelcomeHelper end def find_all_hot_contest limit=10 - Contest.reorder("created_on DESC").all.take limit + # 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 @@ -224,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 @@ -278,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/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 38afd6091..27ab04e1a 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -138,7 +138,7 @@ <%= link_to "更多>>", {:controller => 'contests', :action => 'index', :host => Setting.contest_domain}, :target => "_blank" %>

- <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[5]) %> + <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[8]) %>
  • @@ -146,7 +146,7 @@
    - <%= link_to(contest.name, show_contest_contest_path(contest.id), :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %> + <%= link_to(contest.name, contest.event_url, :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %>
    @@ -154,8 +154,7 @@

    - + 发布时间:<%=format_time contest.created_on %>
    From edb5dac785ac944c082fb5d3fe845e61f26785ef Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 14:19:21 +0800 Subject: [PATCH 91/94] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2=E4=B8=AD=E7=9A=84=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/contests/_contest_list.html.erb | 21 +++++++++++---------- app/views/contests/index.html.erb | 2 +- app/views/welcome/contest.html.erb | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb index 4fb2865c8..fb3ddd115 100644 --- a/app/views/contests/_contest_list.html.erb +++ b/app/views/contests/_contest_list.html.erb @@ -6,7 +6,7 @@ - + - @@ -29,13 +29,14 @@ +
    +
    <%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>:  <%= link_to(contest.name, show_contest_contest_path(contest), :class => 'bid_path') %><%= 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") %>
    @@ -18,8 +18,8 @@
    <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %>) - <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %>) + <%= l(:label_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") %>)
    -
    - - - - -
    <%= contest.description%>
    -
    + + + +
    +
  • + diff --git a/app/views/contests/index.html.erb b/app/views/contests/index.html.erb index 3a7bde1e5..670ba27cf 100644 --- a/app/views/contests/index.html.erb +++ b/app/views/contests/index.html.erb @@ -7,7 +7,7 @@ <% 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') %> + <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add', :target => "_blank") %> <% end %> <% end %> diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 27ab04e1a..8c0addb8d 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -138,7 +138,7 @@ <%= 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[8]) %> + <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[6]) %>
  • From 9034dd09e711955a34b0f8b4b8bf062bdf3e38cb Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 08:39:49 +0800 Subject: [PATCH 92/94] =?UTF-8?q?=E5=BC=80=E5=90=AF=E9=87=8D=E5=90=AF?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=9C=A8=E8=AF=BE=E7=A8=8B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_set_course_time.html.erb | 5 +++-- app/views/projects/finishcourse.js.erb | 2 +- app/views/users/_course_form.html.erb | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) 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/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/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)) %> From 9a580655ab34a8fd04ba4027f43356a530c865f6 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 21 Apr 2014 09:22:46 +0800 Subject: [PATCH 93/94] =?UTF-8?q?=E5=9C=A8project=E7=9A=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=8A=A8=E6=80=81=E7=9A=84=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E9=A1=B5=E6=98=BE=E7=A4=BA=E9=A1=B9=E7=9B=AE=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/projects/show.html.erb | 57 ++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index 3ca41d072..eb66efc73 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -1,4 +1,4 @@ - +<% if @events_by_day.size >0 %>

    @@ -40,26 +40,31 @@

    + <% 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 -%> - -
    - - - - - -
    <%= 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) %> -
    -
    +
    - +<% else %> +
    + + + + + +
    <%= 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 %> From dd09c36a8fbd579c5943efc2bd0bb8e9d6e138f9 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 21 Apr 2014 09:32:55 +0800 Subject: [PATCH 94/94] Added the message of creating the project in the project's activities --- db/schema.rb | 242 --------------------------------------------------- 1 file changed, 242 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index b4a9ba972..bfbb7a26e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -23,15 +23,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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 => 20140417091429) 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 => 20140417091429) 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 @@ -293,14 +265,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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 @@ -322,137 +286,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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 => "" @@ -685,22 +518,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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" @@ -716,19 +533,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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" @@ -808,23 +612,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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 @@ -977,22 +764,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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 @@ -1042,19 +813,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) 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"