diff --git a/app/assets/javascripts/apply_project_masters.js b/app/assets/javascripts/apply_project_masters.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/apply_project_masters.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/no_uses.js b/app/assets/javascripts/no_uses.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/no_uses.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/open_source_projects.js b/app/assets/javascripts/open_source_projects.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/open_source_projects.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/apply_project_masters.css b/app/assets/stylesheets/apply_project_masters.css new file mode 100644 index 000000000..afad32db0 --- /dev/null +++ b/app/assets/stylesheets/apply_project_masters.css @@ -0,0 +1,4 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ diff --git a/app/assets/stylesheets/no_uses.css b/app/assets/stylesheets/no_uses.css new file mode 100644 index 000000000..afad32db0 --- /dev/null +++ b/app/assets/stylesheets/no_uses.css @@ -0,0 +1,4 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ diff --git a/app/assets/stylesheets/open_source_projects.css b/app/assets/stylesheets/open_source_projects.css new file mode 100644 index 000000000..afad32db0 --- /dev/null +++ b/app/assets/stylesheets/open_source_projects.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/apply_project_masters_controller.rb b/app/controllers/apply_project_masters_controller.rb new file mode 100644 index 000000000..9e5c52348 --- /dev/null +++ b/app/controllers/apply_project_masters_controller.rb @@ -0,0 +1,114 @@ +class ApplyProjectMastersController < ApplicationController + + before_filter :require_login, :find_apply, :only => [:create, :delete] + + # GET /apply_project_masters + # GET /apply_project_masters.json + def index + @apply_project_masters = ApplyProjectMaster.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @apply_project_masters } + end + end + + # GET /apply_project_masters/1 + # GET /apply_project_masters/1.json + def show + @apply_project_master = ApplyProjectMaster.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @apply_project_master } + end + end + + # GET /apply_project_masters/new + # GET /apply_project_masters/new.json + def new + @apply_project_master = ApplyProjectMaster.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @apply_project_master } + end + end + + # GET /apply_project_masters/1/edit + def edit + @apply_project_master = ApplyProjectMaster.find(params[:id]) + end + + # POST /apply_project_masters + # POST /apply_project_masters.json + def create + # @apply_project_master = ApplyProjectMaster.new(params[:apply_project_master]) +# + # respond_to do |format| + # if @apply_project_master.save + # format.html { redirect_to @apply_project_master, notice: 'Apply project master was successfully created.' } + # format.json { render json: @apply_project_master, status: :created, location: @apply_project_master } + # else + # format.html { render action: "new" } + # format.json { render json: @apply_project_master.errors, status: :unprocessable_entity } + # end + # end + + set_apply(@apply, User.current, true) + + end + + # PUT /apply_project_masters/1 + # PUT /apply_project_masters/1.json + def update + @apply_project_master = ApplyProjectMaster.find(params[:id]) + + respond_to do |format| + if @apply_project_master.update_attributes(params[:apply_project_master]) + format.html { redirect_to @apply_project_master, notice: 'Apply project master was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @apply_project_master.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /apply_project_masters/1 + # DELETE /apply_project_masters/1.json + def destroy + @apply_project_master = ApplyProjectMaster.find(params[:id]) + @apply_project_master.destroy + + respond_to do |format| + format.html { redirect_to apply_project_masters_url } + format.json { head :no_content } + end + end + + def delete + set_apply(@apply, User.current, false) + end + + private + + def find_apply + klass = Object.const_get(params[:object_type].camelcase) rescue nil + if klass && klass.respond_to?('applied_by') + @apply = klass.find_all_by_id(Array.wrap(params[:object_id])) + end + render_404 unless @apply.present? + end + + #flag标注功能,为1时设置‘申请版主’,为0时设置取消 + def set_apply(objects, user, flag) + objects.each do |object| + object.set_apply(user, flag) + end + respond_to do |format| + format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + format.js { render :partial => 'set_apply', :locals => {:user => user, :objects => objects} } + end + end +end diff --git a/app/controllers/no_uses_controller.rb b/app/controllers/no_uses_controller.rb new file mode 100644 index 000000000..f66997107 --- /dev/null +++ b/app/controllers/no_uses_controller.rb @@ -0,0 +1,111 @@ +class NoUsesController < ApplicationController + + before_filter :require_login, :find_no_use, :only => [:create, :delete] + + # GET /no_uses + # GET /no_uses.json + def index + @no_uses = NoUse.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @no_uses } + end + end + + # GET /no_uses/1 + # GET /no_uses/1.json + def show + @no_use = NoUse.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @no_use } + end + end + + # GET /no_uses/new + # GET /no_uses/new.json + def new + @no_use = NoUse.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @no_use } + end + end + + # GET /no_uses/1/edit + def edit + @no_use = NoUse.find(params[:id]) + end + + # POST /no_uses + # POST /no_uses.json + def create + set_no_use(@no_use, User.current, true) + + # respond_to do |format| + # if @no_use.save + # format.html { redirect_to @no_use, notice: 'No use was successfully created.' } + # format.json { render json: @no_use, status: :created, location: @no_use } + # else + # format.html { render action: "new" } + # format.json { render json: @no_use.errors, status: :unprocessable_entity } + # end + # end + end + def delete + set_no_use(@no_use, User.current, false) + end + + # PUT /no_uses/1 + # PUT /no_uses/1.json + def update + @no_use = NoUse.find(params[:id]) + + respond_to do |format| + if @no_use.update_attributes(params[:no_use]) + format.html { redirect_to @no_use, notice: 'No use was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @no_use.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /no_uses/1 + # DELETE /no_uses/1.json + def destroy + # @no_use = NoUse.find(params[:id]) + # @no_use.destroy + + set_no_use(@no_use, User.current, false) + + # respond_to do |format| + # format.html { redirect_to no_uses_url } + # format.json { head :no_content } + # end + end + private + + def find_no_use + klass = Object.const_get(params[:object_type].camelcase) rescue nil + if klass && klass.respond_to?('no_use_for') + @no_use = klass.find_all_by_id(Array.wrap(params[:object_id])) + end + render_404 unless @no_use.present? + end + + #flag标注功能,为1时设置‘没有帮助’,为0时设置取消 + def set_no_use(objects, user, flag) + objects.each do |object| + object.set_no_use(user, flag) + end + respond_to do |format| + format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + format.js { render :partial => 'set_no_use', :locals => {:user => user, :objects => objects} } + end + end +end diff --git a/app/controllers/open_source_projects_controller.rb b/app/controllers/open_source_projects_controller.rb new file mode 100644 index 000000000..4feca7b27 --- /dev/null +++ b/app/controllers/open_source_projects_controller.rb @@ -0,0 +1,190 @@ +class OpenSourceProjectsController < ApplicationController + + before_filter :find_osp, :only => [:master_apply, :accept_master_apply, :refuse_master_apply] + before_filter :require_master, :only => [:master_apply, :accept_master_apply, :refuse_master_apply] + + helper :sort + include SortHelper + helper :apply_project_masters + include ApplyProjectMastersHelper + helper :no_uses + include NoUsesHelper + # GET /open_source_projects + # GET /open_source_projects.json + def index + @app_dir = params[:app_dir] + @language = params[:language] + @created_at = params[:created_at] + per_page_option = 10 + + @open_source_projects = OpenSourceProject.filter(@app_dir, @language, @created_at) + @open_source_projects = @open_source_projects.like(params[:name]) if params[:name].present? + + @os_project_count = @open_source_projects.count + @os_project_pages = Paginator.new @os_project_count, per_page_option, params['page'] + + @open_source_projects = @open_source_projects.offset(@os_project_pages.offset).limit(@os_project_pages.per_page) + + # @open_source_projects = OpenSourceProject.all + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @open_source_projects } + end + end + + def master_apply + @apply = @open_source_project.apply_tips + @applicants = @open_source_project.applicants + + respond_to do |format| + format.html { + render :layout => "base_opensource_p" + } + format.json { render json: @open_source_project } + end + end + + # GET /open_source_projects/1 + # GET /open_source_projects/1.json + def show + @open_source_project = OpenSourceProject.find(params[:id]) + + sort_init 'updated_at', 'desc' + sort_update 'created_at' => "#{RelativeMemo.table_name}.created_at", + 'replies' => "#{RelativeMemo.table_name}.replies_count", + 'updated_at' => "COALESCE (last_replies_relative_memos.created_at, #{RelativeMemo.table_name}.created_at)" + + @memo = RelativeMemo.new(:open_source_project => @open_source_project) + @topic_count = @open_source_project.topics.count + @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] + @memos = @open_source_project.topics. + reorder("#{RelativeMemo.table_name}.sticky DESC"). + includes(:last_reply). + limit(@topic_pages.per_page). + offset(@topic_pages.offset). + order(sort_clause). + all + + respond_to do |format| + format.html { + render :layout => "base_opensource_p" + } + format.json { render json: @open_source_project } + end + end + + def search + + end + + # GET /open_source_projects/new + # GET /open_source_projects/new.json + def new + @open_source_project = OpenSourceProject.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @open_source_project } + end + end + + # GET /open_source_projects/1/edit + def edit + @open_source_project = OpenSourceProject.find(params[:id]) + end + + # POST /open_source_projects + # POST /open_source_projects.json + def create + @open_source_project = OpenSourceProject.new(params[:open_source_project]) + + respond_to do |format| + if @open_source_project.save + format.html { redirect_to @open_source_project, notice: 'Open source project was successfully created.' } + format.json { render json: @open_source_project, status: :created, location: @open_source_project } + else + format.html { render action: "new" } + format.json { render json: @open_source_project.errors, status: :unprocessable_entity } + end + end + end + + # PUT /open_source_projects/1 + # PUT /open_source_projects/1.json + def update + @open_source_project = OpenSourceProject.find(params[:id]) + + respond_to do |format| + if @open_source_project.update_attributes(params[:open_source_project]) + format.html { redirect_to @open_source_project, notice: 'Open source project was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @open_source_project.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /open_source_projects/1 + # DELETE /open_source_projects/1.json + def destroy + @open_source_project = OpenSourceProject.find(params[:id]) + @open_source_project.destroy + + respond_to do |format| + format.html { redirect_to open_source_projects_url } + format.json { head :no_content } + end + end + + def remove_condition + @app_dir = params[:app_dir] + @language = params[:language] + @created_at = params[:created_at] + redirect_to open_source_projects_path(:app_dir => @app_dir, :language => @language, :created_at => @created_at, :name => params[:name]) + end + + def search + # per_page_option = 10 +# + # @open_source_projects = OpenSourceProject.filter(@app_dir, @language, @created_at) + # @open_source_projects = @open_source_projects.like(params[:name]) if params[:name].present? +# + # @os_project_count = @open_source_projects.count + # @os_project_pages = Paginator.new @os_project_count, per_page_option, params['page'] +# + # @open_source_projects = @open_source_projects.offset(@os_project_pages.offset).limit(@os_project_pages.per_page) + + redirect_to open_source_projects_path(:name => params[:name]) + + end + + def refuse_master_apply + @apply = ApplyProjectMaster.where("user_id = ? and apply_id = ? and apply_type = 'OpenSourceProject'", params[:user_id], @open_source_project.id) + @apply.first.destory + + redirect_to master_apply_open_source_project_path + end + + def accept_master_apply + @apply = ApplyProjectMaster.where("user_id = ? and apply_id = ? and apply_type = 'OpenSourceProject'", params[:user_id], @open_source_project.id) + if @apply.count == 1 + @apply.first.update_attributes(:status => 2) + end + + redirect_to master_apply_open_source_project_path + end + + + private + + def require_master + render_403 unless @open_source_project.admin?(User.current) + end + + def find_osp + @open_source_project = OpenSourceProject.find(params[:id]) + render_404 unless @open_source_project.present? + end +end diff --git a/app/controllers/relative_memos_controller.rb b/app/controllers/relative_memos_controller.rb new file mode 100644 index 000000000..f8741365b --- /dev/null +++ b/app/controllers/relative_memos_controller.rb @@ -0,0 +1,161 @@ +class RelativeMemosController < ApplicationController + + helper :sort + include SortHelper + helper :apply_project_masters + include ApplyProjectMastersHelper + helper :no_uses + include NoUsesHelper + + before_filter :find_memo, :except => [:new, :create] + before_filter :find_osp, :only => [:create] + before_filter :require_login, :only => [:new, :create] + + layout 'base_opensource_p' + + # GET /open_source_projects + # GET /open_source_projects.json + def index + # per_page_option = 10 +# + # @open_source_projects = OpenSourceProject.all +# + # @os_project_count = @open_source_projects.count + # @os_project_pages = Paginator.new @os_project_count, per_page_option, params['page'] +# + # @open_source_projects = OpenSourceProject.all +# + # respond_to do |format| + # format.html # index.html.erb + # format.json { render json: @open_source_projects } + # end + end + + # GET /open_source_projects/1 + # GET /open_source_projects/1.json + REPLIES_PER_PAGE = 10 unless const_defined?(:REPLIES_PER_PAGE) + def show + pre_count = REPLIES_PER_PAGE + + @memo = @memo.root # 取出楼主,防止输入帖子id让回复作为主贴显示 + @memo.update_column(:viewed_count_local, (@memo.viewed_count_local.to_i + 1)) + + page = params[:page] + if params[:r] && page.nil? + offset = @memo.children.where("#{Memo.table_name}.id < ?", params[:r].to_i).count + page = 1 + offset / pre_count + else + + end + @reply_count = @memo.children.count + @reply_pages = Paginator.new @reply_count, pre_count, page + @replies = @memo.children. + includes(:author, :attachments). + reorder("#{RelativeMemo.table_name}.created_at ASC"). + limit(@reply_pages.per_page). + offset(@reply_pages.offset). + all + + @mome_new = RelativeMemo.new + + + # @memo = Memo.find_by_id(params[:id]) + # @forum = Forum.find(params[:forum_id]) + # @replies = @memo.replies + # @mome_new = Memo.new + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @memo } + end + end + + + # GET /open_source_projects/new + # GET /open_source_projects/new.json + def new + @open_source_project = OpenSourceProject.new + + respond_to do |format| + format.html # new.html.erb + format.json { render json: @open_source_project } + end + end + + # GET /open_source_projects/1/edit + def edit + @open_source_project = OpenSourceProject.find(params[:id]) + end + + # POST /open_source_projects + # POST /open_source_projects.json + def create + @memo = RelativeMemo.new(params[:relative_memo]) + # @memo.url = "http://forge.trustie.net/open_source_projects" + @memo.osp_id = params[:open_source_project_id] + @memo.author_id = User.current.id + + @memo.save_attachments(params[:attachments] || (params[:relative_memo] && params[:relative_memo][:uploads])) + + respond_to do |format| + if @memo.save + format.html { redirect_to back_memo_url, notice: "#{l :label_memo_create_succ}" } + format.json { render json: @memo, status: :created, location: @memo } + else + flash[:error] = "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" + # back_error_page = @memo.parent_id.nil? ? forum_path(@forum) : forum_memo_path(@forum, @memo.parent_id) + format.html { redirect_to back_memo_url}#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" } + format.json { render json: @memo.errors, status: :unprocessable_entity } + end + end + end + + # PUT /open_source_projects/1 + # PUT /open_source_projects/1.json + def update + @open_source_project = OpenSourceProject.find(params[:id]) + + respond_to do |format| + if @open_source_project.update_attributes(params[:open_source_project]) + format.html { redirect_to @open_source_project, notice: 'Open source project was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: "edit" } + format.json { render json: @open_source_project.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /open_source_projects/1 + # DELETE /open_source_projects/1.json + def destroy + @open_source_project = OpenSourceProject.find(params[:id]) + @open_source_project.destroy + + respond_to do |format| + format.html { redirect_to open_source_projects_url } + format.json { head :no_content } + end + end + + private + + def find_memo + return unless find_osp + @memo = @open_source_project.relative_memos.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + nil + end + + def find_osp + @open_source_project = OpenSourceProject.find(params[:open_source_project_id]) + rescue ActiveRecord::RecordNotFound + render_404 + nil + end + + def back_memo_url + open_source_project_relative_memo_path(@open_source_project, (@memo.parent_id.nil? ? @memo : @memo.parent_id)) + end +end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 18cfcb3f3..84c3aff0f 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -16,6 +16,7 @@ class TagsController < ApplicationController helper :projects include TagsHelper helper :tags + include OpenSourceProjectsHelper before_filter :require_admin,:only => [:delete,:show_all] @@ -58,7 +59,7 @@ class TagsController < ApplicationController end @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num,@contests_tags_num, - @forum_tags_num, @attachments_tags_num = get_tags_size + @forum_tags_num, @attachments_tags_num, @open_source_projects_num = get_tags_size # 获取搜索结果 @obj,@obj_pages,@results_count,@users_results, @@ -67,7 +68,8 @@ class TagsController < ApplicationController @bids_results, @forums_results, @attachments_results, - @contests_tags = refresh_results(@obj_id,@obj_flag,@selected_tags) + @contests_tags, + @open_source_projects_results = refresh_results(@obj_id,@obj_flag,@selected_tags) # 这里是做tag推荐用的, 用来生产推荐的tags unless @obj.nil? @@ -182,6 +184,7 @@ class TagsController < ApplicationController @contests_results = nil @forums_results = nil attachments_results = nil + @open_source_projects_results = nil @obj_pages = nil @obj = nil @result = nil @@ -213,10 +216,13 @@ class TagsController < ApplicationController when '7' @obj = Contest.find_by_id(obj_id) @obj_pages,@contests_results,@results_count = for_pagination(get_contests_by_tag(selected_tags)) + when '8' + @obj = OpenSourceProject.find_by_id(obj_id) + @obj_pages, @open_source_projects_results, @results_count = for_pagination(get_open_source_projects_by_tag(selected_tags)) else @obj = nil end - return [@obj, + return [@obj, @obj_pages, @results_count, @users_results, @@ -225,7 +231,8 @@ class TagsController < ApplicationController @bids_results, @forums_results, attachments_results, - @contests_results] + @contests_results, + @open_source_projects_results] end def for_pagination(results) @@ -245,8 +252,9 @@ class TagsController < ApplicationController @bids_tags_num = Bid.tag_counts.size forum_tags_num = Forum.tag_counts.size attachment_tags_num = Attachment.tag_counts.size + @open_source_projects_num = OpenSourceProject.tag_counts.size @contests_tags_num = Contest.tag_counts.size - return @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num, forum_tags_num, attachment_tags_num, @contests_tags_num + return @users_tags_num,@projects_tags_num,@issues_tags_num,@bids_tags_num, forum_tags_num, attachment_tags_num, @contests_tags_num, @open_source_projects_num end # 通过数字 来转换出对象的类型 @@ -269,6 +277,8 @@ class TagsController < ApplicationController return 'Attachment' when '7' return 'Contest' + when '8' + return 'OpenSourceProject' else render_error :message => e.message return diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 859b19655..aeacae866 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -442,6 +442,10 @@ module ApplicationHelper def authoring(created, author, options={}) l(options[:label] || :label_added_time_by, :author => link_to_user(author), :age => time_tag(created)).html_safe end + + def added_time(created) + l(:label_added_time, :age => time_tag(created)).html_safe + end #huang def betweentime(enddate) diff --git a/app/helpers/apply_project_masters_helper.rb b/app/helpers/apply_project_masters_helper.rb new file mode 100644 index 000000000..565f8ea04 --- /dev/null +++ b/app/helpers/apply_project_masters_helper.rb @@ -0,0 +1,31 @@ +module ApplyProjectMastersHelper + def apply_super_user(objects, user, options=[]) + return '' unless user && user.logged? + objects = Array.wrap(objects) + + applied = objects.any? {|object| object.applied_by?(user)} + allowed = objects.any? {|object| object.allowed?(user)} + # @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) 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) + + css = apply_css(objects) << options[0].to_s + + text = applied ? (allowed ? l(:you_are_master) : l(:cancel_apply)) : l(:apply_master) + + url = apply_project_masters_path( + :object_type => objects.first.class.to_s.underscore, + :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) + ) + method = applied ? 'delete' : 'post' + + link_to text, url, :remote => true, :method => method, :class => css + end + + def apply_css(objects) + objects = Array.wrap(objects) + id = (objects.size == 1 ? objects.first.id : 'bulk') + "#{objects.first.class.to_s.underscore}-#{id}-watcher" + end + +end diff --git a/app/helpers/no_uses_helper.rb b/app/helpers/no_uses_helper.rb new file mode 100644 index 000000000..a7a5ac24b --- /dev/null +++ b/app/helpers/no_uses_helper.rb @@ -0,0 +1,28 @@ +module NoUsesHelper + def no_use_link(objects, user, options=[]) + return '' unless user && user.logged? + objects = Array.wrap(objects) + + clicked = objects.any? {|object| object.no_use_for?(user)} + # @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or (objects.first.instance_of?(Bid))) + css = no_use_css(objects) << options[0].to_s + # ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s) + + text = clicked ? l(:no_use) : l(:cancel_no_use) + + url = no_uses_path( + :object_type => objects.first.class.to_s.underscore, + :object_id => (objects.size == 1 ? objects.first.id : objects.map(&:id).sort) + ) + method = clicked ? 'delete' : 'post' + + link_to text, url, :remote => true, :method => method, :class => css + #, :class => css + end + + def no_use_css(objects) + objects = Array.wrap(objects) + id = (objects.size == 1 ? objects.first.id : 'bulk') + "#{objects.first.class.to_s.underscore}-#{id}-watcher" + end +end diff --git a/app/helpers/open_source_projects_helper.rb b/app/helpers/open_source_projects_helper.rb new file mode 100644 index 000000000..f758580d9 --- /dev/null +++ b/app/helpers/open_source_projects_helper.rb @@ -0,0 +1,37 @@ +module OpenSourceProjectsHelper + def show_condition(app_dir, language, created_at, name) + s=''.html_safe + unless app_dir.nil? + s_temp = content_tag('a', app_dir) + temp = link_to 'x', {:controller => "open_source_projects", :action => "remove_condition", :language => language, :created_at => created_at, :name => name} + temp = content_tag('span', temp, :class => 'del') + s_temp << temp + s_temp = content_tag('span', s_temp, :class => 'tag_show') + s << content_tag('div', s_temp, :id => 'tag') + + end + unless language.nil? + s_temp = content_tag('a', language) + temp = link_to 'x', {:controller => "open_source_projects", :action => "remove_condition", :app_dir => app_dir, :created_at => created_at, :name => name} + temp = content_tag('span', temp, :class => 'del') + s_temp << temp + s_temp = content_tag('span', s_temp, :class => 'tag_show') + s << content_tag('div', s_temp, :id => 'tag') + end + unless created_at.nil? + s_temp = content_tag('a', created_at) + temp = link_to 'x', {:controller => "open_source_projects", :action => "remove_condition", :app_dir => app_dir, :language => language, :name => name} + temp = content_tag('span', temp, :class => 'del') + s_temp << temp + s_temp = content_tag('span', s_temp, :class => 'tag_show') + s << content_tag('div', s_temp, :id => 'tag') + end + s = content_tag('div', s, :id => 'tags_show') + s = content_tag('div', s, :id => 'tags') + s = content_tag('div', s, :class => 'user_tags') + end + + def get_open_source_projects_by_tag(tag_name) + OpenSourceProject.tagged_with(tag_name).order('created_at desc') + end +end diff --git a/app/models/apply_project_master.rb b/app/models/apply_project_master.rb new file mode 100644 index 000000000..13bd2f372 --- /dev/null +++ b/app/models/apply_project_master.rb @@ -0,0 +1,16 @@ +class ApplyProjectMaster < ActiveRecord::Base + # attr_accessible :title, :body + # status 1是申请者,2是版主 + belongs_to :apply, :polymorphic => true + belongs_to :user + + validates_presence_of :user + validates_uniqueness_of :user_id, :scope => [:apply_type, :apply_id] + validate :validate_user + + protected + + def validate_user + errors.add :user_id, :invalid unless user.nil? || user.active? + end +end diff --git a/app/models/no_use.rb b/app/models/no_use.rb new file mode 100644 index 000000000..a46e519e8 --- /dev/null +++ b/app/models/no_use.rb @@ -0,0 +1,15 @@ +class NoUse < ActiveRecord::Base + # attr_accessible :title, :body + belongs_to :no_use, :polymorphic => true + belongs_to :user + + validates_presence_of :user + validates_uniqueness_of :user_id, :scope => [:no_use_type, :no_use_id] + validate :validate_user + + protected + + def validate_user + errors.add :user_id, :invalid unless user.nil? || user.active? + end +end diff --git a/app/models/open_source_project.rb b/app/models/open_source_project.rb new file mode 100644 index 000000000..e526dc921 --- /dev/null +++ b/app/models/open_source_project.rb @@ -0,0 +1,134 @@ +class OpenSourceProject < ActiveRecord::Base + attr_accessible :name + + include Redmine::SafeAttributes + has_many :applies, :class_name => "ApplyProjectMaster", :as => :apply, :dependent => :delete_all + has_many :topics, :class_name => 'RelativeMemo', :foreign_key => 'osp_id', :conditions => "#{RelativeMemo.table_name}.parent_id IS NULL", :order => "#{RelativeMemo.table_name}.created_at DESC", :dependent => :destroy + has_many :relative_memos, :class_name => 'RelativeMemo', :foreign_key => 'osp_id', :dependent => :destroy + has_many :tags, :through => :project_tags, :class_name => 'Tag' + has_many :project_tags, :class_name => 'ProjectTags' + has_many :masters, :class_name => 'ApplyProjectMaster', :as => :apply, :dependent => :delete_all, :conditions => "#{ApplyProjectMaster.table_name}.status = 2" + has_many :admin, :through => :masters, :class_name => 'User' + has_many :apply_tips, :class_name => 'ApplyProjectMaster', :as => :apply, :dependent => :delete_all, :conditions => "#{ApplyProjectMaster.table_name}.status = 1" + has_many :applicants, :class_name => 'User', :through => :apply_tips, :source => :user + + validates_uniqueness_of :name + + acts_as_taggable + + scope :applied_by, lambda { |user_id| + { :include => :apply_project_master, + :conditions => ["#{ApplyProjectMaster.table_name}.user_id = ?", user_id] + } + } + scope :like, lambda {|arg| + if arg.blank? + where(nil) + else + pattern = "%#{arg.to_s.strip.downcase}%" + where("LOWER(name) LIKE :p OR LOWER(description) LIKE :p ", :p => pattern) + end + } + def filter(app_dir, language, created_at) + filter_app_dir(app_dir).filter_language(language).filter_time(created_at) + end + + def self.filter(app_dir, language, created_at) + self.filter_app_dir(app_dir).filter_language(language).filter_time(created_at) + end + + scope :filter_app_dir, lambda {|args| + nil + } + + scope :filter_language, lambda {|*arg| + if arg[0].nil? + where(nil) + else + tagged_with(arg).order('updated_at desc') + end + } + + scope :filter_time, lambda {|args| + where("YEAR(#{OpenSourceProject.table_name}.created_at) = ?", args) unless args.nil? + } + + # def filter_app_dir(app_dir) + # nil + # end + # + # def self.filter_app_dir(app_dir) + # nil + # end + # + # def filter_language(language) + # nil + # end + # + # def self.filter_language(language) + # nil + # end + # + # def filter_time(created_at) + # nil + # end + # + # def self.filter_time(created_at) + # nil + # end + + def short_description(length = 255) + description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description + end + + def applied_by?(user) + self.applies.each do |apply| + if apply.user_id == user.id + return true + end + end + false + end + + def allowed?(user) + self.applies.each do |apply| + if apply.user_id == user.id and apply.status == 2 + return true + end + end + false + end + + def set_apply(user, flag=true) + flag ? set_filter(user) : remove_filter(user) + end + + def set_filter(user) + self.applies << ApplyProjectMaster.new(:user => user, :status => 1) + end + + def remove_filter(user) + return nil unless user && user.is_a?(User) + ApplyProjectMaster.delete_all "apply_type = '#{self.class}' AND apply_id = #{self.id} AND user_id = #{user.id}" + end + + def admin?(user) + if user.admin? or ApplyProjectMaster.find(:all, :conditions => ["user_id = ? and apply_type = 'OpenSourceProject' and apply_id = ? and status = ?", user.id, self.id, 2]).present? + return true + else + return false + end + end + + def reset_counters! + self.class.reset_counters!(id) + end + + def self.reset_counters!(id) + osp_id = id.to_i + update_all("topic_count = (SELECT COUNT(*) FROM #{RelativeMemo.table_name} WHERE osp_id=#{osp_id} AND parent_id IS NULL)," + + " memo_count = (SELECT COUNT(*) FROM #{RelativeMemo.table_name} WHERE osp_id=#{osp_id} AND parent_id IS NOT NULL)," + + " last_memo_id = (SELECT MAX(id) FROM #{RelativeMemo.table_name} WHERE osp_id=#{osp_id})", + ["id = ?", osp_id]) + end +end diff --git a/app/models/relative_memo.rb b/app/models/relative_memo.rb new file mode 100644 index 000000000..6a4706633 --- /dev/null +++ b/app/models/relative_memo.rb @@ -0,0 +1,185 @@ +class RelativeMemo < ActiveRecord::Base + # attr_accessible :title, :body + include Redmine::SafeAttributes + belongs_to :open_source_project, :class_name => "OpenSourceProject", :foreign_key => 'osp_id' + belongs_to :author, :class_name => "User", :foreign_key => 'author_id' + + has_many :tags, :through => :project_tags, :class_name => 'Tag' + has_many :project_tags, :class_name => 'ProjectTags' + + has_many :no_uses, :as => :no_use, :dependent => :delete_all + + acts_as_taggable + acts_as_attachable + + validates_presence_of :osp_id, :subject + #validates :content, presence: true + # validates_length_of :subject, maximum: 50 + #validates_length_of :content, maximum: 3072 + validate :cannot_reply_to_locked_topic, :on => :create + validates_uniqueness_of :osp_id, :scope => [:subject, :context] + + acts_as_tree :counter_cache => :replies_count, :order => "#{RelativeMemo.table_name}.created_at ASC" + acts_as_attachable + belongs_to :last_reply, :class_name => 'RelativeMemo', :foreign_key => 'last_reply_id' + # acts_as_searchable :column => ['subject', 'content'], + # #:include => { :forum => :p} + # #:project_key => "#{Forum.table_name}.project_id" + # :date_column => "#{table_name}.created_at" + + # acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.subject}"}, + # :datetime => :updated_at, + # # :datetime => :created_at, + # :description => :content, + # :author => :author, + # :type => Proc.new {|o| o.parent_id.nil? ? 'Memo' : 'Reply'}, + # :url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :r => o.id, :anchor => "reply-#{o.id}"})} + # acts_as_activity_provider :author_key => :author_id, + # :func => 'memos', + # :timestamp => 'created_at' + + # :find_options => {:type => 'memos'} + # acts_as_watchable + + safe_attributes "author_id", + "subject", + "content", + "osp_id", + "last_memo_id", + "lock", + "sticky", + "parent_id", + "replies_count", + "is_quote" + + after_create :add_author_as_watcher, :reset_counters! + # after_update :update_memos_forum + after_destroy :reset_counters! + # after_create :send_notification + # after_save :plusParentAndForum + # after_destroy :minusParentAndForum + + # scope :visible, lambda { |*args| + # includes(:forum => ).where() + # } + + def cannot_reply_to_locked_topic + errors.add :base, l(:label_memo_locked) if root.locked? && self != root + end + + # def update_memos_forum + # if forum_id_changed? + # Message.update_all({:board_id => board_id}, ["id = ? OR parent_id = ?", root.id, root.id ]) + # Forum.reset_counters!(forum_id_was) + # Forum.reset_counters!(forum_id) + # end + # end + + + scope :no_use_for, lambda { |user_id| + { :include => :no_uses, + :conditions => ["#{NoUse.table_name}.user_id = ?", user_id] } + } + + def no_use_for?(user) + self.no_uses.each do |no_use| + if no_use.user_id == user.id + return true + end + end + false + end + + def set_no_use(user, flag=true) + flag ? set_filter(user) : remove_filter(user) + end + + def set_filter(user) + self.no_uses << NoUse.new(:user => user) + end + + def remove_filter(user) + return nil unless user && user.is_a?(User) + NoUse.delete_all "no_use_type = '#{self.class}' AND no_use_id = #{self.id} AND user_id = #{user.id}" + end + + def reset_counters! + if parent && parent.id + RelativeMemo.update_all({:last_reply_id => parent.children.maximum(:id)}, {:id => parent.id}) + parent.update_attribute(:updated_at, Time.now) + end + # forum.reset_counters! + end + + def sticky? + sticky == 1 + end + + def replies + RelativeMemo.where("parent_id = ?", id) + end + + def locked? + self.lock + end + + def editable_by? user + # user && user.logged? || (self.author == usr && usr.allowed_to?(:edit_own_messages, project)) + user.admin? + end + + # def destroyable_by? user + # (user && user.logged? && (Forum.find(self.forum_id).creator_id == user.id) ) || user.admin? + # #self.author == user || user.admin? + # end + + def deleted_attach_able_by? user + (user && user.logged? && (self.author == user) ) || user.admin? + end + + private + + def add_author_as_watcher + Watcher.create(:watchable => self.root, :user => author) + end + + def send_notification + if Setting.notified_events.include?('message_posted') + Mailer.message_posted(self).deliver + end + end + + # def plusParentAndForum + # @forum = Forum.find(self.forum_id) + # @forum.memo_count = @forum.memo_count.to_int + 1 + # @forum.last_memo_id = self.id + # if self.parent_id + # @parent_memo = Memo.find_by_id(self.parent_id) + # @parent_memo.last_reply_id = self + # @parent_memo.replies_count = @parent_memo.replies_count.to_int + 1 + # @parent_memo.save + # else + # @forum.topic_count = @forum.topic_count.to_int + 1 + # end + # @forum.save + # end + + # def minusParentAndForum + # @forum = Forum.find(self.forum_id) + # @forum.memo_count = @forum.memo_count.to_int - 1 + # @forum.memo_count = 0 if @forum.memo_count.to_int < 0 + # # @forum.last_memo_id = Memo.reorder('created_at ASC').find_all_by_forum_id(self.forum_id).last.id + # if self.parent_id + # @parent_memo = Memo.find_by_id(self.parent_id) + # # @parent_memo.last_reply_id = Memo.reorder('created_at ASC').find_all_by_parent_id(self.parent_id).last.id + # @parent_memo.replies_count = @parent_memo.replies_count.to_int - 1 + # @parent_memo.replies_count = 0 if @parent_memo.replies_count.to_int < 0 + # @parent_memo.save + # else + # @forum.topic_count = @forum.topic_count.to_int - 1 + # @forum.topic_count = 0 if @forum.topic_count.to_int < 0 + # end + # @forum.save + # end +end + diff --git a/app/views/apply_project_masters/_form.html.erb b/app/views/apply_project_masters/_form.html.erb new file mode 100644 index 000000000..f817c1bcf --- /dev/null +++ b/app/views/apply_project_masters/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@apply_project_master) do |f| %> + <% if @apply_project_master.errors.any? %> +
+

