2013-08-01 10:33:49 +08:00
# Redmine - project management software
# Copyright (C) 2006-2013 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ProjectsController < ApplicationController
2013-09-13 22:25:31 +08:00
# if @project.project_type == 1
2013-08-04 11:08:30 +08:00
layout 'base_projects' # by young
2013-08-01 10:33:49 +08:00
menu_item :overview
menu_item :roadmap , :only = > :roadmap
2013-08-30 09:34:21 +08:00
menu_item :settings , :only = > :settings
2013-09-13 22:25:31 +08:00
2013-09-12 10:41:15 +08:00
menu_item l ( :label_sort_by_time ) , :only = > :index
menu_item l ( :label_sort_by_active ) , :only = > :index
menu_item l ( :label_sort_by_influence ) , :only = > :index
2013-09-14 09:51:26 +08:00
menu_item l ( :label_homework ) , :only = > :homework
menu_item l ( :label_course_file ) , :only = > :index
menu_item l ( :label_course_news ) , :only = > :index
2013-09-13 22:25:31 +08:00
# end
2013-09-13 16:36:36 +08:00
# layout 'base_courses'# by young
# menu_item :overview
# menu_item l(:label_homework), :only => :homework
# menu_item :files, :only => :files
#
# layout 'base_courses'
2013-09-13 10:11:36 +08:00
# menu_item l(:label_homework), :only => homework
# menu_item l(:label_course_file), :only => files
# menu_item l(:label_settings), :only => settings
2013-08-01 10:33:49 +08:00
2013-09-30 09:42:13 +08:00
before_filter :find_project , :except = > [ :index , :search , :list , :new , :create , :copy , :statistics , :new_join , :course , :enterprise_course , :course_enterprise ]
2013-09-29 19:46:59 +08:00
before_filter :authorize , :except = > [ :new_join , :new_homework , :homework , :statistics , :search , :watcherlist , :index , :list , :new , :create , :copy , :archive , :unarchive , :destroy , :member , :focus , :file ,
2013-10-02 21:47:18 +08:00
:statistics , :feedback , :course , :enterprise_course , :course_enterprise , :project_respond ]
2013-08-01 10:33:49 +08:00
before_filter :authorize_global , :only = > [ :new , :create ]
2013-09-23 15:12:06 +08:00
before_filter :require_admin , :only = > [ :copy , :archive , :unarchive , :destroy , :calendar ]
2013-08-01 10:33:49 +08:00
#by young
2013-09-13 21:52:24 +08:00
# before_filter :member, :file, :statistics, :watcherlist
# modified by fq
2013-09-13 10:11:36 +08:00
before_filter :file , :statistics , :watcherlist
2013-08-01 10:33:49 +08:00
#
accept_rss_auth :index
accept_api_auth :index , :show , :create , :update , :destroy
after_filter :only = > [ :create , :edit , :update , :archive , :unarchive , :destroy ] do | controller |
if controller . request . post?
controller . send :expire_action , :controller = > 'welcome' , :action = > 'robots'
end
end
2013-09-12 10:41:15 +08:00
2013-08-30 09:34:21 +08:00
helper :bids
include BidsHelper
2013-08-01 10:33:49 +08:00
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :issues
helper :queries
include QueriesHelper
helper :repositories
include RepositoriesHelper
include ProjectsHelper
helper :members
helper :activities
helper :documents
2013-08-06 10:16:51 +08:00
helper :watchers
2013-09-12 10:41:15 +08:00
# helper :watcherlist
2013-08-30 09:34:21 +08:00
2013-08-06 20:57:38 +08:00
### added by william
include ActsAsTaggableOn :: TagsHelper
2013-09-12 10:41:15 +08:00
# Lists visible projects
# def index
# respond_to do |format|
# format.html {
# scope = Project
# unless params[:closed]
# scope = scope.active
# end
# @projects = scope.visible.order('lft').all
# }
# format.api {
# @offset, @limit = api_offset_and_limit
# @project_count = Project.visible.count
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
# }
# format.atom {
# projects = Project.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
# render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
# }
# end
# end
2013-09-30 09:42:13 +08:00
def enterprise_course
session [ :enterprise_college ] = 2
respond_to do | format |
format . html { redirect_to :back }
#format.api { render_api_ok }
end
end
def course_enterprise
session [ :enterprise_college ] = 1
respond_to do | format |
format . html { redirect_to :back }
#format.api { render_api_ok }
end
end
2013-09-12 10:41:15 +08:00
2013-08-01 10:33:49 +08:00
def index
2013-08-06 21:43:06 +08:00
#Modified by nie
# @offset, @limit = api_offset_and_limit({:limit => 10})
# @project_count = Project.visible.count
# @project_pages = Paginator.new @project_count, @limit, params['page']
2013-09-12 10:41:15 +08:00
# @offset ||= @project_pages.offset
2013-08-06 21:43:06 +08:00
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
2013-09-28 23:08:24 +08:00
@project_type = params [ :project_type ]
2013-09-30 11:02:04 +08:00
2013-09-29 19:46:59 +08:00
2013-08-01 10:33:49 +08:00
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
2013-09-29 19:46:59 +08:00
@projects_status = ProjectStatus . visible . where ( " project_type <> ? or project_type is null " , 1 )
# @projects_status = ProjectStatus.visible
# @projects_status.each do |project|
# if Project.visible.find_by_id("#{project.project_id}")
# project.project_type = Project.visible.find_by_id("#{project.project_id}").project_type
# project.save
# end
# end
2013-09-12 10:41:15 +08:00
# @projects.each do |project|
# @admin = project.users_by_role[Role.find(3)]
# unless @admin.nil?
# @admin.each do |user|
# ProjectInfo.create(:user_id => user.id, :project_id => project.id)
# end
#
# end
# end
2013-08-13 20:54:29 +08:00
# @projects.each do |project|
2013-09-12 10:41:15 +08:00
# ProjectStatus.create(:changesets_count => project.changesets.count, :project_id => project.id, :watchers_count => project.watcher_users.count)
2013-08-13 20:54:29 +08:00
# end
2013-09-28 23:08:24 +08:00
# @projects_status = Project.visible.like(params[:name]) if params[:name].present?
2013-09-12 10:41:15 +08:00
@project_count = @projects_status . count
2013-08-01 10:33:49 +08:00
@project_pages = Paginator . new @project_count , @limit , params [ 'page' ]
2013-09-12 10:41:15 +08:00
@offset || = @project_pages . reverse_offset
2013-09-28 23:08:24 +08:00
# @projects = @projects.offset(@offset).limit(@limit).order('created_on DESC').all
2013-09-12 10:41:15 +08:00
if params [ :project_sort_type ] . present?
case params [ :project_sort_type ]
when '0'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 0
# @projects = @projects.sort {|x,y| y.created_on <=> x.created_on }
# @projects = @projects[@offset, @limit]
when '1'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 1
#@projects = @projects[@offset, @limit]
when '2'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'watchers_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'watchers_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 2
end
else
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 1
# @projects = @projects.sort {|x,y| y.created_on <=> x.created_on }
# @projects = @projects[@offset, @limit]
end
@projects = [ ]
@projects_status . each do | obj |
2013-09-29 19:46:59 +08:00
@projects << Project . visible . find_by_id ( " #{ obj . project_id } " ) unless Project . visible . find_by_id ( " #{ obj . project_id } " ) . nil?
end
#end
respond_to do | format |
format . html {
render :layout = > 'base'
scope = Project
unless params [ :closed ]
scope = scope . active
end
}
format . api {
# @offset, @limit = api_offset_and_limit
# @project_count = Project.visible.count
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
}
format . atom {
projects = Project . visible . order ( 'created_on DESC' ) . limit ( Setting . feeds_limit . to_i ) . all
render_feed ( projects , :title = > " #{ Setting . app_title } : #{ l ( :label_project_latest ) } " )
}
end
end
def course
#Modified by nie
# @offset, @limit = api_offset_and_limit({:limit => 10})
# @project_count = Project.visible.count
# @project_pages = Paginator.new @project_count, @limit, params['page']
# @offset ||= @project_pages.offset
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
@project_type = params [ :project_type ]
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@projects_status = ProjectStatus . visible . where ( " project_type = ? " , 1 )
# @projects.each do |project|
# @admin = project.users_by_role[Role.find(3)]
# unless @admin.nil?
# @admin.each do |user|
# ProjectInfo.create(:user_id => user.id, :project_id => project.id)
# end
#
# end
# end
# @projects.each do |project|
# ProjectStatus.create(:changesets_count => project.changesets.count, :project_id => project.id, :watchers_count => project.watcher_users.count)
# end
#@projects_status = Project.visible.like(params[:name]) if params[:name].present?
@project_count = @projects_status . count
@project_pages = Paginator . new @project_count , @limit , params [ 'page' ]
@offset || = @project_pages . reverse_offset
#@projects = @projects.offset(@offset).limit(@limit).order('created_on DESC').all
if params [ :project_sort_type ] . present?
case params [ :project_sort_type ]
when '0'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 0
# @projects = @projects.sort {|x,y| y.created_on <=> x.created_on }
# @projects = @projects[@offset, @limit]
when '1'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 1
#@projects = @projects[@offset, @limit]
when '2'
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'watchers_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'watchers_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 2
end
else
@offset || = @project_pages . reverse_offset
unless @offset == 0
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @project_count % @limit
if limit == 0
limit = @limit
end
@projects_status = @projects_status . reorder ( 'changesets_count' ) . offset ( @offset ) . limit ( limit ) . all . reverse
end
@s_type = 1
# @projects = @projects.sort {|x,y| y.created_on <=> x.created_on }
# @projects = @projects[@offset, @limit]
end
@projects = [ ]
@projects_status . each do | obj |
@projects << Project . visible . find_by_id ( " #{ obj . project_id } " ) unless Project . visible . find_by_id ( " #{ obj . project_id } " ) . nil?
2013-09-12 10:41:15 +08:00
end
2013-08-06 21:43:06 +08:00
#end
2013-09-12 10:41:15 +08:00
respond_to do | format |
2013-08-01 10:33:49 +08:00
format . html {
2013-09-12 10:41:15 +08:00
render :layout = > 'base'
2013-08-01 10:33:49 +08:00
scope = Project
unless params [ :closed ]
2013-09-12 10:41:15 +08:00
scope = scope . active
2013-08-01 10:33:49 +08:00
end
}
format . api {
2013-09-12 10:41:15 +08:00
# @offset, @limit = api_offset_and_limit
# @project_count = Project.visible.count
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
2013-08-01 10:33:49 +08:00
}
format . atom {
projects = Project . visible . order ( 'created_on DESC' ) . limit ( Setting . feeds_limit . to_i ) . all
render_feed ( projects , :title = > " #{ Setting . app_title } : #{ l ( :label_project_latest ) } " )
}
end
end
2013-08-16 22:53:28 +08:00
2013-09-12 10:41:15 +08:00
def search
2013-10-15 16:29:35 +08:00
#modified by nie
2013-09-12 10:41:15 +08:00
@projects = Project . visible
2013-10-15 16:29:35 +08:00
@projects = @projects . visible . where ( 'project_type = ?' , params [ :project_type ] ) . like ( params [ :name ] ) if params [ :name ] . present?
2013-09-12 10:41:15 +08:00
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@project_count = @projects . visible . count
@project_pages = Paginator . new @project_count , @limit , params [ 'page' ]
@offset || = @project_pages . offset
@projects = @projects . visible . offset ( @offset ) . limit ( @limit ) . all
respond_to do | format |
format . html {
render :layout = > 'base'
scope = Project
unless params [ :closed ]
scope = scope . active
end
}
format . api {
# @offset, @limit = api_offset_and_limit
# @project_count = Project.visible.count
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
}
format . atom {
projects = Project . visible . order ( 'created_on DESC' ) . limit ( Setting . feeds_limit . to_i ) . all
render_feed ( projects , :title = > " #{ Setting . app_title } : #{ l ( :label_project_latest ) } " )
}
end
end
# added by fq
def new_join
@course = Project . find ( params [ :object_id ] )
end
2013-08-30 09:34:21 +08:00
#Added by young
2013-09-12 10:41:15 +08:00
def homework
2013-08-30 09:34:21 +08:00
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
2013-09-12 10:41:15 +08:00
@bids = @project . homeworks
2013-08-30 09:34:21 +08:00
@bids = @bids . like ( params [ :name ] ) if params [ :name ] . present?
@bid_count = @bids . count
@bid_pages = Paginator . new @bid_count , @limit , params [ 'page' ]
2013-09-12 10:41:15 +08:00
2013-08-30 09:34:21 +08:00
@offset || = @bid_pages . reverse_offset
#@bids = @bids.offset(@offset).limit(@limit).all.reverse
unless @offset == 0
@bids = @bids . offset ( @offset ) . limit ( @limit ) . all . reverse
else
limit = @bid_count % @limit
@bids = @bids . offset ( @offset ) . limit ( limit ) . all . reverse
end
render :layout = > 'base_courses'
2013-09-13 10:11:36 +08:00
2013-09-12 10:41:15 +08:00
end
def new_homework
2013-09-15 16:49:19 +08:00
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 = ?' , 3 , 7 ) ) . size > 0 ) )
2013-08-30 09:34:21 +08:00
@homework = Bid . new
2013-09-12 10:41:15 +08:00
@homework . safe_attributes = params [ :bid ]
2013-08-30 09:34:21 +08:00
render :layout = > 'base_courses'
2013-09-15 16:49:19 +08:00
else
render_404
end
2013-09-12 10:41:15 +08:00
end
#Ended by young
2013-08-30 09:34:21 +08:00
2013-08-16 22:53:28 +08:00
def feedback
@jours = @project . 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 ]
@state = false
end
2013-08-01 10:33:49 +08:00
2013-09-12 10:41:15 +08:00
def project_respond
if params [ :project_respond ] . size > 0
jour = JournalsForMessage . find ( params [ :reference_id ] ) if params [ :reference_id ]
if jour
user = jour . user
text = jour . notes
else
user = User . current
text = [ ]
end
# Replaces pre blocks with [...]
text = text . to_s . strip . gsub ( %r{ <pre>((.| \ s)*?)</pre> }m , '[...]' )
reference_content = " > #{ ll ( Setting . default_language , :text_user_wrote , user ) } \n > "
reference_content << text . gsub ( / ( \ r? \ n| \ r \ n?) / , " \n > " ) + " \n \n "
# reference_message = JournalForMessage.find(params[:reference_id])
message = params [ :project_respond ] + " \n " + reference_content
user . add_jour ( User . current , message , user . id )
flash [ :notice ] = l ( :label_projects_feedback_respond_success )
# if a_message.size > 5
# @message = a_message[-5, 5]
# else
# @message = a_message
# end
# @message_count = a_message.count
end
respond_to do | format |
format . html { redirect_to :back }
#format.api { render_api_ok }
end
# redirect_to project_feedback_path(@project)
end
2013-08-01 10:33:49 +08:00
def new
2013-09-29 19:46:59 +08:00
@project_type = params [ :project_type ]
2013-08-30 09:34:21 +08:00
@course_tag = params [ :course ]
2013-08-01 10:33:49 +08:00
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
2013-09-12 10:41:15 +08:00
##add by huang
2013-09-06 16:39:38 +08:00
@course = Course . new
@course . safe_attributes = params [ :course ]
##end
2013-09-12 10:41:15 +08:00
render :layout = > 'base'
2013-08-01 10:33:49 +08:00
end
2013-09-29 19:46:59 +08:00
def create
2013-09-12 10:41:15 +08:00
@course_tag = params [ :project ] [ :project_type ]
if ( @course_tag == " 1 " )
2013-09-30 17:27:58 +08:00
if User . current . user_extensions . identity == 0
2013-09-12 10:41:15 +08:00
@course = Course . new
2013-09-16 08:58:53 +08:00
@course . extra = 'course' + DateTime . parse ( Time . now . to_s ) . strftime ( '%Y-%m-%d_%H-%M-%S' ) . to_s
2013-09-12 10:41:15 +08:00
@course . safe_attributes = params [ :project ] [ :course ]
2013-09-14 17:25:57 +08:00
@course . tea_id = User . current . id
2013-09-30 11:02:04 +08:00
# added by bai
@course . term = params [ :term ]
@course . time = params [ :time ]
2013-09-30 17:27:58 +08:00
end
2013-09-30 11:02:04 +08:00
# end
2013-09-28 23:08:24 +08:00
# @course.save
2013-09-12 10:41:15 +08:00
# project = ProjectInfo.create(:user_id => User.current.id, :project_id => @project.id)
# project_status = ProjectStatus.create(:project_id => @project.id)
end
2013-08-01 10:33:49 +08:00
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
2013-09-16 08:58:53 +08:00
if @course_tag == '1'
@project . identifier = @course . extra
end
2013-09-28 23:08:24 +08:00
if @course_tag == '1'
2013-09-30 17:27:58 +08:00
if User . current . user_extensions . identity == 0
if @course . save
if validate_parent_id && @project . save
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
# Add current user as a project member if he is not admin
unless User . current . admin?
r = Role . givable . find_by_id ( Setting . new_project_user_role_id . to_i ) || Role . givable . first
m = Member . new ( :user = > User . current , :roles = > [ r ] )
project = ProjectInfo . new ( :user_id = > User . current . id , :project_id = > @project . id )
2013-10-10 21:11:42 +08:00
if ( params [ :project ] [ :is_public ] == '1' && @course_tag != " 1 " ) || ( @course_tag == " 1 " && params [ :project ] [ :is_public ] == '1' )
2013-09-30 17:27:58 +08:00
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > 0 , :changesets_count = > 0 , :project_type = > @course_tag )
2013-09-28 23:08:24 +08:00
end
2013-09-30 17:27:58 +08:00
@project . members << m
@project . project_infos << project
end
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_create )
if params [ :continue ]
attrs = { :parent_id = > @project . parent_id } . reject { | k , v | v . nil? }
redirect_to new_project_path ( attrs , :course = > '0' )
#Added by young
elsif params [ :course_continue ]
redirect_to new_project_path ( :course = > '1' )
#Ended by young
else
redirect_to settings_project_path ( @project , :project_type = > 1 )
end
}
format . api { render :action = > 'show' , :status = > :created , :location = > url_for ( :controller = > 'projects' , :action = > 'show' , :id = > @project . id ) }
end
else
@course . destroy
respond_to do | format |
format . html { render :action = > 'new' , :layout = > 'base' } #Added by young
format . api { render_validation_errors ( @project ) }
end
2013-08-01 10:33:49 +08:00
end
2013-09-28 23:08:24 +08:00
else
2013-09-30 17:27:58 +08:00
if validate_parent_id && @project . save
@project . delete
respond_to do | format |
format . html { render :action = > 'new' , :layout = > 'base' } #Added by young
format . api { render_validation_errors ( @project ) }
end
else
respond_to do | format |
format . html { render :action = > 'new' , :layout = > 'base' } #Added by young
format . api { render_validation_errors ( @project ) }
end
2013-09-28 23:08:24 +08:00
end
end
2013-08-01 10:33:49 +08:00
end
else
2013-09-28 23:08:24 +08:00
if validate_parent_id && @project . save
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
# Add current user as a project member if he is not admin
unless User . current . admin?
r = Role . givable . find_by_id ( Setting . new_project_user_role_id . to_i ) || Role . givable . first
m = Member . new ( :user = > User . current , :roles = > [ r ] )
project = ProjectInfo . new ( :user_id = > User . current . id , :project_id = > @project . id )
if params [ :project ] [ :is_public ] == '1' || @course_tag == " 1 "
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > 0 , :changesets_count = > 0 )
end
@project . members << m
@project . project_infos << project
end
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_create )
if params [ :continue ]
attrs = { :parent_id = > @project . parent_id } . reject { | k , v | v . nil? }
redirect_to new_project_path ( attrs , :course = > '0' )
#Added by young
elsif params [ :course_continue ]
redirect_to new_project_path ( :course = > '1' )
#Ended by young
else
redirect_to settings_project_path ( @project )
end
}
format . api { render :action = > 'show' , :status = > :created , :location = > url_for ( :controller = > 'projects' , :action = > 'show' , :id = > @project . id ) }
end
else
respond_to do | format |
format . html { render :action = > 'new' , :layout = > 'base' } #Added by young
format . api { render_validation_errors ( @project ) }
end
end
2013-08-01 10:33:49 +08:00
end
end
def copy
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@source_project = Project . find ( params [ :id ] )
if request . get?
@project = Project . copy_from ( @source_project )
@project . identifier = Project . next_identifier if Setting . sequential_project_identifiers?
else
Mailer . with_deliveries ( params [ :notifications ] == '1' ) do
@project = Project . new
@project . safe_attributes = params [ :project ]
if validate_parent_id && @project . copy ( @source_project , :only = > params [ :only ] )
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
flash [ :notice ] = l ( :notice_successful_create )
redirect_to settings_project_path ( @project )
elsif ! @project . new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
redirect_to settings_project_path ( @project )
end
end
end
rescue ActiveRecord :: RecordNotFound
2013-09-12 10:41:15 +08:00
# source_project not found
2013-08-01 10:33:49 +08:00
render_404
2013-09-12 10:41:15 +08:00
end
2013-08-01 10:33:49 +08:00
# Show @project
def show
2013-09-29 19:46:59 +08:00
@project_type = params [ :project_type ]
2013-08-01 10:33:49 +08:00
# try to redirect to the requested menu item
if params [ :jump ] && redirect_to_project_menu_item ( @project , params [ :jump ] )
2013-09-12 10:41:15 +08:00
return
2013-08-01 10:33:49 +08:00
end
@users_by_role = @project . users_by_role
@subprojects = @project . children . visible . all
@news = @project . news . limit ( 5 ) . includes ( :author , :project ) . reorder ( " #{ News . table_name } .created_on DESC " ) . all
@trackers = @project . rolled_up_trackers
2013-10-10 21:41:42 +08:00
if ( User . find_by_id ( ProjectInfo . find_by_project_id ( @project . id ) . user_id ) )
@user = User . find_by_id ( ProjectInfo . find_by_project_id ( @project . id ) . user_id )
end
2013-08-01 10:33:49 +08:00
cond = @project . project_condition ( Setting . display_subprojects_issues? )
@open_issues_by_tracker = Issue . visible . open . where ( cond ) . count ( :group = > :tracker )
@total_issues_by_tracker = Issue . visible . where ( cond ) . count ( :group = > :tracker )
if User . current . allowed_to? ( :view_time_entries , @project )
@total_hours = TimeEntry . visible . sum ( :hours , :include = > :project , :conditions = > cond ) . to_f
end
@key = User . current . rss_key
2013-09-12 10:41:15 +08:00
#新增内容
2013-08-06 16:44:43 +08:00
@days = Setting . activity_days_default . to_i
2013-08-01 10:33:49 +08:00
if params [ :from ]
begin ; @date_to = params [ :from ] . to_date + 1 ; rescue ; end
end
2013-09-12 10:41:15 +08:00
2013-08-01 10:33:49 +08:00
has = {
2013-08-22 22:07:31 +08:00
" show_issues " = > true ,
" show_files " = > true ,
" show_documents " = > true ,
2013-09-12 17:19:51 +08:00
" show_messages " = > true ,
2013-09-15 09:33:51 +08:00
" show_news " = > true ,
2013-09-12 17:19:51 +08:00
" show_bids " = > true
2013-08-01 10:33:49 +08:00
}
@date_to || = Date . today + 1
@date_from = @date_to - @days
@with_subprojects = params [ :with_subprojects ] . nil? ? Setting . display_subprojects_issues? : ( params [ :with_subprojects ] == '1' )
@author = ( params [ :user_id ] . blank? ? nil : User . active . find ( params [ :user_id ] ) )
2013-09-12 10:41:15 +08:00
# 决定显示所用用户或单个用户活动
2013-08-01 10:33:49 +08:00
@activity = Redmine :: Activity :: Fetcher . new ( User . current , :project = > @project ,
:with_subprojects = > @with_subprojects ,
:author = > @author )
@activity . scope_select { | t | ! has [ " show_ #{ t } " ] . nil? }
2013-09-12 10:41:15 +08:00
# @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
2013-08-06 16:44:43 +08:00
#Added by young
events = @activity . events ( @date_from , @date_to )
2013-09-12 10:41:15 +08:00
2013-08-06 16:44:43 +08:00
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@events_count = events . count
@events_pages = Paginator . new @events_count , @limit , params [ 'page' ]
2013-09-12 10:41:15 +08:00
@offset || = @events_pages . offset
2013-08-06 16:44:43 +08:00
events = events . slice ( @offset , @limit )
#Ended by young
2013-08-01 10:33:49 +08:00
@events_by_day = events . group_by { | event | User . current . time_to_date ( event . event_datetime ) }
2013-09-12 10:41:15 +08:00
# documents
@sort_by = %w( category date title author ) . include? ( params [ :sort_by ] ) ? params [ :sort_by ] : 'category'
2013-08-01 10:33:49 +08:00
documents = @project . documents . includes ( :attachments , :category ) . all
case @sort_by
when 'date'
@grouped = documents . group_by { | d | d . updated_on . to_date }
when 'title'
@grouped = documents . group_by { | d | d . title . first . upcase }
when 'author'
@grouped = documents . select { | d | d . attachments . any? } . group_by { | d | d . attachments . last . author }
else
2013-09-12 10:41:15 +08:00
@grouped = documents . group_by ( & :category )
2013-08-01 10:33:49 +08:00
end
@document = @project . documents . build
2013-09-12 10:41:15 +08:00
#
2013-08-30 09:34:21 +08:00
@base_courses_tag = @project . project_type
2013-08-01 10:33:49 +08:00
respond_to do | format |
2013-09-12 10:41:15 +08:00
format . html { render :layout = > 'base_courses' if @base_courses_tag == 1 }
2013-08-01 10:33:49 +08:00
format . api
end
end
def settings
@issue_custom_fields = IssueCustomField . sorted . all
@issue_category || = IssueCategory . new
@member || = @project . members . new
@trackers = Tracker . sorted . all
@wiki || = @project . wiki
2013-08-30 09:34:21 +08:00
#Added by young
2013-09-12 10:41:15 +08:00
# @course_tag = params[:course]
# if @course_tag == '1'
2013-09-12 17:19:51 +08:00
if @project . project_type == 1
2013-09-16 08:49:39 +08:00
@course = Course . find_by_extra ( @project . identifier )
2013-08-30 09:34:21 +08:00
render :layout = > 'base_courses'
2013-09-16 08:49:39 +08:00
else
2013-09-12 17:25:40 +08:00
render :layout = > 'base_projects'
2013-08-30 09:34:21 +08:00
end
2013-09-12 10:41:15 +08:00
#Ended by young
2013-08-01 10:33:49 +08:00
end
def edit
end
2013-09-12 10:41:15 +08:00
2013-08-01 10:33:49 +08:00
#by young
def member
2013-09-13 10:11:36 +08:00
if @project . project_type == 1
render :layout = > 'base_courses'
end
2013-08-01 10:33:49 +08:00
end
2013-09-13 10:11:36 +08:00
# def news
# if @project.project_type == 1
# render :layout => 'base_courses'
# end
# end
2013-09-12 10:41:15 +08:00
2013-08-01 10:33:49 +08:00
def file
2013-09-13 21:52:24 +08:00
# if @project.project_type == 1
# render :layout => 'base_courses'
# end
2013-09-12 10:41:15 +08:00
# @course_tag = params[:course]
# if @course_tag == '1'
# render :layout => 'base_courses'
# end
# User.current
end
def statistics
2013-08-10 10:25:30 +08:00
end
2013-08-01 10:33:49 +08:00
#end
def update
@project . safe_attributes = params [ :project ]
if validate_parent_id && @project . save
2013-09-16 08:49:39 +08:00
@course = Course . find_by_extra ( @project . identifier )
2013-09-29 19:46:59 +08:00
unless @course . nil?
@course . password = params [ :project ] [ :course ] [ :password ]
2013-09-30 11:02:04 +08:00
# added by bai
@course . term = params [ :term ]
@course . time = params [ :time ]
# end
2013-09-29 19:46:59 +08:00
@course . save
end
2013-08-01 10:33:49 +08:00
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
2013-09-23 16:42:19 +08:00
if params [ :project ] [ :is_public ] == '0'
project_status = ProjectStatus . find_by_project_id ( @project . id )
project_status . destroy
elsif params [ :project ] [ :is_public ] == '1'
2013-10-10 10:36:56 +08:00
project_status = ProjectStatus . create ( :project_id = > @project . id , :watchers_count = > 0 , :changesets_count = > 0 , :project_type = > 1 )
2013-09-23 16:42:19 +08:00
end
2013-08-01 10:33:49 +08:00
respond_to do | format |
format . html {
flash [ :notice ] = l ( :notice_successful_update )
2013-09-13 16:36:36 +08:00
redirect_to settings_project_path ( @project , :course = > @project . project_type )
2013-08-01 10:33:49 +08:00
}
format . api { render_api_ok }
end
else
respond_to do | format |
format . html {
settings
render :action = > 'settings'
}
format . api { render_validation_errors ( @project ) }
end
end
end
def modules
@project . enabled_module_names = params [ :enabled_module_names ]
flash [ :notice ] = l ( :notice_successful_update )
redirect_to settings_project_path ( @project , :tab = > 'modules' )
end
def archive
if request . post?
unless @project . archive
flash [ :error ] = l ( :error_can_not_archive_project )
end
end
redirect_to admin_projects_path ( :status = > params [ :status ] )
end
def unarchive
@project . unarchive if request . post? && ! @project . active?
redirect_to admin_projects_path ( :status = > params [ :status ] )
end
def close
@project . close
redirect_to project_path ( @project )
end
def reopen
@project . reopen
redirect_to project_path ( @project )
end
# Delete @project
def destroy
@project_to_destroy = @project
if api_request? || params [ :confirm ]
@project_to_destroy . destroy
respond_to do | format |
format . html { redirect_to admin_projects_path }
format . api { render_api_ok }
end
2013-09-12 10:41:15 +08:00
else
render :layout = > " base "
end
2013-08-01 10:33:49 +08:00
# hide project in layout
@project = nil
end
private
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id
return true if User . current . admin?
parent_id = params [ :project ] && params [ :project ] [ :parent_id ]
if parent_id || @project . new_record?
parent = parent_id . blank? ? nil : Project . find_by_id ( parent_id . to_i )
unless @project . allowed_parents . include? ( parent )
@project . errors . add :parent_id , :invalid
2013-09-12 10:41:15 +08:00
return false
2013-08-01 10:33:49 +08:00
end
end
true
end
2013-09-12 10:41:15 +08:00
# added by huang
def watcherlist
if @watched
@users -= watched . watcher_users
end
end
2013-08-01 10:33:49 +08:00
end