@ -14,20 +14,24 @@
# 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
layout 'base_projects' # by young
menu_item :overview
menu_item :roadmap , :only = > :roadmap
menu_item :settings , :only = > :settings
menu_item :homework , :only = > :homework
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
#by huang
# menu_item :files, :only => :files
# menu_tiem :news, :only => :news
before_filter :find_project , :except = > [ :index , :list , :new , :create , :copy , :statistics ]
before_filter :authorize , :except = > [ :new_homework , :homework , :statistics , :index , :list , :new , :create , :copy , :archive , :unarchive , :destroy , :member , :focus , :file , :statistics , :feedback ]
before_filter :find_project , :except = > [ :index , : search, : list, :new , :create , :copy , :statistics , :new_join ]
before_filter :authorize , :except = > [ :new_ join, :new_ homework, :homework , :statistics , :search , :watcherlist , :index , :list , :new , :create , :copy , :archive , :unarchive , :destroy , :member , :focus , :file , :statistics , :feedback ]
before_filter :authorize_global , :only = > [ :new , :create ]
before_filter :require_admin , :only = > [ :copy , :archive , :unarchive , :destroy ]
#by young
before_filter :member , :file
before_filter :member , :file , :statistics , :watcherlist
#
accept_rss_auth :index
accept_api_auth :index , :show , :create , :update , :destroy
@ -37,7 +41,7 @@ class ProjectsController < ApplicationController
controller . send :expire_action , :controller = > 'welcome' , :action = > 'robots'
end
end
helper :bids
include BidsHelper
helper :sort
@ -54,49 +58,138 @@ class ProjectsController < ApplicationController
helper :activities
helper :documents
helper :watchers
# helper :watcherlist
### added by william
include ActsAsTaggableOn :: TagsHelper
# 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
def index
#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
# @offset ||= @project_pages.offset
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@projects = Project . visible
@projects_status = ProjectStatus . visible
# @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|
# @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
# ProjectStatus.create(:changesets_count => project.changesets.count, :project_id => project.id, :watchers_count => project.watcher_users.count)
# end
@projects = Project . visible . like ( params [ :name ] ) if params [ :name ] . present?
@project_count = @projects . count
#@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 . offset
@projects = @projects . offset ( @offset ) . limit ( @limit ) . order ( 'created_on DESC' ) . all
@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 . find_by_id ( " #{ obj . project_id } " )
end
#end
respond_to do | format |
respond_to do | format |
format . html {
render :layout = > 'base'
render :layout = > 'base'
scope = Project
unless params [ :closed ]
scope = scope . active
scope = scope . active
end
@projects = scope . visible . offset ( @offset ) . limit ( @limit ) . order ( 'created_on DESC' ) . all
}
format . api {
# @offset, @limit = api_offset_and_limit
# @project_count = Project.visible.count
# @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
# @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
@ -105,14 +198,48 @@ class ProjectsController < ApplicationController
end
end
def search
@projects = Project . visible
@projects = @projects . visible . like ( params [ :name ] ) if params [ :name ] . present?
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@project_count = @projects . visible . count
@project_pages = Paginator . new @project_count , @limit , params [ 'page' ]
@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
#Added by young
def homework
def homework
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@bids = Bid . visible
@bids = @project . homeworks
@bids = @bids . like ( params [ :name ] ) if params [ :name ] . present?
@bid_count = @bids . count
@bid_pages = Paginator . new @bid_count , @limit , params [ 'page' ]
@offset || = @bid_pages . reverse_offset
#@bids = @bids.offset(@offset).limit(@limit).all.reverse
unless @offset == 0
@ -122,16 +249,15 @@ class ProjectsController < ApplicationController
@bids = @bids . offset ( @offset ) . limit ( limit ) . all . reverse
end
render :layout = > 'base_courses'
end
def new_homework
end
def new_homework
@homework = Bid . new
@homework . safe_attributes = params [ :bid ]
@homework . safe_attributes = params [ :bid ]
render :layout = > 'base_courses'
end
#Ended by young
end
#Ended by young
def feedback
@jours = @project . journals_for_messages . reverse
@limit = 10
@ -142,40 +268,80 @@ class ProjectsController < ApplicationController
@state = false
end
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
def new
@course_tag = params [ :course ]
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
##add by xianbo
##add by huang
@course = Course . new
@course . safe_attributes = params [ :course ]
##end
render :layout = > 'base'
render :layout = > 'base'
end
def create
@course_tag = params [ :project ] [ :project_type ]
@course = Course . new
@course . extra = params [ :project ] [ :identifier ]
@course . safe_attributes = params [ :project ] [ :course ]
@course_tag = params [ :project ] [ :project_type ]
if ( @course_tag == " 1 " )
@course = Course . new
@course . extra = params [ :project ] [ :identifier ]
@course . safe_attributes = params [ :project ] [ :course ]
@course . save
# project = ProjectInfo.create(:user_id => User.current.id, :project_id => @project.id)
# project_status = ProjectStatus.create(:project_id => @project.id)
end
@issue_custom_fields = IssueCustomField . sorted . all
@trackers = Tracker . sorted . all
@project = Project . new
@project . safe_attributes = params [ :project ]
@course . save
if validate_parent_id && @project . 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 )
@project . members << m
@project . project_infos << project
project_status = ProjectStatus . create ( :project_id = > @project . id )
@project . members << m
@project . project_infos << project
end
respond_to do | format |
format . html {
@ -227,21 +393,23 @@ class ProjectsController < ApplicationController
end
end
rescue ActiveRecord :: RecordNotFound
# source_project not found
# source_project not found
render_404
end
end
# Show @project
def show
# try to redirect to the requested menu item
if params [ :jump ] && redirect_to_project_menu_item ( @project , params [ :jump ] )
return
return
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
@user = User . find_by_id ( ProjectInfo . find_by_project_id ( @project . id ) . user_id )
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 )
@ -251,13 +419,13 @@ class ProjectsController < ApplicationController
end
@key = User . current . rss_key
#新增内容
#新增内容
@days = Setting . activity_days_default . to_i
if params [ :from ]
begin ; @date_to = params [ :from ] . to_date + 1 ; rescue ; end
end
has = {
" show_issues " = > true ,
" show_files " = > true ,
@ -268,24 +436,24 @@ class ProjectsController < ApplicationController
@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 ] ) )
# 决定显示所用用户或单个用户活动
# 决定显示所用用户或单个用户活动
@activity = Redmine :: Activity :: Fetcher . new ( User . current , :project = > @project ,
:with_subprojects = > @with_subprojects ,
:author = > @author )
@activity . scope_select { | t | ! has [ " show_ #{ t } " ] . nil? }
# @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
# @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
#Added by young
events = @activity . events ( @date_from , @date_to )
@offset , @limit = api_offset_and_limit ( { :limit = > 10 } )
@events_count = events . count
@events_pages = Paginator . new @events_count , @limit , params [ 'page' ]
@offset || = @events_pages . offset
@offset || = @events_pages . offset
events = events . slice ( @offset , @limit )
#Ended by young
@events_by_day = events . group_by { | event | User . current . time_to_date ( event . event_datetime ) }
# documents
@sort_by = %w( category date title author ) . include? ( params [ :sort_by ] ) ? params [ :sort_by ] : 'category'
# documents
@sort_by = %w( category date title author ) . include? ( params [ :sort_by ] ) ? params [ :sort_by ] : 'category'
documents = @project . documents . includes ( :attachments , :category ) . all
case @sort_by
when 'date'
@ -295,17 +463,16 @@ class ProjectsController < ApplicationController
when 'author'
@grouped = documents . select { | d | d . attachments . any? } . group_by { | d | d . attachments . last . author }
else
@grouped = documents . group_by ( & :category )
@grouped = documents . group_by ( & :category )
end
@document = @project . documents . build
#
#
@base_courses_tag = @project . project_type
respond_to do | format |
format . html { render :layout = > 'base_courses' if @base_courses_tag }
format . html { render :layout = > 'base_courses' if @base_courses_tag == 1 }
format . api
end
end
def settings
@issue_custom_fields = IssueCustomField . sorted . all
@ -314,30 +481,37 @@ class ProjectsController < ApplicationController
@trackers = Tracker . sorted . all
@wiki || = @project . wiki
#Added by young
@course_tag = params [ :course ]
if @course_tag == '1'
# @course_tag = params[:course]
# if @course_tag == '1'
if @project . project_type
render :layout = > 'base_courses'
end
#Ended by young
#Ended by young
end
def edit
end
#by young
def member
end
def file
# @course_tag = params[:course]
# if @course_tag == '1'
# render :layout => 'base_courses'
# end
# User.current
end
def statistics
end
#end
def update
@project . safe_attributes = params [ :project ]
@Course . safe_attributes = params [ :project ] [ :course ]
@Course . save
if validate_parent_id && @project . save
@project . set_allowed_parent! ( params [ :project ] [ 'parent_id' ] ) if params [ :project ] . has_key? ( 'parent_id' )
respond_to do | format |
@ -397,9 +571,9 @@ class ProjectsController < ApplicationController
format . html { redirect_to admin_projects_path }
format . api { render_api_ok }
end
else
render :layout = > " base "
end
else
render :layout = > " base "
end
# hide project in layout
@project = nil
end
@ -415,9 +589,17 @@ class ProjectsController < ApplicationController
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
return false
return false
end
end
true
end
# added by huang
def watcherlist
if @watched
@users -= watched . watcher_users
end
end
end