<%= pluralize(@apply_project_master.errors.count, "error") %> prohibited this apply_project_master from being saved:

+ + +
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/apply_project_masters/_set_apply.js.erb b/app/views/apply_project_masters/_set_apply.js.erb new file mode 100644 index 000000000..2c2075743 --- /dev/null +++ b/app/views/apply_project_masters/_set_apply.js.erb @@ -0,0 +1,2 @@ +<% selector = ".#{apply_css(objects)}" %> +$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript apply_super_user(objects, user) %>")}); diff --git a/app/views/apply_project_masters/edit.html.erb b/app/views/apply_project_masters/edit.html.erb new file mode 100644 index 000000000..47d85b99c --- /dev/null +++ b/app/views/apply_project_masters/edit.html.erb @@ -0,0 +1,6 @@ +

Editing apply_project_master

+ +<%= render 'form' %> + +<%= link_to 'Show', @apply_project_master %> | +<%= link_to 'Back', apply_project_masters_path %> diff --git a/app/views/apply_project_masters/index.html.erb b/app/views/apply_project_masters/index.html.erb new file mode 100644 index 000000000..16023cd83 --- /dev/null +++ b/app/views/apply_project_masters/index.html.erb @@ -0,0 +1,21 @@ +

Listing apply_project_masters

