2006-06-28 22:11:03 +04:00
# redMine - project management software
2007-01-02 12:58:07 +03:00
# Copyright (C) 2006-2007 Jean-Philippe Lang
2006-06-28 22:11:03 +04:00
#
# 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.
2007-01-25 22:32:07 +03:00
require 'csv'
2006-06-28 22:11:03 +04:00
class ProjectsController < ApplicationController
2006-12-16 16:37:32 +03:00
layout 'base'
2006-07-03 23:38:10 +04:00
before_filter :find_project , :authorize , :except = > [ :index , :list , :add ]
2006-06-28 22:11:03 +04:00
before_filter :require_admin , :only = > [ :add , :destroy ]
helper :sort
2006-12-16 16:37:32 +03:00
include SortHelper
2006-07-03 23:38:10 +04:00
helper :custom_fields
include CustomFieldsHelper
2006-10-22 18:47:25 +04:00
helper :ifpdf
include IfpdfHelper
2006-11-28 01:31:14 +03:00
helper IssuesHelper
2006-12-16 16:37:32 +03:00
helper :queries
include QueriesHelper
2006-10-22 18:47:25 +04: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
2006-06-28 22:11:03 +04:00
2006-07-09 20:30:01 +04:00
# Lists public projects
def list
sort_init 'name' , 'asc'
sort_update
2007-01-26 23:06:05 +03:00
@project_count = Project . count ( :all , :conditions = > [ " is_public=? " , true ] )
2006-07-09 20:30:01 +04:00
@project_pages = Paginator . new self , @project_count ,
2006-06-28 22:11:03 +04:00
15 ,
2006-12-27 00:33:44 +03:00
params [ 'page' ]
2006-07-09 20:30:01 +04:00
@projects = Project . find :all , :order = > sort_clause ,
:conditions = > [ " is_public=? " , true ] ,
2006-06-28 22:11:03 +04:00
:limit = > @project_pages . items_per_page ,
2006-10-21 14:38:53 +04:00
:offset = > @project_pages . current . offset
render :action = > " list " , :layout = > false if request . xhr?
2006-06-28 22:11:03 +04:00
end
# Add a new project
2006-07-09 20:30:01 +04:00
def add
2006-07-29 13:32:58 +04:00
@custom_fields = IssueCustomField . find ( :all )
@root_projects = Project . find ( :all , :conditions = > " parent_id is null " )
2006-07-09 20:30:01 +04:00
@project = Project . new ( params [ :project ] )
2006-07-29 13:32:58 +04:00
if request . get?
@custom_values = ProjectCustomField . find ( :all ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @project ) }
else
2006-12-27 00:33:44 +03:00
@project . custom_fields = CustomField . find ( params [ :custom_field_ids ] ) if params [ :custom_field_ids ]
2006-07-29 13:32:58 +04:00
@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
2006-12-24 16:38:45 +03:00
if params [ :repository_enabled ] && params [ :repository_enabled ] == " 1 "
@project . repository = Repository . new
@project . repository . attributes = params [ :repository ]
end
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 )
2006-07-09 20:30:01 +04:00
redirect_to :controller = > 'admin' , :action = > 'projects'
end
end
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Show @project
2006-07-09 20:30:01 +04:00
def show
2006-07-29 13:32:58 +04:00
@custom_values = @project . custom_values . find ( :all , :include = > :custom_field )
2006-07-09 20:30:01 +04:00
@members = @project . members . find ( :all , :include = > [ :user , :role ] )
2007-01-26 23:34:09 +03:00
@subprojects = @project . children if @project . children . size > 0
2006-07-29 13:32:58 +04:00
@news = @project . news . find ( :all , :limit = > 5 , :include = > [ :author , :project ] , :order = > " news.created_on DESC " )
2007-02-01 00:18:43 +03:00
@trackers = Tracker . find ( :all , :order = > 'position' )
2007-01-06 15:18:29 +03:00
@open_issues_by_tracker = Issue . count ( :group = > :tracker , :joins = > " INNER JOIN issue_statuses ON issue_statuses.id = issues.status_id " , :conditions = > [ " project_id=? and issue_statuses.is_closed=? " , @project . id , false ] )
@total_issues_by_tracker = Issue . count ( :group = > :tracker , :conditions = > [ " project_id=? " , @project . id ] )
2006-07-09 20:30:01 +04:00
end
2006-06-28 22:11:03 +04:00
def settings
2006-07-09 20:30:01 +04:00
@root_projects = Project :: find ( :all , :conditions = > [ " parent_id is null and id <> ? " , @project . id ] )
2006-12-27 00:18:44 +03:00
@custom_fields = IssueCustomField . find ( :all )
2006-07-09 20:30:01 +04:00
@issue_category || = IssueCategory . new
2006-06-28 22:11:03 +04:00
@member || = @project . members . new
2007-01-31 23:57:01 +03:00
@roles = Role . find ( :all , :order = > 'position' )
2007-01-26 23:52:52 +03:00
@users = User . find_active ( :all ) - @project . users
2006-07-31 23:52:08 +04:00
@custom_values || = ProjectCustomField . find ( :all ) . collect { | x | @project . custom_values . find_by_custom_field_id ( x . id ) || CustomValue . new ( :custom_field = > x ) }
2006-06-28 22:11:03 +04:00
end
2006-07-09 20:30:01 +04:00
# Edit @project
def edit
if request . post?
2006-12-27 00:33:44 +03:00
@project . custom_fields = IssueCustomField . find ( params [ :custom_field_ids ] ) if params [ :custom_field_ids ]
2006-07-29 13:32:58 +04:00
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
2006-12-24 16:38:45 +03:00
if params [ :repository_enabled ]
case params [ :repository_enabled ]
when " 0 "
@project . repository = nil
when " 1 "
@project . repository || = Repository . new
2007-02-26 22:20:18 +03:00
@project . repository . update_attributes params [ :repository ]
2006-12-24 16:38:45 +03:00
end
end
@project . attributes = params [ :project ]
if @project . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_update )
2006-07-09 20:30:01 +04:00
redirect_to :action = > 'settings' , :id = > @project
2006-06-28 22:11:03 +04:00
else
settings
render :action = > 'settings'
2006-07-09 20:30:01 +04:00
end
end
2006-06-28 22:11:03 +04:00
end
2006-07-29 13:32:58 +04:00
# Delete @project
def destroy
2006-06-28 22:11:03 +04:00
if request . post? and params [ :confirm ]
@project . destroy
redirect_to :controller = > 'admin' , :action = > 'projects'
end
2006-07-29 13:32:58 +04:00
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Add a new issue category to @project
def add_issue_category
if request . post?
@issue_category = @project . issue_categories . build ( params [ :issue_category ] )
if @issue_category . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2007-01-26 20:59:06 +03:00
redirect_to :action = > 'settings' , :tab = > 'categories' , :id = > @project
2006-07-29 13:32:58 +04:00
else
2006-06-28 22:11:03 +04:00
settings
render :action = > 'settings'
2006-07-29 13:32:58 +04:00
end
end
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Add a new version to @project
def add_version
@version = @project . versions . build ( params [ :version ] )
if request . post? and @version . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2007-01-26 20:59:06 +03:00
redirect_to :action = > 'settings' , :tab = > 'versions' , :id = > @project
2006-07-29 13:32:58 +04:00
end
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Add a new member to @project
def add_member
2006-06-28 22:11:03 +04:00
@member = @project . members . build ( params [ :member ] )
2006-07-29 13:32:58 +04:00
if request . post?
if @member . save
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2007-01-26 20:59:06 +03:00
redirect_to :action = > 'settings' , :tab = > 'members' , :id = > @project
2006-07-29 13:32:58 +04:00
else
2006-06-28 22:11:03 +04:00
settings
render :action = > 'settings'
end
2006-07-29 13:32:58 +04:00
end
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Show members list of @project
def list_members
2007-02-18 16:45:15 +03:00
@members = @project . members . find ( :all )
2006-07-29 13:32:58 +04:00
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Add a new document to @project
def add_document
@categories = Enumeration :: get_values ( 'DCAT' )
@document = @project . documents . build ( params [ :document ] )
2007-01-01 14:26:56 +03:00
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-01-27 18:01:19 +03:00
Mailer . deliver_document_add ( @document ) if Permission . find_by_controller_and_action ( params [ :controller ] , params [ :action ] ) . mail_enabled?
2007-01-01 14:26:56 +03:00
redirect_to :action = > 'list_documents' , :id = > @project
2006-07-29 13:32:58 +04:00
end
end
# Show documents list of @project
def list_documents
2006-12-16 20:33:31 +03:00
@documents = @project . documents . find :all , :include = > :category
2006-07-29 13:32:58 +04:00
end
2006-06-28 22:11:03 +04:00
2006-07-29 13:32:58 +04:00
# Add a new issue to @project
def add_issue
@tracker = Tracker . find ( params [ :tracker_id ] )
@priorities = Enumeration :: get_values ( 'IPRI' )
@issue = Issue . new ( :project = > @project , :tracker = > @tracker )
2006-11-12 21:50:30 +03:00
if request . get?
@issue . start_date = Date . today
2006-07-29 13:32:58 +04:00
@custom_values = @project . custom_fields_for_issues ( @tracker ) . collect { | x | CustomValue . new ( :custom_field = > x , :customized = > @issue ) }
else
@issue . attributes = params [ :issue ]
@issue . author_id = self . logged_in_user . id if self . logged_in_user
2006-11-05 21:38:20 +03:00
# Multiple file upload
2006-12-26 20:10:05 +03:00
@attachments = [ ]
2006-11-05 21:38:20 +03:00
params [ :attachments ] . each { | a |
2006-12-26 20:10:05 +03:00
@attachments << Attachment . new ( :container = > @issue , :file = > a , :author = > logged_in_user ) unless a . size == 0
2006-11-05 21:38:20 +03:00
} if params [ :attachments ] and params [ :attachments ] . is_a? Array
2006-07-29 13:32:58 +04:00
@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 ] ) }
2006-12-26 20:10:05 +03:00
@issue . custom_values = @custom_values
2006-07-29 13:32:58 +04:00
if @issue . save
2006-12-26 20:10:05 +03:00
@attachments . each ( & :save )
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2006-12-27 00:33:44 +03:00
Mailer . deliver_issue_add ( @issue ) if Permission . find_by_controller_and_action ( params [ :controller ] , params [ :action ] ) . mail_enabled?
2006-07-29 13:32:58 +04:00
redirect_to :action = > 'list_issues' , :id = > @project
end
end
end
2006-07-09 20:30:01 +04:00
# Show filtered/sorted issues list of @project
2006-07-03 23:38:10 +04:00
def list_issues
sort_init 'issues.id' , 'desc'
sort_update
2006-12-16 16:37:32 +03:00
retrieve_query
2006-07-03 23:38:10 +04:00
2006-10-22 18:47:25 +04:00
@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
2006-11-12 21:50:30 +03:00
@results_per_page = session [ :results_per_page ] || 25
2006-10-22 18:47:25 +04:00
end
2006-12-16 16:37:32 +03:00
if @query . valid?
@issue_count = Issue . count ( :include = > [ :status , :project ] , :conditions = > @query . statement )
2006-12-27 00:33:44 +03:00
@issue_pages = Paginator . new self , @issue_count , @results_per_page , params [ 'page' ]
2006-12-16 16:37:32 +03:00
@issues = Issue . find :all , :order = > sort_clause ,
2007-02-02 16:56:49 +03:00
:include = > [ :author , :status , :tracker , :project , :priority ] ,
2006-12-16 16:37:32 +03:00
:conditions = > @query . statement ,
:limit = > @issue_pages . items_per_page ,
:offset = > @issue_pages . current . offset
2007-01-02 12:58:07 +03:00
end
2007-02-01 00:18:43 +03:00
@trackers = Tracker . find :all , :order = > 'position'
2006-10-22 18:47:25 +04:00
render :layout = > false if request . xhr?
2006-07-03 23:38:10 +04:00
end
# Export filtered/sorted issues list to CSV
def export_issues_csv
sort_init 'issues.id' , 'desc'
sort_update
2006-12-16 16:37:32 +03:00
retrieve_query
render :action = > 'list_issues' and return unless @query . valid?
2006-07-03 23:38:10 +04:00
@issues = Issue . find :all , :order = > sort_clause ,
2007-01-25 22:32:07 +03:00
:include = > [ :author , :status , :tracker , :priority , { :custom_values = > :custom_field } ] ,
2007-02-02 19:05:54 +03:00
:conditions = > @query . statement ,
2007-02-04 18:45:38 +03:00
:limit = > Setting . issues_export_limit
2006-06-28 22:11:03 +04:00
2007-03-01 22:49:04 +03:00
ic = Iconv . new ( l ( :general_csv_encoding ) , 'UTF-8' )
2006-07-03 23:38:10 +04:00
export = StringIO . new
2006-10-22 18:47:25 +04:00
CSV :: Writer . generate ( export , l ( :general_csv_separator ) ) do | csv |
# csv header fields
2007-01-25 22:32:07 +03:00
headers = [ " # " , l ( :field_status ) ,
l ( :field_tracker ) ,
l ( :field_priority ) ,
l ( :field_subject ) ,
l ( :field_author ) ,
l ( :field_start_date ) ,
l ( :field_due_date ) ,
l ( :field_done_ratio ) ,
l ( :field_created_on ) ,
l ( :field_updated_on )
]
2006-10-22 18:47:25 +04:00
for custom_field in @project . all_custom_fields
headers << custom_field . name
end
csv << headers . collect { | c | ic . iconv ( c ) }
# csv lines
2006-07-03 23:38:10 +04:00
@issues . each do | issue |
2007-01-25 22:32:07 +03:00
fields = [ issue . id , issue . status . name ,
issue . tracker . name ,
issue . priority . name ,
issue . subject ,
issue . author . display_name ,
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 )
]
2006-10-22 18:47:25 +04:00
for custom_field in @project . all_custom_fields
fields << ( show_value issue . custom_value_for ( custom_field ) )
end
csv << fields . collect { | c | ic . iconv ( c . to_s ) }
2006-07-03 23:38:10 +04:00
end
end
export . rewind
2006-10-22 18:47:25 +04:00
send_data ( export . read , :type = > 'text/csv; header=present' , :filename = > 'export.csv' )
end
# Export filtered/sorted issues to PDF
def export_issues_pdf
sort_init 'issues.id' , 'desc'
sort_update
2006-12-16 16:37:32 +03:00
retrieve_query
render :action = > 'list_issues' and return unless @query . valid?
2006-10-22 18:47:25 +04:00
@issues = Issue . find :all , :order = > sort_clause ,
2007-02-04 15:27:41 +03:00
:include = > [ :author , :status , :tracker , :priority ] ,
2007-02-02 19:05:54 +03:00
:conditions = > @query . statement ,
2007-02-04 18:45:38 +03:00
:limit = > Setting . issues_export_limit
2006-10-22 18:47:25 +04:00
@options_for_rfpdf || = { }
@options_for_rfpdf [ :file_name ] = " export.pdf "
2006-12-16 16:37:32 +03:00
render :layout = > false
2006-07-03 23:38:10 +04:00
end
2006-06-28 22:11:03 +04:00
2006-10-15 18:33:04 +04: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
@logged_in_user . memberships . each { | m | @projects << m . project if Permission . allowed_to_role ( " projects/move_issues " , m . role_id ) }
# issue can be moved to any tracker
@trackers = Tracker . find ( :all )
if request . post? and params [ :new_project_id ] and params [ :new_tracker_id ]
new_project = Project . find ( params [ :new_project_id ] )
new_tracker = Tracker . find ( params [ :new_tracker_id ] )
@issues . each { | i |
2006-12-17 17:22:09 +03:00
# project dependent properties
unless i . project_id == new_project . id
i . category = nil
i . fixed_version = nil
end
2006-10-15 18:33:04 +04:00
# move the issue
i . project = new_project
i . tracker = new_tracker
i . save
}
flash [ :notice ] = l ( :notice_successful_update )
redirect_to :action = > 'list_issues' , :id = > @project
end
end
2006-12-16 16:37:32 +03:00
def add_query
@query = Query . new ( params [ :query ] )
@query . project = @project
@query . user = logged_in_user
params [ :fields ] . each do | field |
@query . add_filter ( field , params [ :operators ] [ field ] , params [ :values ] [ field ] )
end if params [ :fields ]
if request . post? and @query . save
flash [ :notice ] = l ( :notice_successful_create )
redirect_to :controller = > 'reports' , :action = > 'issue_report' , :id = > @project
end
render :layout = > false if request . xhr?
end
2006-07-29 13:32:58 +04:00
# 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
2006-07-30 14:47:02 +04:00
flash [ :notice ] = l ( :notice_successful_create )
2006-07-29 13:32:58 +04:00
redirect_to :action = > 'list_news' , :id = > @project
end
end
end
# Show news list of @project
2006-07-03 23:38:10 +04:00
def list_news
2006-06-28 22:11:03 +04:00
@news_pages , @news = paginate :news , :per_page = > 10 , :conditions = > [ " project_id=? " , @project . id ] , :include = > :author , :order = > " news.created_on DESC "
2006-10-21 14:38:53 +04:00
render :action = > " list_news " , :layout = > false if request . xhr?
2006-07-03 23:38:10 +04:00
end
2006-07-29 13:32:58 +04:00
2006-12-16 19:31:11 +03:00
def add_file
2007-01-01 14:26:56 +03:00
if request . post?
@version = @project . versions . find_by_id ( params [ :version_id ] )
# Save the attachments
2007-01-27 18:01:19 +03:00
@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?
2007-01-01 14:26:56 +03:00
} if params [ :attachments ] and params [ :attachments ] . is_a? Array
2007-01-27 18:01:19 +03:00
Mailer . deliver_attachments_add ( @attachments ) if ! @attachments . empty? and Permission . find_by_controller_and_action ( params [ :controller ] , params [ :action ] ) . mail_enabled?
2007-01-01 14:26:56 +03:00
redirect_to :controller = > 'projects' , :action = > 'list_files' , :id = > @project
2006-06-28 22:11:03 +04:00
end
@versions = @project . versions
end
def list_files
@versions = @project . versions
end
2006-07-30 16:55:29 +04:00
# Show changelog for @project
2006-07-03 23:38:10 +04:00
def changelog
2007-02-01 00:18:43 +03:00
@trackers = Tracker . find ( :all , :conditions = > [ " is_in_chlog=? " , true ] , :order = > 'position' )
2006-07-30 16:55:29 +04:00
if request . get?
@selected_tracker_ids = @trackers . collect { | t | t . id . to_s }
else
@selected_tracker_ids = params [ :tracker_ids ] . collect { | id | id . to_i . to_s } if params [ :tracker_ids ] and params [ :tracker_ids ] . is_a? Array
end
@selected_tracker_ids || = [ ]
2006-07-03 23:38:10 +04:00
@fixed_issues = @project . issues . find ( :all ,
2006-07-30 16:55:29 +04:00
:include = > [ :fixed_version , :status , :tracker ] ,
:conditions = > [ " issue_statuses.is_closed=? and issues.tracker_id in ( #{ @selected_tracker_ids . join ( ',' ) } ) and issues.fixed_version_id is not null " , true ] ,
:order = > " versions.effective_date DESC, issues.id DESC "
) unless @selected_tracker_ids . empty?
@fixed_issues || = [ ]
2006-07-03 23:38:10 +04:00
end
2006-06-28 22:11:03 +04:00
2007-02-04 12:18:40 +03:00
def roadmap
@trackers = Tracker . find ( :all , :conditions = > [ " is_in_roadmap=? " , true ] , :order = > 'position' )
if request . get?
@selected_tracker_ids = @trackers . collect { | t | t . id . to_s }
else
@selected_tracker_ids = params [ :tracker_ids ] . collect { | id | id . to_i . to_s } if params [ :tracker_ids ] and params [ :tracker_ids ] . is_a? Array
end
@selected_tracker_ids || = [ ]
@versions = @project . versions . find ( :all ,
:conditions = > [ " versions.effective_date>? " , Date . today ] ,
:order = > " versions.effective_date ASC "
)
end
2006-11-05 19:49:27 +03:00
def activity
2006-11-12 21:50:30 +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
@month || = Date . today . month
@date_from = Date . civil ( @year , @month , 1 )
@date_to = ( @date_from >> 1 ) - 1
2006-11-05 19:49:27 +03:00
@events_by_day = { }
unless params [ :show_issues ] == " 0 "
2006-11-12 21:50:30 +03:00
@project . issues . find ( :all , :include = > [ :author , :status ] , :conditions = > [ " issues.created_on>=? and issues.created_on<=? " , @date_from , @date_to ] ) . each { | i |
2006-11-05 19:49:27 +03:00
@events_by_day [ i . created_on . to_date ] || = [ ]
@events_by_day [ i . created_on . to_date ] << i
}
@show_issues = 1
end
unless params [ :show_news ] == " 0 "
2006-12-16 20:33:31 +03:00
@project . news . find ( :all , :conditions = > [ " news.created_on>=? and news.created_on<=? " , @date_from , @date_to ] , :include = > :author ) . each { | i |
2006-11-05 19:49:27 +03:00
@events_by_day [ i . created_on . to_date ] || = [ ]
@events_by_day [ i . created_on . to_date ] << i
}
@show_news = 1
end
unless params [ :show_files ] == " 0 "
2006-12-16 20:33:31 +03:00
Attachment . find ( :all , :select = > " attachments.* " , :joins = > " LEFT JOIN versions ON versions.id = attachments.container_id " , :conditions = > [ " attachments.container_type='Version' and versions.project_id=? and attachments.created_on>=? and attachments.created_on<=? " , @project . id , @date_from , @date_to ] , :include = > :author ) . each { | i |
2006-11-05 19:49:27 +03:00
@events_by_day [ i . created_on . to_date ] || = [ ]
@events_by_day [ i . created_on . to_date ] << i
}
@show_files = 1
end
2006-11-22 01:27:47 +03:00
unless params [ :show_documents ] == " 0 "
2006-12-12 00:25:50 +03:00
@project . documents . find ( :all , :conditions = > [ " documents.created_on>=? and documents.created_on<=? " , @date_from , @date_to ] ) . each { | i |
@events_by_day [ i . created_on . to_date ] || = [ ]
@events_by_day [ i . created_on . to_date ] << i
}
2006-12-16 20:33:31 +03:00
Attachment . find ( :all , :select = > " attachments.* " , :joins = > " LEFT JOIN documents ON documents.id = attachments.container_id " , :conditions = > [ " attachments.container_type='Document' and documents.project_id=? and attachments.created_on>=? and attachments.created_on<=? " , @project . id , @date_from , @date_to ] , :include = > :author ) . each { | i |
2006-11-05 19:49:27 +03:00
@events_by_day [ i . created_on . to_date ] || = [ ]
@events_by_day [ i . created_on . to_date ] << i
}
@show_documents = 1
end
2006-12-06 23:54:43 +03:00
render :layout = > false if request . xhr?
2006-11-05 19:49:27 +03:00
end
2006-11-12 21:50:30 +03:00
def calendar
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
@date_from = Date . civil ( @year , @month , 1 )
@date_to = ( @date_from >> 1 ) - 1
# start on monday
@date_from = @date_from - ( @date_from . cwday - 1 )
# finish on sunday
@date_to = @date_to + ( 7 - @date_to . cwday )
2007-01-13 13:36:18 +03:00
@issues = @project . issues . find ( :all , :include = > [ :tracker , :status , :assigned_to , :priority ] , :conditions = > [ " ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?)) " , @date_from , @date_to , @date_from , @date_to ] )
2006-11-12 21:50:30 +03:00
render :layout = > false if request . xhr?
end
def gantt
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
@month_from || = ( Date . today << 1 ) . month
@year_from || = ( Date . today << 1 ) . year
end
@zoom = ( params [ :zoom ] . to_i > 0 and params [ :zoom ] . to_i < 5 ) ? params [ :zoom ] . to_i : 2
@months = ( params [ :months ] . to_i > 0 and params [ :months ] . to_i < 25 ) ? params [ :months ] . to_i : 6
@date_from = Date . civil ( @year_from , @month_from , 1 )
@date_to = ( @date_from >> @months ) - 1
2007-01-13 13:36:18 +03:00
@issues = @project . issues . find ( :all , :order = > " start_date, due_date " , :include = > [ :tracker , :status , :assigned_to , :priority ] , :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) " , @date_from , @date_to , @date_from , @date_to , @date_from , @date_to ] )
2006-11-12 21:50:30 +03:00
if params [ :output ] == 'pdf'
@options_for_rfpdf || = { }
@options_for_rfpdf [ :file_name ] = " gantt.pdf "
render :template = > " projects/gantt.rfpdf " , :layout = > false
else
render :template = > " projects/gantt.rhtml "
end
end
2007-02-28 00:03:15 +03:00
def search
2007-03-10 16:32:04 +03:00
@question = params [ :q ] || " "
@question . strip!
@all_words = params [ :all_words ] || ( params [ :submit ] ? false : true )
2007-02-28 00:03:15 +03:00
@scope = params [ :scope ] || ( params [ :submit ] ? [ ] : %w( issues news documents ) )
2007-03-10 16:32:04 +03:00
if ! @question . empty?
# tokens must be at least 3 character long
@tokens = @question . split . uniq . select { | w | w . length > 2 }
# no more than 5 tokens to search for
@tokens . slice! 5 .. - 1 if @tokens . size > 5
# strings used in sql like statement
like_tokens = @tokens . collect { | w | " % #{ w } % " }
operator = @all_words ? " AND " : " OR "
limit = 10
2007-02-28 00:03:15 +03:00
@results = [ ]
2007-03-10 16:32:04 +03:00
@results += @project . issues . find ( :all , :limit = > limit , :include = > :author , :conditions = > [ ( [ " (LOWER(issues.subject) like ? OR LOWER(issues.description) like ?) " ] * like_tokens . size ) . join ( operator ) , * ( like_tokens * 2 ) . sort ] ) if @scope . include? 'issues'
@results += @project . news . find ( :all , :limit = > limit , :conditions = > [ ( [ " (LOWER(news.title) like ? OR LOWER(news.description) like ?) " ] * like_tokens . size ) . join ( operator ) , * ( like_tokens * 2 ) . sort ] , :include = > :author ) if @scope . include? 'news'
@results += @project . documents . find ( :all , :limit = > limit , :conditions = > [ ( [ " (LOWER(title) like ? OR LOWER(description) like ?) " ] * like_tokens . size ) . join ( operator ) , * ( like_tokens * 2 ) . sort ] ) if @scope . include? 'documents'
@question = @tokens . join ( " " )
2007-02-28 00:03:15 +03:00
end
end
2006-06-28 22:11:03 +04:00
private
2006-07-29 13:32:58 +04:00
# Find project of id params[:id]
# if not found, redirect to project list
2006-07-30 16:55:29 +04:00
# Used as a before_filter
2006-07-29 13:32:58 +04:00
def find_project
2006-11-12 21:50:30 +03:00
@project = Project . find ( params [ :id ] )
@html_title = @project . name
2007-01-02 11:47:07 +03:00
rescue ActiveRecord :: RecordNotFound
render_404
2006-07-29 13:32:58 +04:00
end
2006-12-16 16:37:32 +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-01-27 01:05:32 +03:00
session [ :query ] = @query
2006-12-16 16:37:32 +03:00
else
if params [ :set_filter ] or ! session [ :query ] or session [ :query ] . project_id != @project . id
# Give it a name, required to be valid
@query = Query . new ( :name = > " _ " )
@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