2007-03-12 20:59:02 +03:00
# redMine - project management software
# Copyright (C) 2006-2007 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
2008-01-19 14:53:43 +03:00
menu_item :overview
menu_item :activity , :only = > :activity
menu_item :roadmap , :only = > :roadmap
menu_item :files , :only = > [ :list_files , :add_file ]
menu_item :settings , :only = > :settings
2008-02-10 16:17:41 +03:00
menu_item :issues , :only = > [ :changelog ]
2008-01-19 14:53:43 +03:00
2008-03-11 22:33:38 +03:00
before_filter :find_project , :except = > [ :index , :list , :add , :activity ]
before_filter :find_optional_project , :only = > :activity
before_filter :authorize , :except = > [ :index , :list , :add , :archive , :unarchive , :destroy , :activity ]
2007-05-27 21:42:04 +04:00
before_filter :require_admin , :only = > [ :add , :archive , :unarchive , :destroy ]
2007-08-29 20:52:35 +04:00
accept_key_auth :activity , :calendar
2007-05-06 20:40:33 +04:00
2007-03-12 20:59:02 +03:00
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :ifpdf
include IfpdfHelper
2007-10-03 21:20:04 +04:00
helper :issues
2007-03-12 20:59:02 +03:00
helper IssuesHelper
helper :queries
include QueriesHelper
2007-06-13 00:12:05 +04:00
helper :repositories
include RepositoriesHelper
2007-08-26 11:55:57 +04:00
include ProjectsHelper
2007-03-12 20:59:02 +03:00
2007-09-14 23:55:51 +04:00
# Lists visible projects
2008-05-27 00:10:32 +04:00
def index
2007-09-14 23:55:51 +04:00
projects = Project . find :all ,
2007-11-20 18:40:16 +03:00
:conditions = > Project . visible_by ( User . current ) ,
2007-09-14 23:55:51 +04:00
:include = > :parent
2008-05-27 20:49:18 +04:00
respond_to do | format |
format . html {
@project_tree = projects . group_by { | p | p . parent || p }
2008-07-04 21:58:14 +04:00
@project_tree . keys . each { | p | @project_tree [ p ] -= [ p ] }
2008-05-27 20:49:18 +04:00
}
format . atom {
render_feed ( projects . sort_by ( & :created_on ) . reverse . slice ( 0 , Setting . feeds_limit . to_i ) ,
:title = > " #{ Setting . app_title } : #{ l ( :label_project_latest ) } " )
}
end
2007-03-12 20:59:02 +03:00
end
2007-09-14 23:55:51 +04:00
2006-06-28 22:11:03 +04:00
# Add a new project
2007-03-12 20:59:02 +03:00
def add
2008-06-28 00:13:56 +04:00
@issue_custom_fields = IssueCustomField . find ( :all , :order = > " #{ CustomField . table_name } .position " )
2007-11-20 23:29:03 +03:00
@trackers = Tracker . all
2007-12-03 13:28:08 +03:00
@root_projects = Project . find ( :all ,
:conditions = > " parent_id IS NULL AND status = #{ Project :: STATUS_ACTIVE } " ,
:order = > 'name' )
2007-03-12 20:59:02 +03:00
@project = Project . new ( params [ :project ] )
if request . get?
2008-08-31 16:59:57 +04:00
@project . identifier = Project . next_identifier if Setting . sequential_project_identifiers?
2007-11-20 23:29:03 +03:00
@project . trackers = Tracker . all
2008-03-12 22:58:19 +03:00
@project . is_public = Setting . default_projects_public?
2008-04-26 13:49:16 +04:00
@project . enabled_module_names = Redmine :: AccessControl . available_project_modules
2007-03-12 20:59:02 +03:00
else
2008-04-26 13:49:16 +04:00
@project . enabled_module_names = params [ :enabled_modules ]
2006-07-09 20:30:01 +04:00
if @project . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2007-03-12 20:59:02 +03:00
redirect_to :controller = > 'admin' , :action = > 'projects'
2008-04-26 13:49:16 +04:00
end
2007-03-12 20:59:02 +03:00
end
end
# Show @project
def show
2007-04-08 21:44:54 +04:00
@members_by_role = @project . members . find ( :all , :include = > [ :user , :role ] , :order = > 'position' ) . group_by { | m | m . role }
2008-05-01 16:56:59 +04:00
@subprojects = @project . children . find ( :all , :conditions = > Project . visible_by ( User . current ) )
2007-03-16 01:11:02 +03:00
@news = @project . news . find ( :all , :limit = > 5 , :include = > [ :author , :project ] , :order = > " #{ News . table_name } .created_on DESC " )
2008-02-29 00:57:03 +03:00
@trackers = @project . rolled_up_trackers
2008-03-27 21:22:12 +03:00
cond = @project . project_condition ( Setting . display_subprojects_issues? )
2008-02-29 00:57:03 +03:00
Issue . visible_by ( User . current ) do
@open_issues_by_tracker = Issue . count ( :group = > :tracker ,
:include = > [ :project , :status , :tracker ] ,
2008-03-27 21:22:12 +03:00
:conditions = > [ " ( #{ cond } ) AND #{ IssueStatus . table_name } .is_closed=? " , false ] )
2008-02-29 00:57:03 +03:00
@total_issues_by_tracker = Issue . count ( :group = > :tracker ,
:include = > [ :project , :status , :tracker ] ,
2008-03-27 21:22:12 +03:00
:conditions = > cond )
2008-02-29 00:57:03 +03:00
end
2008-02-27 23:50:19 +03:00
TimeEntry . visible_by ( User . current ) do
@total_hours = TimeEntry . sum ( :hours ,
:include = > :project ,
2008-03-27 21:22:12 +03:00
:conditions = > cond ) . to_f
2008-02-27 23:50:19 +03:00
end
2007-08-29 20:52:35 +04:00
@key = User . current . rss_key
2006-07-09 20:30:01 +04:00
end
2007-03-12 20:59:02 +03:00
def settings
2007-12-03 13:28:08 +03:00
@root_projects = Project . find ( :all ,
:conditions = > [ " parent_id IS NULL AND status = #{ Project :: STATUS_ACTIVE } AND id <> ? " , @project . id ] ,
:order = > 'name' )
2008-06-28 00:13:56 +04:00
@issue_custom_fields = IssueCustomField . find ( :all , :order = > " #{ CustomField . table_name } .position " )
2007-03-12 20:59:02 +03:00
@issue_category || = IssueCategory . new
@member || = @project . members . new
2007-11-20 23:29:03 +03:00
@trackers = Tracker . all
2007-09-14 15:34:08 +04:00
@repository || = @project . repository
@wiki || = @project . wiki
2007-03-12 20:59:02 +03:00
end
# Edit @project
def edit
if request . post?
@project . attributes = params [ :project ]
2006-12-24 16:38:45 +03:00
if @project . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_update )
2007-03-12 20:59:02 +03:00
redirect_to :action = > 'settings' , :id = > @project
else
settings
render :action = > 'settings'
end
2006-07-09 20:30:01 +04:00
end
2007-03-12 20:59:02 +03:00
end
2007-09-14 15:34:08 +04:00
def modules
@project . enabled_module_names = params [ :enabled_modules ]
redirect_to :action = > 'settings' , :id = > @project , :tab = > 'modules'
end
2007-03-12 20:59:02 +03:00
2007-05-27 21:42:04 +04:00
def archive
@project . archive if request . post? && @project . active?
redirect_to :controller = > 'admin' , :action = > 'projects'
end
def unarchive
@project . unarchive if request . post? && ! @project . active?
redirect_to :controller = > 'admin' , :action = > 'projects'
end
2006-07-29 13:32:58 +04:00
# Delete @project
2007-03-12 20:59:02 +03:00
def destroy
2007-05-27 21:42:04 +04:00
@project_to_destroy = @project
2006-06-28 22:11:03 +04:00
if request . post? and params [ :confirm ]
2007-05-27 21:42:04 +04:00
@project_to_destroy . destroy
2007-03-12 20:59:02 +03:00
redirect_to :controller = > 'admin' , :action = > 'projects'
end
2007-05-27 21:42:04 +04:00
# hide project in layout
@project = nil
2007-03-12 20:59:02 +03:00
end
# Add a new issue category to @project
def add_issue_category
2007-06-29 21:21:37 +04:00
@category = @project . issue_categories . build ( params [ :category ] )
if request . post? and @category . save
2007-08-16 20:45:06 +04:00
respond_to do | format |
format . html do
flash [ :notice ] = l ( :notice_successful_create )
redirect_to :action = > 'settings' , :tab = > 'categories' , :id = > @project
end
format . js do
# IE doesn't support the replace_html rjs method for select box options
render ( :update ) { | page | page . replace " issue_category_id " ,
content_tag ( 'select' , '<option></option>' + options_from_collection_for_select ( @project . issue_categories , 'id' , 'name' , @category . id ) , :id = > 'issue_category_id' , :name = > 'issue[category_id]' )
}
end
end
2007-03-12 20:59:02 +03:00
end
2007-06-29 21:21:37 +04:00
end
2007-03-12 20:59:02 +03:00
# Add a new version to @project
def add_version
@version = @project . versions . build ( params [ :version ] )
if request . post? and @version . save
flash [ :notice ] = l ( :notice_successful_create )
redirect_to :action = > 'settings' , :tab = > 'versions' , :id = > @project
end
end
def add_file
if request . post?
@version = @project . versions . find_by_id ( params [ :version_id ] )
2007-12-18 22:07:54 +03:00
attachments = attach_files ( @version , params [ :attachments ] )
2007-12-14 20:33:05 +03:00
Mailer . deliver_attachments_added ( attachments ) if ! attachments . empty? && Setting . notified_events . include? ( 'file_added' )
2007-03-12 20:59:02 +03:00
redirect_to :controller = > 'projects' , :action = > 'list_files' , :id = > @project
end
2007-05-20 21:46:02 +04:00
@versions = @project . versions . sort
2007-03-12 20:59:02 +03:00
end
def list_files
2008-04-06 14:53:18 +04:00
sort_init " #{ Attachment . table_name } .filename " , " asc "
sort_update
@versions = @project . versions . find ( :all , :include = > :attachments , :order = > sort_clause ) . sort . reverse
render :layout = > ! request . xhr?
2007-03-12 20:59:02 +03:00
end
# Show changelog for @project
def changelog
2007-11-20 23:29:03 +03:00
@trackers = @project . trackers . find ( :all , :conditions = > [ " is_in_chlog=? " , true ] , :order = > 'position' )
2007-05-20 21:46:02 +04:00
retrieve_selected_tracker_ids ( @trackers )
@versions = @project . versions . sort
2007-03-12 20:59:02 +03:00
end
def roadmap
2007-11-20 23:29:03 +03:00
@trackers = @project . trackers . find ( :all , :conditions = > [ " is_in_roadmap=? " , true ] )
2007-05-20 21:46:02 +04:00
retrieve_selected_tracker_ids ( @trackers )
2007-08-12 13:58:38 +04:00
@versions = @project . versions . sort
@versions = @versions . select { | v | ! v . completed? } unless params [ :completed ]
2007-03-12 20:59:02 +03:00
end
def activity
2008-03-05 16:44:08 +03:00
@days = Setting . activity_days_default . to_i
if params [ :from ]
begin ; @date_to = params [ :from ] . to_date ; rescue ; end
2007-03-12 20:59:02 +03:00
end
2008-03-05 16:44:08 +03:00
@date_to || = Date . today + 1
@date_from = @date_to - @days
2008-07-27 21:54:09 +04:00
@with_subprojects = params [ :with_subprojects ] . nil? ? Setting . display_subprojects_issues? : ( params [ :with_subprojects ] == '1' )
2007-03-12 20:59:02 +03:00
2008-07-27 21:54:09 +04:00
@activity = Redmine :: Activity :: Fetcher . new ( User . current , :project = > @project , :with_subprojects = > @with_subprojects )
@activity . scope_select { | t | ! params [ " show_ #{ t } " ] . nil? }
@activity . default_scope! if @activity . scope . empty?
2007-03-23 18:58:02 +03:00
2008-07-27 21:54:09 +04:00
events = @activity . events ( @date_from , @date_to )
2007-08-29 20:52:35 +04:00
respond_to do | format |
2008-07-27 21:54:09 +04:00
format . html {
@events_by_day = events . group_by ( & :event_date )
render :layout = > false if request . xhr?
}
2008-07-06 17:57:10 +04:00
format . atom {
2008-07-30 22:33:35 +04:00
title = ( @activity . scope . size == 1 ) ? l ( " label_ #{ @activity . scope . first . singularize } _plural " ) : l ( :label_activity )
2008-07-27 21:54:09 +04:00
render_feed ( events , :title = > " #{ @project || Setting . app_title } : #{ title } " )
2008-07-06 17:57:10 +04:00
}
2007-08-29 20:52:35 +04:00
end
2007-03-12 20:59:02 +03:00
end
def calendar
2008-01-17 00:27:48 +03:00
@trackers = @project . rolled_up_trackers
2007-03-31 21:15:30 +04:00
retrieve_selected_tracker_ids ( @trackers )
2007-03-12 20:59:02 +03:00
if params [ :year ] and params [ :year ] . to_i > 1900
@year = params [ :year ] . to_i
if params [ :month ] and params [ :month ] . to_i > 0 and params [ :month ] . to_i < 13
@month = params [ :month ] . to_i
end
end
@year || = Date . today . year
2007-10-08 00:07:11 +04:00
@month || = Date . today . month
@calendar = Redmine :: Helpers :: Calendar . new ( Date . civil ( @year , @month , 1 ) , current_language , :month )
2008-03-06 11:32:56 +03:00
@with_subprojects = params [ :with_subprojects ] . nil? ? Setting . display_subprojects_issues? : ( params [ :with_subprojects ] == '1' )
2007-10-08 00:07:11 +04:00
events = [ ]
2008-02-29 00:57:03 +03:00
@project . issues_with_subprojects ( @with_subprojects ) do
2007-10-08 00:07:11 +04:00
events += Issue . find ( :all ,
2007-04-27 20:21:53 +04:00
:include = > [ :tracker , :status , :assigned_to , :priority , :project ] ,
2007-10-08 00:07:11 +04:00
:conditions = > [ " ((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{ Issue . table_name } .tracker_id IN ( #{ @selected_tracker_ids . join ( ',' ) } ) " , @calendar . startdt , @calendar . enddt , @calendar . startdt , @calendar . enddt ]
2007-04-02 21:12:02 +04:00
) unless @selected_tracker_ids . empty?
2008-04-27 12:20:53 +04:00
events += Version . find ( :all , :include = > :project ,
:conditions = > [ " effective_date BETWEEN ? AND ? " , @calendar . startdt , @calendar . enddt ] )
2007-04-02 21:12:02 +04:00
end
2007-10-08 00:07:11 +04:00
@calendar . events = events
2007-03-31 21:15:30 +04:00
2007-03-12 20:59:02 +03:00
render :layout = > false if request . xhr?
end
2007-03-17 18:18:50 +03:00
2007-03-12 20:59:02 +03:00
private
# Find project of id params[:id]
# if not found, redirect to project list
# Used as a before_filter
def find_project
@project = Project . find ( params [ :id ] )
2007-01-02 11:47:07 +03:00
rescue ActiveRecord :: RecordNotFound
2007-03-12 20:59:02 +03:00
render_404
end
2008-03-11 22:33:38 +03:00
def find_optional_project
return true unless params [ :id ]
@project = Project . find ( params [ :id ] )
authorize
rescue ActiveRecord :: RecordNotFound
render_404
end
2007-03-31 21:15:30 +04:00
def retrieve_selected_tracker_ids ( selectable_trackers )
if ids = params [ :tracker_ids ]
@selected_tracker_ids = ( ids . is_a? Array ) ? ids . collect { | id | id . to_i . to_s } : ids . split ( '/' ) . collect { | id | id . to_i . to_s }
else
@selected_tracker_ids = selectable_trackers . collect { | t | t . id . to_s }
end
end
2006-06-28 22:11:03 +04:00
end