+ + + + + + + + +<% @apply_project_masters.each do |apply_project_master| %> + + + + + +<% end %> +
<%= link_to 'Show', apply_project_master %><%= link_to 'Edit', edit_apply_project_master_path(apply_project_master) %><%= link_to 'Destroy', apply_project_master, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New Apply project master', new_apply_project_master_path %> diff --git a/app/views/apply_project_masters/new.html.erb b/app/views/apply_project_masters/new.html.erb new file mode 100644 index 000000000..7cdcac28b --- /dev/null +++ b/app/views/apply_project_masters/new.html.erb @@ -0,0 +1,5 @@ +

New apply_project_master

+ +<%= render 'form' %> + +<%= link_to 'Back', apply_project_masters_path %> diff --git a/app/views/apply_project_masters/show.html.erb b/app/views/apply_project_masters/show.html.erb new file mode 100644 index 000000000..a7edc11ff --- /dev/null +++ b/app/views/apply_project_masters/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_apply_project_master_path(@apply_project_master) %> | +<%= link_to 'Back', apply_project_masters_path %> diff --git a/app/views/forums/_show_topics.html.erb b/app/views/forums/_show_topics.html.erb index 3e7d4947b..0531f9625 100644 --- a/app/views/forums/_show_topics.html.erb +++ b/app/views/forums/_show_topics.html.erb @@ -5,7 +5,7 @@ <% if memos.any? %> <% memos.each do |topic| %> - +
<%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) %>
<%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) if topic.author%> diff --git a/app/views/layouts/base_opensource_p.html.erb b/app/views/layouts/base_opensource_p.html.erb new file mode 100644 index 000000000..da743f3a9 --- /dev/null +++ b/app/views/layouts/base_opensource_p.html.erb @@ -0,0 +1,161 @@ +<% @nav_dispaly_project_label = 1 %> + + + + + <%= 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 %> + <%= javascript_include_tag "ckeditor/ckeditor.js" %> + + <%= yield :header_tags -%> + + + +
+
+
+ <%= render :partial => 'layouts/base_header'%> +
+
+
+ + + + + + + + + +
开源项目社区<%= l(:label_user_location) %> : +
<%= link_to request.host()+"/open_source_projects", :controller => 'open_source_projects', :action => 'index' %><%= link_to l(:field_homepage), home_path %> > <%= link_to "开源项目社区", :controller => 'open_source_projects', :action => 'index' %> > <%=link_to @open_source_project.name, open_source_project_path(@open_source_project) %>
+ + + +
+ <%#=
+ +
%> + <%= render_flash_messages %> + <%= yield %> + <%= call_hook :view_layouts_base_content %> +
+
+ <%= render :partial => 'layouts/base_footer'%> + + + + + + + <%= call_hook :view_layouts_base_body_bottom %> + + + + diff --git a/app/views/no_uses/_form.html.erb b/app/views/no_uses/_form.html.erb new file mode 100644 index 000000000..0bcedb031 --- /dev/null +++ b/app/views/no_uses/_form.html.erb @@ -0,0 +1,17 @@ +<%= form_for(@no_use) do |f| %> + <% if @no_use.errors.any? %> +
+

