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.
require 'csv'
class ProjectsController < ApplicationController
layout 'base'
2007-05-27 21:42:04 +04:00
before_filter :find_project , :except = > [ :index , :list , :add ]
before_filter :authorize , :except = > [ :index , :list , :add , :archive , :unarchive , :destroy ]
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-05-27 21:42:04 +04:00
cache_sweeper :project_sweeper , :only = > [ :add , :edit , :archive , :unarchive , :destroy ]
2007-05-06 20:40:33 +04:00
cache_sweeper :issue_sweeper , :only = > [ :add_issue ]
2007-08-26 00:19:19 +04:00
cache_sweeper :version_sweeper , :only = > [ :add_version ]
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
2006-07-03 23:38:10 +04:00
def index
list
2006-10-21 14:38:53 +04:00
render :action = > 'list' unless request . xhr?
2006-07-03 23:38:10 +04:00
end
2007-03-12 20:59:02 +03:00
2007-09-14 23:55:51 +04:00
# Lists visible projects
2007-03-12 20:59:02 +03:00
def list
2007-09-14 23:55:51 +04:00
projects = Project . find :all ,
:conditions = > Project . visible_by ( logged_in_user ) ,
:include = > :parent
@project_tree = projects . group_by { | p | p . parent || p }
@project_tree . each_key { | p | @project_tree [ p ] -= [ p ] }
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
@custom_fields = IssueCustomField . find ( :all )
2007-08-30 00:13:02 +04:00
@root_projects = Project . find ( :all , :conditions = > " parent_id IS NULL AND status = #{ Project :: STATUS_ACTIVE } " )
2007-03-12 20:59:02 +03:00
@project = Project . new ( params [ :project ] )
2007-09-15 12:56:31 +04:00
@project . enabled_module_names = Redmine :: AccessControl . available_project_modules
2007-03-12 20:59:02 +03:00
if request . get?
@custom_values = ProjectCustomField . find ( :all ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @project ) }
else
@project . custom_fields = CustomField . find ( params [ :custom_field_ids ] ) if params [ :custom_field_ids ]
2007-08-29 21:07:28 +04:00
@custom_values = ProjectCustomField . find ( :all ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @project , :value = > ( params [ :custom_fields ] ? params [ " custom_fields " ] [ x . id . to_s ] : nil ) ) }
2007-09-14 15:34:08 +04:00
@project . custom_values = @custom_values
2006-07-09 20:30:01 +04:00
if @project . save
2007-09-14 15:34:08 +04:00
@project . enabled_module_names = params [ :enabled_modules ]
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'
end
end
end
# Show @project
def show
@custom_values = @project . custom_values . find ( :all , :include = > :custom_field )
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 }
2007-05-27 21:42:04 +04:00
@subprojects = @project . active_children
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 " )
2007-03-12 20:59:02 +03:00
@trackers = Tracker . find ( :all , :order = > 'position' )
2007-03-16 01:11:02 +03:00
@open_issues_by_tracker = Issue . count ( :group = > :tracker , :joins = > " INNER JOIN #{ IssueStatus . table_name } ON #{ IssueStatus . table_name } .id = #{ Issue . table_name } .status_id " , :conditions = > [ " project_id=? and #{ IssueStatus . table_name } .is_closed=? " , @project . id , false ] )
2007-03-12 20:59:02 +03:00
@total_issues_by_tracker = Issue . count ( :group = > :tracker , :conditions = > [ " project_id=? " , @project . id ] )
2007-09-22 17:17:49 +04:00
@total_hours = @project . time_entries . sum ( :hours )
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-08-30 00:13:02 +04:00
@root_projects = Project :: find ( :all , :conditions = > [ " parent_id IS NULL AND status = #{ Project :: STATUS_ACTIVE } AND id <> ? " , @project . id ] )
2007-03-12 20:59:02 +03:00
@custom_fields = IssueCustomField . find ( :all )
@issue_category || = IssueCategory . new
@member || = @project . members . new
@custom_values || = ProjectCustomField . find ( :all ) . collect { | x | @project . custom_values . find_by_custom_field_id ( x . id ) || CustomValue . new ( :custom_field = > x ) }
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 . custom_fields = IssueCustomField . find ( params [ :custom_field_ids ] ) if params [ :custom_field_ids ]
if params [ :custom_fields ]
@custom_values = ProjectCustomField . find ( :all ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @project , :value = > params [ " custom_fields " ] [ x . id . to_s ] ) }
@project . custom_values = @custom_values
end
@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
# Add a new document to @project
def add_document
@document = @project . documents . build ( params [ :document ] )
if request . post? and @document . save
# Save the attachments
params [ :attachments ] . each { | a |
Attachment . create ( :container = > @document , :file = > a , :author = > logged_in_user ) unless a . size == 0
} if params [ :attachments ] and params [ :attachments ] . is_a? Array
flash [ :notice ] = l ( :notice_successful_create )
2007-10-12 22:04:56 +04:00
Mailer . deliver_document_added ( @document ) if Setting . notified_events . include? ( 'document_added' )
2007-03-12 20:59:02 +03:00
redirect_to :action = > 'list_documents' , :id = > @project
2006-06-28 22:11:03 +04:00
end
2007-03-12 20:59:02 +03:00
end
2006-07-29 13:32:58 +04:00
# Show documents list of @project
2007-03-12 20:59:02 +03:00
def list_documents
@documents = @project . documents . find :all , :include = > :category
end
# Add a new issue to @project
def add_issue
@tracker = Tracker . find ( params [ :tracker_id ] )
@priorities = Enumeration :: get_values ( 'IPRI' )
2007-04-03 22:34:22 +04:00
default_status = IssueStatus . default
2007-06-13 02:31:05 +04:00
unless default_status
2007-08-02 21:42:20 +04:00
flash . now [ :error ] = 'No default issue status defined. Please check your configuration.'
2007-06-13 02:31:05 +04:00
render :nothing = > true , :layout = > true
return
end
2007-04-05 01:52:53 +04:00
@issue = Issue . new ( :project = > @project , :tracker = > @tracker )
@issue . status = default_status
2007-04-24 19:19:49 +04:00
@allowed_statuses = ( [ default_status ] + default_status . find_new_statuses_allowed_to ( logged_in_user . role_for_project ( @project ) , @issue . tracker ) ) if logged_in_user
2007-03-12 20:59:02 +03:00
if request . get?
@issue . start_date = Date . today
@custom_values = @project . custom_fields_for_issues ( @tracker ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @issue ) }
else
@issue . attributes = params [ :issue ]
2007-04-03 22:34:22 +04:00
requested_status = IssueStatus . find_by_id ( params [ :issue ] [ :status_id ] )
@issue . status = ( @allowed_statuses . include? requested_status ) ? requested_status : default_status
2007-03-12 20:59:02 +03:00
@issue . author_id = self . logged_in_user . id if self . logged_in_user
# Multiple file upload
@attachments = [ ]
params [ :attachments ] . each { | a |
@attachments << Attachment . new ( :container = > @issue , :file = > a , :author = > logged_in_user ) unless a . size == 0
} if params [ :attachments ] and params [ :attachments ] . is_a? Array
@custom_values = @project . custom_fields_for_issues ( @tracker ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @issue , :value = > params [ " custom_fields " ] [ x . id . to_s ] ) }
@issue . custom_values = @custom_values
if @issue . save
@attachments . each ( & :save )
flash [ :notice ] = l ( :notice_successful_create )
2007-09-14 19:30:46 +04:00
Mailer . deliver_issue_add ( @issue ) if Setting . notified_events . include? ( 'issue_added' )
2007-03-12 20:59:02 +03:00
redirect_to :action = > 'list_issues' , :id = > @project
end
end
end
# Show filtered/sorted issues list of @project
def list_issues
2007-03-16 01:11:02 +03:00
sort_init " #{ Issue . table_name } .id " , " desc "
2007-03-12 20:59:02 +03:00
sort_update
retrieve_query
@results_per_page_options = [ 15 , 25 , 50 , 100 ]
if params [ :per_page ] and @results_per_page_options . include? params [ :per_page ] . to_i
@results_per_page = params [ :per_page ] . to_i
session [ :results_per_page ] = @results_per_page
else
@results_per_page = session [ :results_per_page ] || 25
end
if @query . valid?
2007-08-26 16:29:53 +04:00
@issue_count = Issue . count ( :include = > [ :status , :project ] , :conditions = > @query . statement )
2007-03-12 20:59:02 +03:00
@issue_pages = Paginator . new self , @issue_count , @results_per_page , params [ 'page' ]
@issues = Issue . find :all , :order = > sort_clause ,
2007-10-01 15:39:34 +04:00
:include = > [ :assigned_to , :status , :tracker , :project , :priority , :category ] ,
2007-03-12 20:59:02 +03:00
:conditions = > @query . statement ,
:limit = > @issue_pages . items_per_page ,
:offset = > @issue_pages . current . offset
2007-06-23 17:49:29 +04:00
end
2007-09-22 17:17:49 +04:00
2007-03-12 20:59:02 +03:00
render :layout = > false if request . xhr?
end
# Export filtered/sorted issues list to CSV
def export_issues_csv
2007-03-16 01:11:02 +03:00
sort_init " #{ Issue . table_name } .id " , " desc "
2007-03-12 20:59:02 +03:00
sort_update
retrieve_query
render :action = > 'list_issues' and return unless @query . valid?
@issues = Issue . find :all , :order = > sort_clause ,
2007-05-01 00:18:28 +04:00
:include = > [ :assigned_to , :author , :status , :tracker , :priority , :project , { :custom_values = > :custom_field } ] ,
2007-03-12 20:59:02 +03:00
:conditions = > @query . statement ,
2007-05-30 02:20:43 +04:00
:limit = > Setting . issues_export_limit . to_i
2007-03-12 20:59:02 +03:00
ic = Iconv . new ( l ( :general_csv_encoding ) , 'UTF-8' )
export = StringIO . new
CSV :: Writer . generate ( export , l ( :general_csv_separator ) ) do | csv |
# csv header fields
headers = [ " # " , l ( :field_status ) ,
2007-05-01 00:18:28 +04:00
l ( :field_project ) ,
2007-03-12 20:59:02 +03:00
l ( :field_tracker ) ,
l ( :field_priority ) ,
l ( :field_subject ) ,
2007-04-05 11:33:51 +04:00
l ( :field_assigned_to ) ,
2007-03-12 20:59:02 +03:00
l ( :field_author ) ,
l ( :field_start_date ) ,
l ( :field_due_date ) ,
l ( :field_done_ratio ) ,
l ( :field_created_on ) ,
l ( :field_updated_on )
]
for custom_field in @project . all_custom_fields
headers << custom_field . name
end
2007-06-23 20:55:17 +04:00
csv << headers . collect { | c | begin ; ic . iconv ( c . to_s ) ; rescue ; c . to_s ; end }
2007-03-12 20:59:02 +03:00
# csv lines
@issues . each do | issue |
fields = [ issue . id , issue . status . name ,
2007-05-01 00:18:28 +04:00
issue . project . name ,
2007-03-12 20:59:02 +03:00
issue . tracker . name ,
issue . priority . name ,
2007-05-01 00:18:28 +04:00
issue . subject ,
2007-04-05 11:33:51 +04:00
( issue . assigned_to ? issue . assigned_to . name : " " ) ,
issue . author . name ,
2007-03-12 20:59:02 +03:00
issue . start_date ? l_date ( issue . start_date ) : nil ,
issue . due_date ? l_date ( issue . due_date ) : nil ,
issue . done_ratio ,
l_datetime ( issue . created_on ) ,
l_datetime ( issue . updated_on )
]
for custom_field in @project . all_custom_fields
fields << ( show_value issue . custom_value_for ( custom_field ) )
end
2007-06-23 20:55:17 +04:00
csv << fields . collect { | c | begin ; ic . iconv ( c . to_s ) ; rescue ; c . to_s ; end }
2007-03-12 20:59:02 +03:00
end
end
export . rewind
send_data ( export . read , :type = > 'text/csv; header=present' , :filename = > 'export.csv' )
end
# Export filtered/sorted issues to PDF
def export_issues_pdf
2007-03-16 01:11:02 +03:00
sort_init " #{ Issue . table_name } .id " , " desc "
2007-03-12 20:59:02 +03:00
sort_update
retrieve_query
render :action = > 'list_issues' and return unless @query . valid?
@issues = Issue . find :all , :order = > sort_clause ,
2007-08-26 16:29:53 +04:00
:include = > [ :author , :status , :tracker , :priority , :project ] ,
2007-03-12 20:59:02 +03:00
:conditions = > @query . statement ,
2007-05-30 02:20:43 +04:00
:limit = > Setting . issues_export_limit . to_i
2007-03-12 20:59:02 +03:00
@options_for_rfpdf || = { }
@options_for_rfpdf [ :file_name ] = " export.pdf "
render :layout = > false
end
2007-10-09 23:07:19 +04:00
# Bulk edit issues
def bulk_edit_issues
if request . post?
2007-10-12 19:55:06 +04:00
status = IssueStatus . find_by_id ( params [ :status_id ] )
2007-10-09 23:07:19 +04:00
priority = Enumeration . find_by_id ( params [ :priority_id ] )
assigned_to = User . find_by_id ( params [ :assigned_to_id ] )
2007-10-10 22:08:49 +04:00
category = @project . issue_categories . find_by_id ( params [ :category_id ] )
fixed_version = @project . versions . find_by_id ( params [ :fixed_version_id ] )
2007-10-09 23:07:19 +04:00
issues = @project . issues . find_all_by_id ( params [ :issue_ids ] )
2007-10-12 19:55:06 +04:00
unsaved_issue_ids = [ ]
2007-10-09 23:07:19 +04:00
issues . each do | issue |
2007-10-11 21:20:23 +04:00
journal = issue . init_journal ( User . current , params [ :notes ] )
2007-10-09 23:07:19 +04:00
issue . priority = priority if priority
2007-10-18 20:29:23 +04:00
issue . assigned_to = assigned_to if assigned_to || params [ :assigned_to_id ] == 'none'
2007-10-10 22:08:49 +04:00
issue . category = category if category
issue . fixed_version = fixed_version if fixed_version
2007-10-09 23:07:19 +04:00
issue . start_date = params [ :start_date ] unless params [ :start_date ] . blank?
issue . due_date = params [ :due_date ] unless params [ :due_date ] . blank?
issue . done_ratio = params [ :done_ratio ] unless params [ :done_ratio ] . blank?
2007-10-12 19:55:06 +04:00
# Don't save any change to the issue if the user is not authorized to apply the requested status
if ( status . nil? || ( issue . status . new_status_allowed_to? ( status , current_role , issue . tracker ) && issue . status = status ) ) && issue . save
2007-10-11 21:20:23 +04:00
# Send notification for each issue (if changed)
Mailer . deliver_issue_edit ( journal ) if journal . details . any? && Setting . notified_events . include? ( 'issue_updated' )
else
2007-10-12 19:55:06 +04:00
# Keep unsaved issue ids to display them in flash error
2007-10-11 21:20:23 +04:00
unsaved_issue_ids << issue . id
end
2007-10-09 23:07:19 +04:00
end
if unsaved_issue_ids . empty?
flash [ :notice ] = l ( :notice_successful_update ) unless issues . empty?
else
flash [ :error ] = l ( :notice_failed_to_save_issues , unsaved_issue_ids . size , issues . size , '#' + unsaved_issue_ids . join ( ', #' ) )
end
redirect_to :action = > 'list_issues' , :id = > @project
return
end
2007-10-12 19:55:06 +04:00
if current_role && User . current . allowed_to? ( :change_issue_status , @project )
# Find potential statuses the user could be allowed to switch issues to
@available_statuses = Workflow . find ( :all , :include = > :new_status ,
:conditions = > { :role_id = > current_role . id } ) . collect ( & :new_status ) . compact . uniq
end
2007-10-09 23:07:19 +04:00
render :update do | page |
page . hide 'query_form'
page . replace_html 'bulk-edit' , :partial = > 'issues/bulk_edit_form'
end
end
2007-03-12 20:59:02 +03:00
def move_issues
@issues = @project . issues . find ( params [ :issue_ids ] ) if params [ :issue_ids ]
redirect_to :action = > 'list_issues' , :id = > @project and return unless @issues
@projects = [ ]
# find projects to which the user is allowed to move the issue
2007-08-29 20:52:35 +04:00
User . current . memberships . each { | m | @projects << m . project if m . role . allowed_to? ( :controller = > 'projects' , :action = > 'move_issues' ) }
2007-03-12 20:59:02 +03:00
# issue can be moved to any tracker
@trackers = Tracker . find ( :all )
if request . post? and params [ :new_project_id ] and params [ :new_tracker_id ]
2007-09-01 00:56:14 +04:00
new_project = Project . find_by_id ( params [ :new_project_id ] )
new_tracker = Tracker . find_by_id ( params [ :new_tracker_id ] )
@issues . each do | i |
if new_project && i . project_id != new_project . id
# issue is moved to another project
2007-03-12 20:59:02 +03:00
i . category = nil
i . fixed_version = nil
2007-05-05 17:22:27 +04:00
# delete issue relations
i . relations_from . clear
i . relations_to . clear
2007-09-01 00:56:14 +04:00
i . project = new_project
end
if new_tracker
i . tracker = new_tracker
2007-03-12 20:59:02 +03:00
end
i . save
2007-09-01 00:56:14 +04:00
end
2007-03-12 20:59:02 +03:00
flash [ :notice ] = l ( :notice_successful_update )
redirect_to :action = > 'list_issues' , :id = > @project
end
end
# Add a news to @project
def add_news
@news = News . new ( :project = > @project )
if request . post?
@news . attributes = params [ :news ]
@news . author_id = self . logged_in_user . id if self . logged_in_user
if @news . save
flash [ :notice ] = l ( :notice_successful_create )
2007-09-14 19:30:46 +04:00
Mailer . deliver_news_added ( @news ) if Setting . notified_events . include? ( 'news_added' )
2007-03-12 20:59:02 +03:00
redirect_to :action = > 'list_news' , :id = > @project
end
end
end
# Show news list of @project
def list_news
2007-09-22 21:52:43 +04:00
@news_pages , @newss = paginate :news , :per_page = > 10 , :conditions = > [ " project_id=? " , @project . id ] , :include = > :author , :order = > " #{ News . table_name } .created_on DESC "
2007-08-29 20:52:35 +04:00
respond_to do | format |
format . html { render :layout = > false if request . xhr? }
2007-09-22 21:52:43 +04:00
format . atom { render_feed ( @newss , :title = > " #{ @project . name } : #{ l ( :label_news_plural ) } " ) }
2007-08-29 20:52:35 +04:00
end
2007-03-12 20:59:02 +03:00
end
def add_file
if request . post?
@version = @project . versions . find_by_id ( params [ :version_id ] )
# Save the attachments
@attachments = [ ]
params [ :attachments ] . each { | file |
next unless file . size > 0
a = Attachment . create ( :container = > @version , :file = > file , :author = > logged_in_user )
@attachments << a unless a . new_record?
} if params [ :attachments ] and params [ :attachments ] . is_a? Array
2007-10-12 22:04:56 +04: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
2007-05-20 21:46:02 +04:00
@versions = @project . versions . sort
2007-03-12 20:59:02 +03:00
end
# Show changelog for @project
def changelog
@trackers = Tracker . 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
@trackers = Tracker . find ( :all , :conditions = > [ " is_in_roadmap=? " , true ] , :order = > 'position' )
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
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
@month || = Date . today . month
2007-08-29 20:52:35 +04:00
case params [ :format ]
2007-10-01 22:49:31 +04:00
when 'atom'
2007-08-29 20:52:35 +04:00
# 30 last days
@date_from = Date . today - 30
@date_to = Date . today + 1
else
# current month
@date_from = Date . civil ( @year , @month , 1 )
@date_to = @date_from >> 1
end
2007-03-12 20:59:02 +03:00
2007-09-24 21:33:24 +04:00
@event_types = %w( issues news files documents wiki_pages changesets )
@event_types . delete ( 'wiki_pages' ) unless @project . wiki
2007-08-29 20:52:35 +04:00
@event_types . delete ( 'changesets' ) unless @project . repository
2007-09-24 21:33:24 +04:00
# only show what the user is allowed to view
@event_types = @event_types . select { | o | User . current . allowed_to? ( " view_ #{ o } " . to_sym , @project ) }
2007-03-12 20:59:02 +03:00
2007-08-29 20:52:35 +04:00
@scope = @event_types . select { | t | params [ " show_ #{ t } " ] }
# default events if none is specified in parameters
2007-09-24 21:33:24 +04:00
@scope = ( @event_types - %w( wiki_pages ) ) if @scope . empty?
2007-08-29 20:52:35 +04:00
@events = [ ]
if @scope . include? ( 'issues' )
@events += @project . issues . find ( :all , :include = > [ :author , :tracker ] , :conditions = > [ " #{ Issue . table_name } .created_on>=? and #{ Issue . table_name } .created_on<=? " , @date_from , @date_to ] )
2007-03-12 20:59:02 +03:00
end
2007-08-29 20:52:35 +04:00
if @scope . include? ( 'news' )
@events += @project . news . find ( :all , :conditions = > [ " #{ News . table_name } .created_on>=? and #{ News . table_name } .created_on<=? " , @date_from , @date_to ] , :include = > :author )
2007-03-12 20:59:02 +03:00
end
2007-09-24 21:33:24 +04:00
if @scope . include? ( 'files' )
2007-08-29 20:52:35 +04:00
@events += Attachment . find ( :all , :select = > " #{ Attachment . table_name } .* " , :joins = > " LEFT JOIN #{ Version . table_name } ON #{ Version . table_name } .id = #{ Attachment . table_name } .container_id " , :conditions = > [ " #{ Attachment . table_name } .container_type='Version' and #{ Version . table_name } .project_id=? and #{ Attachment . table_name } .created_on>=? and #{ Attachment . table_name } .created_on<=? " , @project . id , @date_from , @date_to ] , :include = > :author )
2007-03-12 20:59:02 +03:00
end
2007-08-29 20:52:35 +04:00
if @scope . include? ( 'documents' )
@events += @project . documents . find ( :all , :conditions = > [ " #{ Document . table_name } .created_on>=? and #{ Document . table_name } .created_on<=? " , @date_from , @date_to ] )
@events += Attachment . find ( :all , :select = > " attachments.* " , :joins = > " LEFT JOIN #{ Document . table_name } ON #{ Document . table_name } .id = #{ Attachment . table_name } .container_id " , :conditions = > [ " #{ Attachment . table_name } .container_type='Document' and #{ Document . table_name } .project_id=? and #{ Attachment . table_name } .created_on>=? and #{ Attachment . table_name } .created_on<=? " , @project . id , @date_from , @date_to ] , :include = > :author )
2007-03-12 20:59:02 +03:00
end
2007-09-24 21:33:24 +04:00
if @scope . include? ( 'wiki_pages' )
2007-04-25 19:06:20 +04:00
select = " #{ WikiContent . versioned_table_name } .updated_on, #{ WikiContent . versioned_table_name } .comments, " +
2007-08-29 20:52:35 +04:00
" #{ WikiContent . versioned_table_name } . #{ WikiContent . version_column } , #{ WikiPage . table_name } .title, " +
" #{ WikiContent . versioned_table_name } .page_id, #{ WikiContent . versioned_table_name } .author_id, " +
" #{ WikiContent . versioned_table_name } .id "
2007-03-23 18:58:02 +03:00
joins = " LEFT JOIN #{ WikiPage . table_name } ON #{ WikiPage . table_name } .id = #{ WikiContent . versioned_table_name } .page_id " +
" LEFT JOIN #{ Wiki . table_name } ON #{ Wiki . table_name } .id = #{ WikiPage . table_name } .wiki_id "
conditions = [ " #{ Wiki . table_name } .project_id = ? AND #{ WikiContent . versioned_table_name } .updated_on BETWEEN ? AND ? " ,
@project . id , @date_from , @date_to ]
2007-08-29 20:52:35 +04:00
@events += WikiContent . versioned_class . find ( :all , :select = > select , :joins = > joins , :conditions = > conditions )
2007-03-23 18:58:02 +03:00
end
2007-09-24 21:33:24 +04:00
if @scope . include? ( 'changesets' )
2007-08-29 20:52:35 +04:00
@events += @project . repository . changesets . find ( :all , :conditions = > [ " #{ Changeset . table_name } .committed_on BETWEEN ? AND ? " , @date_from , @date_to ] )
2007-03-25 16:12:15 +04:00
end
2007-08-29 20:52:35 +04:00
@events_by_day = @events . group_by ( & :event_date )
respond_to do | format |
format . html { render :layout = > false if request . xhr? }
format . atom { render_feed ( @events , :title = > " #{ @project . name } : #{ l ( :label_activity ) } " ) }
end
2007-03-12 20:59:02 +03:00
end
def calendar
2007-03-31 21:15:30 +04:00
@trackers = Tracker . find ( :all , :order = > 'position' )
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 )
2007-03-31 21:15:30 +04:00
2007-10-08 00:07:11 +04:00
events = [ ]
2007-04-02 21:12:02 +04:00
@project . issues_with_subprojects ( params [ :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?
end
2007-10-08 00:07:11 +04:00
events += @project . versions . find ( :all , :conditions = > [ " effective_date BETWEEN ? AND ? " , @calendar . startdt , @calendar . enddt ] )
@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
def gantt
2007-03-31 21:15:30 +04:00
@trackers = Tracker . find ( :all , :order = > 'position' )
retrieve_selected_tracker_ids ( @trackers )
2007-03-12 20:59:02 +03:00
if params [ :year ] and params [ :year ] . to_i > 0
@year_from = params [ :year ] . to_i
if params [ :month ] and params [ :month ] . to_i > = 1 and params [ :month ] . to_i < = 12
@month_from = params [ :month ] . to_i
else
@month_from = 1
end
else
2007-10-12 00:57:37 +04:00
@month_from || = Date . today . month
@year_from || = Date . today . year
2007-03-12 20:59:02 +03:00
end
2007-10-12 00:57:37 +04:00
zoom = ( params [ :zoom ] || User . current . pref [ :gantt_zoom ] ) . to_i
@zoom = ( zoom > 0 && zoom < 5 ) ? zoom : 2
months = ( params [ :months ] || User . current . pref [ :gantt_months ] ) . to_i
@months = ( months > 0 && months < 25 ) ? months : 6
# Save gantt paramters as user preference (zoom and months count)
if ( User . current . logged? && ( @zoom != User . current . pref [ :gantt_zoom ] || @months != User . current . pref [ :gantt_months ] ) )
User . current . pref [ :gantt_zoom ] , User . current . pref [ :gantt_months ] = @zoom , @months
User . current . preference . save
end
2007-03-12 20:59:02 +03:00
@date_from = Date . civil ( @year_from , @month_from , 1 )
@date_to = ( @date_from >> @months ) - 1
2007-03-31 21:15:30 +04:00
2007-04-07 16:09:01 +04:00
@events = [ ]
2007-04-02 21:12:02 +04:00
@project . issues_with_subprojects ( params [ :with_subprojects ] ) do
2007-04-07 16:09:01 +04:00
@events += Issue . find ( :all ,
2007-04-02 21:12:02 +04:00
:order = > " start_date, due_date " ,
2007-04-27 20:21:53 +04:00
:include = > [ :tracker , :status , :assigned_to , :priority , :project ] ,
2007-04-02 21:12:02 +04:00
:conditions = > [ " (((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null and #{ Issue . table_name } .tracker_id in ( #{ @selected_tracker_ids . join ( ',' ) } )) " , @date_from , @date_to , @date_from , @date_to , @date_from , @date_to ]
) unless @selected_tracker_ids . empty?
end
2007-04-07 16:09:01 +04:00
@events += @project . versions . find ( :all , :conditions = > [ " effective_date BETWEEN ? AND ? " , @date_from , @date_to ] )
@events . sort! { | x , y | x . start_date < = > y . start_date }
2007-03-12 20:59:02 +03:00
2007-08-26 11:55:57 +04:00
if params [ :format ] == 'pdf'
2007-03-12 20:59:02 +03:00
@options_for_rfpdf || = { }
2007-08-26 11:55:57 +04:00
@options_for_rfpdf [ :file_name ] = " #{ @project . identifier } -gantt.pdf "
2007-03-12 20:59:02 +03:00
render :template = > " projects/gantt.rfpdf " , :layout = > false
2007-08-26 11:55:57 +04:00
elsif params [ :format ] == 'png' && respond_to? ( 'gantt_image' )
image = gantt_image ( @events , @date_from , @months , @zoom )
image . format = 'PNG'
send_data ( image . to_blob , :disposition = > 'inline' , :type = > 'image/png' , :filename = > " #{ @project . identifier } -gantt.png " )
2007-03-12 20:59:02 +03:00
else
render :template = > " projects/gantt.rhtml "
end
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
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
2007-03-12 20:59:02 +03:00
# Retrieve query from session or build a new query
def retrieve_query
if params [ :query_id ]
@query = @project . queries . find ( params [ :query_id ] )
2007-05-08 16:46:15 +04:00
@query . executed_by = logged_in_user
2007-03-12 20:59:02 +03:00
session [ :query ] = @query
else
if params [ :set_filter ] or ! session [ :query ] or session [ :query ] . project_id != @project . id
# Give it a name, required to be valid
2007-05-08 16:46:15 +04:00
@query = Query . new ( :name = > " _ " , :executed_by = > logged_in_user )
2007-03-12 20:59:02 +03:00
@query . project = @project
if params [ :fields ] and params [ :fields ] . is_a? Array
params [ :fields ] . each do | field |
@query . add_filter ( field , params [ :operators ] [ field ] , params [ :values ] [ field ] )
end
else
@query . available_filters . keys . each do | field |
@query . add_short_filter ( field , params [ field ] ) if params [ field ]
end
end
session [ :query ] = @query
else
@query = session [ :query ]
end
end
end
2006-06-28 22:11:03 +04:00
end