<%= pluralize(@no_use.errors.count, "error") %> prohibited this no_use from being saved:

+ +
    + <% @no_use.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/no_uses/_set_no_use.js.erb b/app/views/no_uses/_set_no_use.js.erb new file mode 100644 index 000000000..fa0c5a8e8 --- /dev/null +++ b/app/views/no_uses/_set_no_use.js.erb @@ -0,0 +1,2 @@ +<% selector = ".#{no_use_css(objects)}" %> +$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript no_use_link(objects, user) %>")}); diff --git a/app/views/no_uses/edit.html.erb b/app/views/no_uses/edit.html.erb new file mode 100644 index 000000000..d7a0ea439 --- /dev/null +++ b/app/views/no_uses/edit.html.erb @@ -0,0 +1,6 @@ +

Editing no_use

+ +<%= render 'form' %> + +<%= link_to 'Show', @no_use %> | +<%= link_to 'Back', no_uses_path %> diff --git a/app/views/no_uses/index.html.erb b/app/views/no_uses/index.html.erb new file mode 100644 index 000000000..5535d74c1 --- /dev/null +++ b/app/views/no_uses/index.html.erb @@ -0,0 +1,21 @@ +

Listing no_uses

+ + + + + + + + +<% @no_uses.each do |no_use| %> + + + + + +<% end %> +
<%= link_to 'Show', no_use %><%= link_to 'Edit', edit_no_use_path(no_use) %><%= link_to 'Destroy', no_use, method: :delete, data: { confirm: 'Are you sure?' } %>
+ +
+ +<%= link_to 'New No use', new_no_use_path %> diff --git a/app/views/no_uses/new.html.erb b/app/views/no_uses/new.html.erb new file mode 100644 index 000000000..fb295879c --- /dev/null +++ b/app/views/no_uses/new.html.erb @@ -0,0 +1,5 @@ +

New no_use

+ +<%= render 'form' %> + +<%= link_to 'Back', no_uses_path %> diff --git a/app/views/no_uses/show.html.erb b/app/views/no_uses/show.html.erb new file mode 100644 index 000000000..1e580700c --- /dev/null +++ b/app/views/no_uses/show.html.erb @@ -0,0 +1,5 @@ +

<%= notice %>

+ + +<%= link_to 'Edit', edit_no_use_path(@no_use) %> | +<%= link_to 'Back', no_uses_path %> diff --git a/app/views/open_source_projects/_form.html.erb b/app/views/open_source_projects/_form.html.erb new file mode 100644 index 000000000..3949754ac --- /dev/null +++ b/app/views/open_source_projects/_form.html.erb @@ -0,0 +1,21 @@ +<%= form_for(@open_source_project) do |f| %> + <% if @open_source_project.errors.any? %> +
+

<%= pluralize(@open_source_project.errors.count, "error") %> prohibited this open_source_project from being saved:

+ +
    + <% @open_source_project.errors.full_messages.each do |msg| %> +
  • <%= msg %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= f.label :String %>
+ <%= f.text_field :String %> +
+
+ <%= f.submit %> +
+<% end %> diff --git a/app/views/open_source_projects/_os_project.html.erb b/app/views/open_source_projects/_os_project.html.erb new file mode 100644 index 000000000..cae5b963b --- /dev/null +++ b/app/views/open_source_projects/_os_project.html.erb @@ -0,0 +1,68 @@ + +
+
+ <%= image_tag('../images/avatars/Project/0', :class => 'avatar2') %> +
+
+

+ <%= textilizable(project.short_description, :project => project) %> +

+
+ +
+

+ <%= link_to project.users_count %> + <%= content_tag('span', l(:label_x_follow_people,:count =>0)) %> +

+

+ <%=link_to 1%> + <%= content_tag('span', l(:label_x_current_contributors, :count => 0)) %> +

+

+ <%=link_to project.commit_count %> + <%= content_tag('span', l(:label_since_last_commits)) %> +

+

+ <%=link_to project.code_line %> + <%= content_tag('span', "行代码") %> +

+
+ + +
+
+
+ + <%= content_tag('span', "#{l(:default_role_manager)}: ") %> + +
+
+ <%= content_tag('span', "#{l(:label_create_time)}: ") %><%= content_tag('span', format_time(project.created_at)) %> +
+ +
+
+
+ <%= content_tag('span', "项目来源:")%><%= link_to project.url, project.url %> +
+
+ <%= content_tag('span', "数据更新时间:") %><%= content_tag('span', project.date_collected) %> +
+
+
+
+ <%= image_tag( "/images/sidebar/tags.png") %> + <%= render :partial => 'tags/tag_name', :locals => {:obj => project,:object_flag => "7",:non_list_all => true }%> +
+
diff --git a/app/views/open_source_projects/_show_topics.html.erb b/app/views/open_source_projects/_show_topics.html.erb new file mode 100644 index 000000000..3ede2730e --- /dev/null +++ b/app/views/open_source_projects/_show_topics.html.erb @@ -0,0 +1,67 @@ + + +
+ 共有 <%= link_to memos.count %> 个贴子 +
+
+ <% if memos.any? %> + <% memos.each do |topic| %> + + + + + + +
<%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) if topic.author%> + <%= image_tag('../images/avatars/User/0', :class => "avatar") unless topic.author%> + + + + + + + + + + + + + + + + + + + + +
<%= link_to h(topic.subject), open_source_project_relative_memo_path(topic.open_source_project, topic) %> + + + + + + + +
<%= link_to (topic.replies_count), open_source_project_relative_memo_path(topic.open_source_project, topic) %>
回答
+ + + + + + + +
<%= link_to (topic.viewed_count_crawl+topic.viewed_count_local), open_source_project_relative_memo_path(topic.open_source_project, topic) %>
浏览
<%#= authoring topic.created_at, topic.author %> +
+
帖子来源:<%= link_to topic.url, topic.url%> <%= no_use_link(topic, User.current) %>
<%= image_tag( "/images/sidebar/tags.png") %> + <%= render :partial => 'tags/tag_name', :locals => {:obj => topic,:object_flag => "9",:non_list_all => true }%>
+ + <% end %> + + <% else %> +

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

+ <% end %> +
\ No newline at end of file diff --git a/app/views/open_source_projects/edit.html.erb b/app/views/open_source_projects/edit.html.erb new file mode 100644 index 000000000..bbe64cba8 --- /dev/null +++ b/app/views/open_source_projects/edit.html.erb @@ -0,0 +1,6 @@ +

Editing open_source_project

+ +<%= render 'form' %> + +<%= link_to 'Show', @open_source_project %> | +<%= link_to 'Back', open_source_projects_path %> diff --git a/app/views/open_source_projects/index.html.erb b/app/views/open_source_projects/index.html.erb new file mode 100644 index 000000000..0e9f1008a --- /dev/null +++ b/app/views/open_source_projects/index.html.erb @@ -0,0 +1,238 @@ +
+ <%= form_tag(:controller => 'open_source_projects', :action => "search", :method => :get) do %> + + + + + + + + + + + +
开源项目社区<%= l(:label_user_location) %> : +
<%= link_to request.host()+"/open_source_projects", :controller => 'open_source_projects', :action => 'index' %> <%= link_to l(:field_homepage), home_path %> > <%= link_to "开源项目社区", :controller => 'open_source_projects', :action => 'index' %>
+ <% end %> +
+ +<%#======================================================================box before%> +
+ +
+<%#======================================================================box after%> + +
+ +
    + <% @open_source_projects.each do |project| %> +
  • +
    + <%= link_to project.name, open_source_project_path(project), :class=>"project root leaf"%> + + <%= render :partial => 'open_source_projects/os_project', :locals => {:project => project}%> +
    +
  • + <% end %> +
+
+ + + +<% html_title(l(:label_project_plural)) -%> + diff --git a/app/views/open_source_projects/master_apply.html.erb b/app/views/open_source_projects/master_apply.html.erb new file mode 100644 index 000000000..0288692fc --- /dev/null +++ b/app/views/open_source_projects/master_apply.html.erb @@ -0,0 +1,84 @@ + +
+ <% for user in @applicants -%> + <% unless user.id == 1%> + + <% messages_count = user.messages.count %> + <% messages_score = messages_count * 0.05%> + <% finall_messages_score = messages_score %> + + <% journals_count = user.journals.count %> + <% journals_score = journals_count * 0.1 %> + <% user_changesets_count = user.changesets.count %> + <% 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 %> + <% activities_count = user.activities.count %> + <% journals_for_messages_score = journals_for_messages_count * 0.05 %> + <% activities_score = activities_count * 0.2 %> + <% finall_activity_score = journals_for_messages_score + activities_score %> + + <% news_count = user.news.count %> + <% news_score = news_count * 0.1 %> + <% wiki_contents_count = user.wiki_contents.count %> + <% wiki_contents_score = wiki_contents_count * 0.1 %> + <% comments_count = user.comments.count %> + <% comments_score = comments_count * 0.1 %> + <% finall_influence_score = news_score + wiki_contents_score + comments_score %> + <% finall_user_score = finall_messages_score + finall_user_project_score + finall_activity_score + finall_influence_score %> + +
+ + <%= content_tag "p", "#{format_date(user.created_on)} #{l(:label_member_since)}", :class => "float_right member_since" %> + <%= image_tag "/images/time_member.png", :class => "img_member_time"%> + +
+ <%= image_tag(url_to_avatar(user), :class => 'avatar') %> + <%= content_tag "span", link_to_user(user), :class => "nomargin avatar_name" %> + + +
+ <%= l(:label_user_grade) %>: <%= link_to( format("%.2f" , finall_user_score).to_f, {:controller => 'users', + :action => 'show_score', + :remote => true, + :id => user.id}, + :style=>"color: #EC6300;") %> +
+ +
+ +
+ <%= l(:label_x_has_fans,:count=>user.watcher_users.count)%> + <%= l(:label_has_watchers,:count=>User.watched_by(user.id).count) %> + +
+
+ <% 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) %> + <% for member in memberships %> + <%= link_to_project(member.project) %><%= (user.memberships.last == member) ? '' : ',' %> + <% end %> + <% 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_course_contribute_to, :count => memberships.count) %> + <% for member in memberships %> + <%= link_to_project(member.project) %><%= (user.memberships.last == member) ? '' : ',' %> + <% end %> + <% end %> +

+ + <%= user.changesets.count == 0 ? '' : "#{l(:label_x_total_commit, :count => user.changesets.count)}" %> + <%= link_to "同意申请", {:controller => 'open_source_projects', :action => 'accept_master_apply', :id => @open_source_project.id, :user_id => user.id}%> + <%= link_to "拒绝申请", {:controller => 'open_source_projects', :action => 'refuse_master_apply', :id => @open_source_project.id, :user_id => user.id}%> +
+
+ <% end -%> + <% end -%> +
\ No newline at end of file diff --git a/app/views/open_source_projects/new.html.erb b/app/views/open_source_projects/new.html.erb new file mode 100644 index 000000000..66de0a3f9 --- /dev/null +++ b/app/views/open_source_projects/new.html.erb @@ -0,0 +1,5 @@ +

New open_source_project

+ +<%= render 'form' %> + +<%= link_to 'Back', open_source_projects_path %> diff --git a/app/views/open_source_projects/show.html.erb b/app/views/open_source_projects/show.html.erb new file mode 100644 index 000000000..0459e2399 --- /dev/null +++ b/app/views/open_source_projects/show.html.erb @@ -0,0 +1,54 @@ + + + +<% #= link_to '发布帖子', new_forum_memo_path(@forum), :class => 'icon icon-add' %> + + <%= link_to l(:label_memo_new_from_forum), new_open_source_project_relative_memo_path(@open_source_project), :class => 'icon icon-add', + :onclick => 'showAndScrollTo("add-memo", "memo_subject"); return false;' if User.current.logged? %> + + +
+ <%#= link_to( + image_tag('edit.png')+l(:label_forum_edit), + {:action => 'edit', :id => @forum}, + :method => 'get', + :title => l(:button_edit) + ) if @forum.editable_by?(User.current) %> + <%#= link_to( + image_tag('delete.png')+'删除讨论区', + {:action => 'destroy', :id => @forum}, + :method => :delete, + :data => {:confirm => l(:text_are_you_sure)}, + :title => l(:button_delete) + ) if @forum.destroyable_by?(User.current) %> +
+<%= render :partial => 'open_source_projects/show_topics', :locals => {:memos => @memos} %> diff --git a/app/views/relative_memos/_reply_box.html.erb b/app/views/relative_memos/_reply_box.html.erb new file mode 100644 index 000000000..98f1f31a0 --- /dev/null +++ b/app/views/relative_memos/_reply_box.html.erb @@ -0,0 +1,14 @@ +<%= form_for(@mome_new, url: open_source_project_relative_memos_path, :html => {:multipart => true}) do |f| %> + <%= f.hidden_field :subject, :required => true, value: @memo.subject %> + <%= f.hidden_field :osp_id, :required => true, value: @memo.osp_id %> + <%= f.hidden_field :parent_id, :required => true, value: @memo.id %> + <%= label_tag(l(:label_reply_plural)) %>: + + <%= f.text_area :content, :cols => 80, :rows => 15, :class => 'wiki-edit', :id => 'editor01', :value => @content %>

+ + +

<%#= l(:label_attachment_plural) %>
+ <%#= render :partial => 'attachments/form' %> +

+ <%= f.submit value: l(:label_reply_plural), class: "replies" %> +<% end %> \ No newline at end of file diff --git a/app/views/relative_memos/show.html.erb b/app/views/relative_memos/show.html.erb new file mode 100644 index 000000000..2d85a19aa --- /dev/null +++ b/app/views/relative_memos/show.html.erb @@ -0,0 +1,164 @@ +
+
+
+ <% if @memo.author%> + <%= link_to image_tag(url_to_avatar(@memo.author), :class => "avatar"), user_path(@memo.author) %> + <% else %> + <%= image_tag('../images/avatars/User/0', :class => "avatar") %> + <% end %>
+

<%=link_to @memo.author.name, user_path(@memo.author) if @memo.author%>

+
+
+
+ + <%#= link_to( + l(:button_quote), + {:action => 'quote', :id => @memo}, + :remote => true, + :method => 'get', + :title => l(:button_quote) + )if !@memo.locked? && User.current.logged? %> + + <%#= link_to( + image_tag('edit.png'), + {:action => 'edit', :id => @memo}, + :method => 'get', + :title => l(:button_edit) + ) if @memo.editable_by?(User.current) %> + + <%#= link_to( + l(:button_delete), + {:action => 'destroy', :id => @memo}, + :method => :delete, + :data => {:confirm => l(:text_are_you_sure)}, + :title => l(:button_delete) + ) if @memo.destroyable_by?(User.current) %> +
+ +
<%= label_tag l(:field_subject) %>: <%=h @memo.subject %>
+
+ + <%= raw @memo.content %> +

+ <% if @memo.attachments.any?%> + <% options = {:author => true, :deletable => @memo.deleted_attach_able_by?(User.current) } %> + <%= render :partial => 'attachments/links', :locals => {:attachments => @memo.attachments, :options => options} %> + <% end %> +

+
+
+ <% if @memo.author %> + <%= authoring @memo.created_at, @memo.author.name %> + <% else %> + <%= added_time @memo.created_at %> + <% end %>
+
+
+ <%= image_tag( "/images/sidebar/tags.png") %> + <%= render :partial => 'tags/tag_name', :locals => {:obj => @memo,:object_flag => "8",:non_list_all => true }%> +
+
+
+
+
+
+

<%= l(:label_reply_plural) %> (<%= @replies.nil? ? 0 : @replies.size %>)

+ <% pages_count = @reply_pages.offset %> + <% @replies.each do |reply| %> +
"> +

<%= pages_count += 1 %>楼 :

+
+ + <%#= link_to( + l(:button_quote), + {:action => 'quote', :id => reply}, + :remote => true, + :method => 'get', + :title => l(:button_quote) + )if !@memo.locked? && User.current.logged? %> + + <%#= link_to( + image_tag('edit.png'), + {:action => 'edit', :id => reply}, + :title => l(:button_edit) + ) if reply.editable_by?(User.current) %> + + <%#= link_to( + l(:button_delete), + {:action => 'destroy', :id => reply}, + :method => :delete, + :data => {:confirm => l(:text_are_you_sure)}, + :title => l(:button_delete) + ) if reply.destroyable_by?(User.current) %> + +
+ + + + + + + + + +
+ <% if reply.author%> + <%= link_to image_tag(url_to_avatar(reply.author), :class => "avatar"), user_path(reply.author) %> + <% else %> + <%= image_tag('../images/avatars/User/0', :class => "avatar") %> + <% end %> + +
<%=h reply.content.html_safe %>
+ +

+ <% if reply.attachments.any?%> + <% options = {:author => true, :deletable => reply.deleted_attach_able_by?(User.current) } %> + <%= render :partial => 'attachments/links', :locals => {:attachments => reply.attachments, :options => options} %> + <% end %> +

+
+ <% if reply.author %> + <%= authoring reply.created_at, reply.author.name %> + <% else %> + <%= added_time reply.created_at %> + <% end %>
+
+ <% end %> + +
+ +<% if User.current.login? %> +
+ <%= render :partial => 'relative_memos/reply_box' %> +
+<% else %> +
+ <%= l(:label_user_login_tips) %> + <%= link_to l(:label_user_login_new), signin_path %> +
+
+<% end %> diff --git a/app/views/tags/_show_open_source_projects.html.erb b/app/views/tags/_show_open_source_projects.html.erb new file mode 100644 index 000000000..2c8bc6374 --- /dev/null +++ b/app/views/tags/_show_open_source_projects.html.erb @@ -0,0 +1,15 @@ +
+<% if projects_results.size > 0 %> +
+<% projects_results.each do |prj| %> +
+

+ <%= l(:label_tags_project_name) %><%= link_to "#{prj.name}",:controller => "open_source_projects",:action => "show",:id => prj.id %> +
+ <%= l(:label_tags_project_description) %><%= prj.short_description %> +

+
+
+<% end %> +<% end %> +
diff --git a/app/views/tags/_tag.html.erb b/app/views/tags/_tag.html.erb index 1cec18b37..205143924 100644 --- a/app/views/tags/_tag.html.erb +++ b/app/views/tags/_tag.html.erb @@ -7,6 +7,8 @@ 5 代表是forum类型 6 代表是Attachment类型 7 代表是contest类型 + 8 代表是OpenSourceProject类型 + 9 代表是RelativeMemo类型 #end%> <% if object_flag == '3' %> diff --git a/app/views/tags/_tag_search_results.html.erb b/app/views/tags/_tag_search_results.html.erb index 49a5bcd82..1ea452dec 100644 --- a/app/views/tags/_tag_search_results.html.erb +++ b/app/views/tags/_tag_search_results.html.erb @@ -22,6 +22,10 @@ <% when show_flag == '7'%> <%= l(:label_contest_innovate)%>(<%= @results_count %>) <%= render :partial => "show_contests",:locals => {:contests_results => contests_results}%> + <% when show_flag == '8'%> + <%#= l(:label_attachment)%> + 开源项目:(<%= @results_count %>) + <%= render :partial => "show_open_source_projects",:locals => {:projects_results => open_source_projects_results}%> <% else %> <%= l(:label_tags_all_objects)%> diff --git a/app/views/tags/index.html.erb b/app/views/tags/index.html.erb index 48ba53d88..c74721c3e 100644 --- a/app/views/tags/index.html.erb +++ b/app/views/tags/index.html.erb @@ -22,7 +22,8 @@ <%= l(:label_project_plural) %>(<%= @projects_tags_num %>) | <%= l(:label_user_plural) %>(<%= @users_tags_num %>) | <%= l(:label_tags_call)%>(<%= @bids_tags_num %>) | - <%= l(:field_filename)%>(<%= @attachments_tags_num %>) + <%= l(:field_filename)%>(<%= @attachments_tags_num %>) | + 开源项目(<%= @open_source_projects_num %>) <%= l(:label_tags_contest)%>(<%= @contests_tags_num %>) |
@@ -35,6 +36,7 @@ :forums_results => @forums_results, :attachments_results=> @attachments_results, :contests_results => @contests_results, + :open_source_projects_results => @open_source_projects_results, :show_flag => @obj_flag} %>
diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 15cd1dca4..26d3f6682 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -832,6 +832,7 @@ zh: label_feeds_access_key_created_on: "RSS存取键是在 %{value} 之前建立的" label_module_plural: 模块 label_added_time_by: "由 %{author} 在 %{age} 之前添加" + label_added_time: "在 %{age} 之前添加" label_updated_time: " 更新于 %{value} 之前" label_updated_time_by: "由 %{author} 更新于 %{age} 之前" label_jump_to_a_project: 选择一个项目... @@ -1821,7 +1822,12 @@ zh: label_contest_reason: 参赛宣言: label_notification: 通知 label_sumbit_empty: 搜索内容不能为空 - + no_use: 没有帮助 + cancel_no_use: 撤销没有帮助 + cancel_apply: 取消申请 + apply_master: 申请成为版主 + you_are_master: 您是该项目的版主 + #add by linchun (竞赛相关) label_upload_files: 上传文件 label_upload_softwarepackage: 上传软件包 diff --git a/config/routes.rb b/config/routes.rb index cfbcbe746..be0d11cea 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,54 +16,73 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do - mount SeemsRateable::Engine => '/rateable', :as => :rateable - - namespace :zipdown do - match 'assort' - end - namespace :test do - match 'courselist' - match 'zip' - end - ##new added by linchun #以发布应用的形式参与竞赛 - resources :softapplications do - - collection do - match 'new_message', via: :get - end - member do - match 'create_message' , via: :post - end - end - - ## new added by linchun #新竞赛相关 - resources :contests, only: [:index] do - collection do - match 'new_contest' , via: :get - match 'join_in_contest' , via: :post - match 'unjoin_in_contest' , via: :delete - match 'create_contest' , via: :post - match 'new_join' , via: :post - match 'new' , via: :post - end - member do - match 'add_softapplication' - match 'update_contest' , via: [:put] - match 'show_contest' , via: :get - match 'show_project' , via: :get - match 'show_softapplication', via: :get - match 'show_participator' , via: :get - match 'add' , via: [:get, :post] - match 'add_softapplication' , via: [:get, :post] - match 'create' , via: :post - match 'settings' , via: [:get, :post] - end - end - + resources :no_uses + delete 'no_uses', :to => 'no_uses#delete' + + resources :apply_project_masters + delete 'apply_project_masters', :to => 'apply_project_masters#delete' + + + resources :open_source_projects do + collection do + match 'search', via: [:get, :post] + match 'remove_condition', via: [:get, :post] + end + resources :relative_memos + member do + match 'master_apply', via: [:get, :post] + match 'accept_master_apply', via: [:get, :post] + match 'refuse_master_apply', via: [:get, :post] + end + end + mount SeemsRateable::Engine => '/rateable', :as => :rateable + + namespace :zipdown do + match 'assort' + end + namespace :test do + match 'courselist' + match 'zip' + end + ##new added by linchun #以发布应用的形式参与竞赛 + resources :softapplications do + + collection do + match 'new_message', via: :get + end + member do + match 'create_message' , via: :post + end + end + + ## new added by linchun #新竞赛相关 + resources :contests, only: [:index] do + collection do + match 'new_contest' , via: :get + match 'join_in_contest' , via: :post + match 'unjoin_in_contest' , via: :delete + match 'create_contest' , via: :post + match 'new_join' , via: :post + match 'new' , via: :post + end + member do + match 'add_softapplication' + match 'update_contest' , via: [:put] + match 'show_contest' , via: :get + match 'show_project' , via: :get + match 'show_softapplication', via: :get + match 'show_participator' , via: :get + match 'add' , via: [:get, :post] + match 'add_softapplication' , via: [:get, :post] + match 'create' , via: :post + match 'settings' , via: [:get, :post] + end + end + resources :stores do collection do match 'search', via: [:get, :post] - end + end end resources :forums do @@ -81,21 +100,20 @@ RedmineApp::Application.routes.draw do end end + resources :shares - resources :shares - #added by william get "tags/index" - + get "tags/show" - + get "praise_tread/praise_plus" get "praise_tread/tread_plus" #end root :to => 'welcome#index', :as => 'home' - + #added by baiyu match 'git_usage/ch_usage', :controller => 'git_usage', :action => 'ch_usage', :via => :get, :as => 'ch_usage' match 'git_usage/en_usage', :controller => 'git_usage', :action => 'en_usage', :via => :get, :as => 'en_usage' @@ -140,7 +158,6 @@ RedmineApp::Application.routes.draw do match '/journals/edit/:id', :to => 'journals#edit', :id => /\d+/, :via => [:get, :post] match '/journals/destroy/:id', :to => 'journals#destroy', :id => /\d+/, :via => [:get, :post] - get '/projects/:project_id/issues/gantt', :to => 'gantts#show', :as => 'project_gantt' get '/issues/gantt', :to => 'gantts#show' @@ -150,21 +167,21 @@ RedmineApp::Application.routes.draw do get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report' get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details' post '/users/:id/user_activities', :to => 'users#show', :as => "user_activities" - + #added by young - resources :users do + resources :users do member do match 'user_projects', :to => 'users#user_projects', :via => :get match 'user_activities', :to => 'users#show', :via => :get, :as => "user_activities" - match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback" - match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] + match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback" + match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] match 'info', :to => 'users#info', :via => [:get , :post], :as => 'user_info' match 'user_watchlist', :to => 'users#user_watchlist', :via => :get, :as => "user_watchlist" #add by huang match 'user_fanslist', :to => 'users#user_fanslist', :via => :get, :as => "user_fanslist" #add by huang match 'user_courses', :to => 'users#user_courses', :via => :get match 'user_homeworks', :to => 'users#user_homeworks', :via => :get - match 'watch_projects', :to => 'users#watch_projects', :via => :get - # added by bai + match 'watch_projects', :to => 'users#watch_projects', :via => :get + # added by bai match 'show_score', :to => 'users#show_score', :via => :get match 'topic_score_index', :controller => 'users', :action => 'topic_score_index', :via => [:get, :post] match 'project_score_index', :to => 'users#project_score_index', :via => :get @@ -178,13 +195,13 @@ RedmineApp::Application.routes.draw do match 'file_score_index', :to => 'projects#file_score_index', :via => [:get, :post] match 'code_submit_score_index', :to => 'projects#code_submit_score_index', :via => [:get, :post] match 'projects_topic_score_index', :to => 'projects#projects_topic_score_index', :via => [:get, :post] - # end + # end end end match 'users/:id/user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "feedback" match 'users/:id/user_projects', :controller => 'users', :action => 'user_projects', :via => :get - #match 'user/:id/watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] - + #match 'user/:id/watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] + #end match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :post] match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post] @@ -244,7 +261,6 @@ RedmineApp::Application.routes.draw do post 'reopen' match 'copy', :via => [:get, :post] end - #by young match '/member', :controller => 'projects', :action => 'member', :as => 'member', :via => :get @@ -253,7 +269,6 @@ RedmineApp::Application.routes.draw do # match '/investor', :controller => 'projects', :action => 'investor', :as => 'investor', :via => :get match '/homework', :controller => 'projects', :action => 'homework', :as => 'homework', :via => :get - # match '/activity', :controller => 'activities', :action => 'index', :as => 'activity', :via => :get # match '/repository', :controller => 'repositories', :action => 'show', :repository_id => nil, :path => nil, :rev => nil, :as => 'repository', :via => :get # match '/', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get @@ -261,7 +276,7 @@ RedmineApp::Application.routes.draw do # get 'projects/:project_id/repository', :to => 'repositories#show', :as => 'project_repository' # match '/show', :controller => 'projects', :action => 'show', :as => 'project_show', :via => :get - match '/watcherlist', :controller=>'projects', :action=> 'watcherlist', :as => 'watcherlist', :via => :get #add by huang + match '/watcherlist', :controller=>'projects', :action=> 'watcherlist', :as => 'watcherlist', :via => :get #add by huang # matche '/news', :controller => 'news', :action => 'index', :as => 'news', :via => :get #end @@ -311,7 +326,7 @@ RedmineApp::Application.routes.draw do resources :repositories, :except => [:index, :show] do member do get 'newrepo', :via => [:get, :post] - # get 'create', :via=>[:get, :post] + # get 'create', :via=>[:get, :post] end end match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get @@ -488,8 +503,6 @@ RedmineApp::Application.routes.draw do get 'autocomplete_for_new_user' end end - - match 'workflows', :controller => 'workflows', :action => 'index', :via => :get match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post] @@ -505,10 +518,10 @@ RedmineApp::Application.routes.draw do match 'uploads', :to => 'attachments#upload', :via => :post # Added by Tao - match 'upload_avatar', :to => 'avatar#upload', :via => :post + match 'upload_avatar', :to => 'avatar#upload', :via => :post # Endof Tao's code get 'robots.txt', :to => 'welcome#robots' - + ##############测试留言功能 fq post 'words/new', :to => 'words#new' post 'words/create', :to => 'words#create' @@ -532,7 +545,7 @@ RedmineApp::Application.routes.draw do match 'calls/:id/new_submit_homework', to: 'bids#new_submit_homework', via: :get, as: 'new_submit_homework' match 'words/add_project_respond', :controller => 'words', :action => 'add_project_respond' match 'words/:id/leave_project_message', :controller => 'words', :action => 'leave_project_message' - + match 'projects/:id/feedback', :to => 'projects#feedback', :via => :get, :as => 'project_feedback' match 'calls/create_bid', :to => 'bids#create_bid' match 'contest/create_contest', :to => 'bids#create_contest' #huang @@ -546,24 +559,24 @@ RedmineApp::Application.routes.draw do match 'calls/:id/show_course', :to => 'bids#show_course', :as => 'show_course' match 'calls/:id/show_bid_project', :to => 'bids#show_bid_project', :as => 'show_bid_project' match 'calls/:id/show_bid_user', :to => 'bids#show_bid_user', :as => 'show_bid_user' - + match 'project/:id/share', :to => 'projects#share', :as => 'share_show' #share - - post 'join_in/join', :to => 'courses#join', :as => 'join' + + post 'join_in/join', :to => 'courses#join', :as => 'join' delete 'join_in/join', :to => 'courses#unjoin' post 'calls/:id/join_in_contest', :to => 'bids#join_in_contest', :as => 'join_in_contest' delete 'calls/:id/join_in_contest', :to => 'bids#unjoin_in_contest' match 'calls/:id/show_participator', :to => 'bids#show_participator' #bai match 'calls/:id/update_contest', :to => 'bids#update_contest' #bai match 'calls/:id/settings', :to => 'bids#settings' #bai - + delete 'attachment/:id', :to => 'attachments#delete_homework' match 'new_join', :to => 'projects#new_join', :as => 'try_join' match 'new_join_in_contest', :to => 'bids#new_join', :as => 'try_join_in_contest' match 'projects/:id/respond', :to => 'projects#project_respond', :via => :post match 'calls/:id/manage',:to => 'bids#manage',:via => [:get,:post] match 'project/course', :to => 'projects#course', :as => 'course' - + #added by william # match 'calls/:id/set_results',:controller => 'bids', :action => 'set_results',:via => [:get,:post],:as => 'set_results' # match 'calls/:id/set_prizes',:controller => 'bids',:action => 'set_prizes',:as => 'set_prizes' @@ -571,10 +584,10 @@ RedmineApp::Application.routes.draw do # added by young match 'calls', :controller => 'bids', :action => 'index' - + match 'calls/:id', :controller => 'bids', :action => 'show', :as => 'respond' match 'contest', :controller => 'bids', :action => 'contests', :as => 'contest' #modified @20140403 - + ######################## ##added by wen########## @@ -603,7 +616,7 @@ RedmineApp::Application.routes.draw do match 'parise_tread/tread_plus',:to => 'parise_tread#tread_plus',:as=>"tread" match 'tags/delete',:to=>'tags#delete' match 'tags/remove_tag',:to=>'tags#remove_tag',:as=>"remove_tag" - + match 'words/add_brief_introdution', :controller => 'words', :action => 'add_brief_introdution' Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir| diff --git a/db/migrate/20140324015819_create_open_source_projects.rb b/db/migrate/20140324015819_create_open_source_projects.rb new file mode 100644 index 000000000..22034c3bb --- /dev/null +++ b/db/migrate/20140324015819_create_open_source_projects.rb @@ -0,0 +1,15 @@ +class CreateOpenSourceProjects < ActiveRecord::Migration + def change + create_table :open_source_projects do |t| + t.column "name", :string, :default => nil, :null => true + t.column "description", :string, :default => '', :null => true + t.column "commit_count", :integer, :default => 0 + t.column "code_line", :integer, :default => 0 + t.column "users_count",:integer, :default => 0 + t.column "last_commit_time", :date, :null => true + t.column "url", :string, :default => nil, :null => true + t.column "date_collected", :date, :null => true + t.timestamps + end + end +end diff --git a/db/migrate/20140401004102_create_relative_memos.rb b/db/migrate/20140401004102_create_relative_memos.rb new file mode 100644 index 000000000..6654b8fe5 --- /dev/null +++ b/db/migrate/20140401004102_create_relative_memos.rb @@ -0,0 +1,18 @@ +class CreateRelativeMemos < ActiveRecord::Migration + def change + create_table :relative_memos do |t| + t.integer :osp_id, :null => false + t.integer :parent_id, null: true + 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.timestamps + end + end +end diff --git a/db/migrate/20140403075029_create_apply_project_masters.rb b/db/migrate/20140403075029_create_apply_project_masters.rb new file mode 100644 index 000000000..5124dbc15 --- /dev/null +++ b/db/migrate/20140403075029_create_apply_project_masters.rb @@ -0,0 +1,12 @@ +class CreateApplyProjectMasters < ActiveRecord::Migration + def change + create_table :apply_project_masters do |t| + t.integer :user_id + t.string :apply_type + t.integer :apply_id + t.integer :status + + t.timestamps + end + end +end diff --git a/db/migrate/20140403113341_create_no_uses.rb b/db/migrate/20140403113341_create_no_uses.rb new file mode 100644 index 000000000..56056b07d --- /dev/null +++ b/db/migrate/20140403113341_create_no_uses.rb @@ -0,0 +1,11 @@ +class CreateNoUses < ActiveRecord::Migration + def change + create_table :no_uses do |t| + t.integer :user_id, :null => false + t.string :no_use_type + t.integer :no_use_id + + t.timestamps + end + end +end diff --git a/db/migrate/20140404031622_add_view_count_to_relative_memos.rb b/db/migrate/20140404031622_add_view_count_to_relative_memos.rb new file mode 100644 index 000000000..17eb95b70 --- /dev/null +++ b/db/migrate/20140404031622_add_view_count_to_relative_memos.rb @@ -0,0 +1,6 @@ +class AddViewCountToRelativeMemos < ActiveRecord::Migration + def change + add_column :relative_memos, :viewed_count_crawl, :int, default: 0 + add_column :relative_memos, :viewed_count_local, :int, default: 0 + end +end diff --git a/db/migrate/20140411011700_change_description_type_to_open_source_project.rb b/db/migrate/20140411011700_change_description_type_to_open_source_project.rb new file mode 100644 index 000000000..8c8804d8a --- /dev/null +++ b/db/migrate/20140411011700_change_description_type_to_open_source_project.rb @@ -0,0 +1,9 @@ +class ChangeDescriptionTypeToOpenSourceProject < ActiveRecord::Migration + def up + change_column :open_source_projects, :description, :text + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20140428005537_add_url_to_relative_memos.rb b/db/migrate/20140428005537_add_url_to_relative_memos.rb new file mode 100644 index 000000000..d339605c1 --- /dev/null +++ b/db/migrate/20140428005537_add_url_to_relative_memos.rb @@ -0,0 +1,5 @@ +class AddUrlToRelativeMemos < ActiveRecord::Migration + def change + add_column :relative_memos, :url, :string + end +end diff --git a/test/fixtures/activities.yml b/test/fixtures/activities.yml new file mode 100644 index 000000000..585b0e66f --- /dev/null +++ b/test/fixtures/activities.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + act_id: + act_type: MyString + user_id: + +two: + act_id: + act_type: MyString + user_id: diff --git a/test/fixtures/apply_project_masters.yml b/test/fixtures/apply_project_masters.yml new file mode 100644 index 000000000..c63aac0b6 --- /dev/null +++ b/test/fixtures/apply_project_masters.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/forums.yml b/test/fixtures/forums.yml new file mode 100644 index 000000000..c63aac0b6 --- /dev/null +++ b/test/fixtures/forums.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/journal_replies.yml b/test/fixtures/journal_replies.yml new file mode 100644 index 000000000..1a8bb39c1 --- /dev/null +++ b/test/fixtures/journal_replies.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + journal_id: 1 + user_id: 1 + reply_id: 1 + +two: + journal_id: 1 + user_id: 1 + reply_id: 1 diff --git a/test/fixtures/no_uses.yml b/test/fixtures/no_uses.yml new file mode 100644 index 000000000..c63aac0b6 --- /dev/null +++ b/test/fixtures/no_uses.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/open_source_projects.yml b/test/fixtures/open_source_projects.yml new file mode 100644 index 000000000..a95f1d28f --- /dev/null +++ b/test/fixtures/open_source_projects.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + String: + +two: + String: diff --git a/test/fixtures/relative_memos.yml b/test/fixtures/relative_memos.yml new file mode 100644 index 000000000..c63aac0b6 --- /dev/null +++ b/test/fixtures/relative_memos.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/apply_project_masters_controller_test.rb b/test/functional/apply_project_masters_controller_test.rb new file mode 100644 index 000000000..3cad8dca6 --- /dev/null +++ b/test/functional/apply_project_masters_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class ApplyProjectMastersControllerTest < ActionController::TestCase + setup do + @apply_project_master = apply_project_masters(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:apply_project_masters) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create apply_project_master" do + assert_difference('ApplyProjectMaster.count') do + post :create, apply_project_master: { } + end + + assert_redirected_to apply_project_master_path(assigns(:apply_project_master)) + end + + test "should show apply_project_master" do + get :show, id: @apply_project_master + assert_response :success + end + + test "should get edit" do + get :edit, id: @apply_project_master + assert_response :success + end + + test "should update apply_project_master" do + put :update, id: @apply_project_master, apply_project_master: { } + assert_redirected_to apply_project_master_path(assigns(:apply_project_master)) + end + + test "should destroy apply_project_master" do + assert_difference('ApplyProjectMaster.count', -1) do + delete :destroy, id: @apply_project_master + end + + assert_redirected_to apply_project_masters_path + end +end diff --git a/test/functional/forums_controller_test.rb b/test/functional/forums_controller_test.rb new file mode 100644 index 000000000..9b0438bd2 --- /dev/null +++ b/test/functional/forums_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class ForumsControllerTest < ActionController::TestCase + setup do + @forum = forums(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:forums) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create forum" do + assert_difference('Forum.count') do + post :create, forum: { } + end + + assert_redirected_to forum_path(assigns(:forum)) + end + + test "should show forum" do + get :show, id: @forum + assert_response :success + end + + test "should get edit" do + get :edit, id: @forum + assert_response :success + end + + test "should update forum" do + put :update, id: @forum, forum: { } + assert_redirected_to forum_path(assigns(:forum)) + end + + test "should destroy forum" do + assert_difference('Forum.count', -1) do + delete :destroy, id: @forum + end + + assert_redirected_to forums_path + end +end diff --git a/test/functional/no_uses_controller_test.rb b/test/functional/no_uses_controller_test.rb new file mode 100644 index 000000000..255b03dc4 --- /dev/null +++ b/test/functional/no_uses_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class NoUsesControllerTest < ActionController::TestCase + setup do + @no_use = no_uses(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:no_uses) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create no_use" do + assert_difference('NoUse.count') do + post :create, no_use: { } + end + + assert_redirected_to no_use_path(assigns(:no_use)) + end + + test "should show no_use" do + get :show, id: @no_use + assert_response :success + end + + test "should get edit" do + get :edit, id: @no_use + assert_response :success + end + + test "should update no_use" do + put :update, id: @no_use, no_use: { } + assert_redirected_to no_use_path(assigns(:no_use)) + end + + test "should destroy no_use" do + assert_difference('NoUse.count', -1) do + delete :destroy, id: @no_use + end + + assert_redirected_to no_uses_path + end +end diff --git a/test/functional/open_source_projects_controller_test.rb b/test/functional/open_source_projects_controller_test.rb new file mode 100644 index 000000000..9b33a8b1f --- /dev/null +++ b/test/functional/open_source_projects_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class OpenSourceProjectsControllerTest < ActionController::TestCase + setup do + @open_source_project = open_source_projects(:one) + end + + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:open_source_projects) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create open_source_project" do + assert_difference('OpenSourceProject.count') do + post :create, open_source_project: { String: @open_source_project.String } + end + + assert_redirected_to open_source_project_path(assigns(:open_source_project)) + end + + test "should show open_source_project" do + get :show, id: @open_source_project + assert_response :success + end + + test "should get edit" do + get :edit, id: @open_source_project + assert_response :success + end + + test "should update open_source_project" do + put :update, id: @open_source_project, open_source_project: { String: @open_source_project.String } + assert_redirected_to open_source_project_path(assigns(:open_source_project)) + end + + test "should destroy open_source_project" do + assert_difference('OpenSourceProject.count', -1) do + delete :destroy, id: @open_source_project + end + + assert_redirected_to open_source_projects_path + end +end diff --git a/test/unit/activity_test.rb b/test/unit/activity_test.rb new file mode 100644 index 000000000..eddcccdf7 --- /dev/null +++ b/test/unit/activity_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ActivityTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/apply_project_master_test.rb b/test/unit/apply_project_master_test.rb new file mode 100644 index 000000000..62309b315 --- /dev/null +++ b/test/unit/apply_project_master_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ApplyProjectMasterTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/forum_test.rb b/test/unit/forum_test.rb new file mode 100644 index 000000000..a6f90e493 --- /dev/null +++ b/test/unit/forum_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ForumTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/helpers/apply_project_masters_helper_test.rb b/test/unit/helpers/apply_project_masters_helper_test.rb new file mode 100644 index 000000000..f1fbe853b --- /dev/null +++ b/test/unit/helpers/apply_project_masters_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ApplyProjectMastersHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/forums_helper_test.rb b/test/unit/helpers/forums_helper_test.rb new file mode 100644 index 000000000..deebfb03b --- /dev/null +++ b/test/unit/helpers/forums_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ForumsHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/no_uses_helper_test.rb b/test/unit/helpers/no_uses_helper_test.rb new file mode 100644 index 000000000..405921005 --- /dev/null +++ b/test/unit/helpers/no_uses_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class NoUsesHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/open_source_projects_helper_test.rb b/test/unit/helpers/open_source_projects_helper_test.rb new file mode 100644 index 000000000..8ecd58615 --- /dev/null +++ b/test/unit/helpers/open_source_projects_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class OpenSourceProjectsHelperTest < ActionView::TestCase +end diff --git a/test/unit/journal_reply_test.rb b/test/unit/journal_reply_test.rb new file mode 100644 index 000000000..500f11a6f --- /dev/null +++ b/test/unit/journal_reply_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class JournalReplyTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/no_use_test.rb b/test/unit/no_use_test.rb new file mode 100644 index 000000000..4e4e903de --- /dev/null +++ b/test/unit/no_use_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class NoUseTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/open_source_project_test.rb b/test/unit/open_source_project_test.rb new file mode 100644 index 000000000..db44aad6e --- /dev/null +++ b/test/unit/open_source_project_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class OpenSourceProjectTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/relative_memo_test.rb b/test/unit/relative_memo_test.rb new file mode 100644 index 000000000..5f835a2a8 --- /dev/null +++ b/test/unit/relative_memo_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class RelativeMemoTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end