##// END OF EJS Templates
Added the ability to reset its own RSS access key on "My account"....
Added the ability to reset its own RSS access key on "My account". git-svn-id: http://redmine.rubyforge.org/svn/trunk@677 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r664:c8b3c8dfec4c
r666:39c9874a4102
Show More
projects_controller.rb
672 lines | 27.6 KiB | text/x-ruby | RubyLexer
/ app / controllers / projects_controller.rb
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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'
Jean-Philippe Lang
Added the ability to archive projects:...
r546 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 ]
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 accept_key_auth :activity, :calendar
Jean-Philippe Lang
Added fragment caching for calendar and gantt views...
r512
Jean-Philippe Lang
Added the ability to archive projects:...
r546 cache_sweeper :project_sweeper, :only => [ :add, :edit, :archive, :unarchive, :destroy ]
Jean-Philippe Lang
Added fragment caching for calendar and gantt views...
r512 cache_sweeper :issue_sweeper, :only => [ :add_issue ]
Jean-Philippe Lang
Fixed: calendar and gantt not updated when adding/editing/deleting a project version....
r659 cache_sweeper :version_sweeper, :only => [ :add_version ]
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :ifpdf
include IfpdfHelper
helper IssuesHelper
helper :queries
include QueriesHelper
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 helper :repositories
include RepositoriesHelper
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 include ProjectsHelper
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
git-svn-id: http://redmine.rubyforge.org/svn/trunk@6 e93f8b46-1217-0410-a6f0-8f06a7374b81
r4 def index
list
Jean-Philippe Lang
ajaxified paginators...
r31 render :action => 'list' unless request.xhr?
Jean-Philippe Lang
git-svn-id: http://redmine.rubyforge.org/svn/trunk@6 e93f8b46-1217-0410-a6f0-8f06a7374b81
r4 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
v0.2.0...
r5 # Lists public projects
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def list
Jean-Philippe Lang
Added parent project name (if it exists) on project list and project overview....
r401 sort_init "#{Project.table_name}.name", "asc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
Jean-Philippe Lang
Projects menu item now shows the list of public projects and projects for which the user is a member (marked with a star)....
r457 @project_count = Project.count(:all, :conditions => Project.visible_by(logged_in_user))
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @project_pages = Paginator.new self, @project_count,
15,
params['page']
@projects = Project.find :all, :order => sort_clause,
Jean-Philippe Lang
Projects menu item now shows the list of public projects and projects for which the user is a member (marked with a star)....
r457 :conditions => Project.visible_by(logged_in_user),
Jean-Philippe Lang
Added parent project name (if it exists) on project list and project overview....
r401 :include => :parent,
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :limit => @project_pages.items_per_page,
:offset => @project_pages.current.offset
Jean-Philippe Lang
ajaxified paginators...
r31 render :action => "list", :layout => false if request.xhr?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Initial commit...
r2 # Add a new project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def add
@custom_fields = IssueCustomField.find(:all)
@root_projects = Project.find(:all, :conditions => "parent_id is null")
@project = Project.new(params[:project])
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]
Jean-Philippe Lang
Fix: error when posting to projects/add or users/add with no custom_fields parameter....
r664 @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)) }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @project.custom_values = @custom_values
if params[:repository_enabled] && params[:repository_enabled] == "1"
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 @project.repository = Repository.factory(params[:repository_scm])
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @project.repository.attributes = params[:repository]
end
if "1" == params[:wiki_enabled]
@project.wiki = Wiki.new
@project.wiki.attributes = params[:wiki]
end
Jean-Philippe Lang
v0.2.0...
r5 if @project.save
Jean-Philippe Lang
notice messages translation...
r15 flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'admin', :action => 'projects'
end
end
end
# Show @project
def show
@custom_values = @project.custom_values.find(:all, :include => :custom_field)
Jean-Philippe Lang
Various changes on views. On project summary, members are now grouped by role and subprojects are listed inline....
r431 @members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @subprojects = @project.active_children
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @trackers = Tracker.find(:all, :order => 'position')
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 @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])
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @total_issues_by_tracker = Issue.count(:group => :tracker, :conditions => ["project_id=?", @project.id])
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @key = User.current.rss_key
Jean-Philippe Lang
v0.2.0...
r5 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
def settings
@root_projects = Project::find(:all, :conditions => ["parent_id is null and id <> ?", @project.id])
@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) }
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
if params[:repository_enabled]
case params[:repository_enabled]
when "0"
@project.repository = nil
when "1"
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 @project.repository ||= Repository.factory(params[:repository_scm])
@project.repository.update_attributes params[:repository] if @project.repository
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
end
if params[:wiki_enabled]
case params[:wiki_enabled]
when "0"
@project.wiki.destroy if @project.wiki
when "1"
@project.wiki ||= Wiki.new
@project.wiki.update_attributes params[:wiki]
end
end
@project.attributes = params[:project]
Jean-Philippe Lang
svn browser merged in trunk...
r103 if @project.save
Jean-Philippe Lang
notice messages translation...
r15 flash[:notice] = l(:notice_successful_update)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'settings', :id => @project
else
settings
render :action => 'settings'
end
Jean-Philippe Lang
v0.2.0...
r5 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Added the ability to archive projects:...
r546 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
Jean-Philippe Lang
0.3 unstable...
r10 # Delete @project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def destroy
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @project_to_destroy = @project
Jean-Philippe Lang
Initial commit...
r2 if request.post? and params[:confirm]
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @project_to_destroy.destroy
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'admin', :action => 'projects'
end
Jean-Philippe Lang
Added the ability to archive projects:...
r546 # hide project in layout
@project = nil
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Add a new issue category to @project
def add_issue_category
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 @category = @project.issue_categories.build(params[:category])
if request.post? and @category.save
Jean-Philippe Lang
Added a link to add a new category when creating or editing an issue....
r642 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
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
# 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 member to @project
def add_member
@member = @project.members.build(params[:member])
Jean-Philippe Lang
Members management in project settings is now AJAXified...
r505 if request.post? && @member.save
respond_to do |format|
format.html { redirect_to :action => 'settings', :tab => 'members', :id => @project }
format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'members'} }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Members management in project settings is now AJAXified...
r505 else
settings
render :action => 'settings'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
end
# Show members list of @project
def list_members
@members = @project.members.find(:all)
end
# Add a new document to @project
def add_document
@categories = Enumeration::get_values('DCAT')
@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)
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 Mailer.deliver_document_add(@document) #if Permission.find_by_controller_and_action(params[:controller], params[:action]).mail_enabled?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'list_documents', :id => @project
Jean-Philippe Lang
Initial commit...
r2 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
0.3 unstable...
r10 # Show documents list of @project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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')
Jean-Philippe Lang
Feature 9784 Set status when raising issue....
r404
default_status = IssueStatus.default
Jean-Philippe Lang
Added an error message when trying to create an issue with no default status defined....
r557 unless default_status
Jean-Philippe Lang
Applied the flash notices patch by Matt Jones (slightly edited)....
r597 flash.now[:error] = 'No default issue status defined. Please check your configuration.'
Jean-Philippe Lang
Added an error message when trying to create an issue with no default status defined....
r557 render :nothing => true, :layout => true
return
end
Jean-Philippe Lang
Fixed a regression (crash when an admin with no role on the project try to create an issue)...
r417 @issue = Issue.new(:project => @project, :tracker => @tracker)
@issue.status = default_status
Jean-Philippe Lang
Fixed: default status not showing in new issue...
r472 @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker))if logged_in_user
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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]
Jean-Philippe Lang
Feature 9784 Set status when raising issue....
r404
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
@issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @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)
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 Mailer.deliver_issue_add(@issue) #if Permission.find_by_controller_and_action(params[:controller], params[:action]).mail_enabled?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'list_issues', :id => @project
end
end
end
# Show filtered/sorted issues list of @project
def list_issues
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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?
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @issue_pages = Paginator.new self, @issue_count, @results_per_page, params['page']
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 :include => [ :assigned_to, :status, :tracker, :project, :priority ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
:limit => @issue_pages.items_per_page,
:offset => @issue_pages.current.offset
Jean-Philippe Lang
Added per user custom queries....
r563 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :layout => false if request.xhr?
end
# Export filtered/sorted issues list to CSV
def export_issues_csv
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
retrieve_query
render :action => 'list_issues' and return unless @query.valid?
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 :include => [ :assigned_to, :author, :status, :tracker, :priority, :project, {:custom_values => :custom_field} ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
Jean-Philippe Lang
Fixed: error on csv/pdf export and feeds (oracle)...
r553 :limit => Setting.issues_export_limit.to_i
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
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),
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 l(:field_project),
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 l(:field_tracker),
l(:field_priority),
l(:field_subject),
Jean-Philippe Lang
"Author" column replaced by "Assigned to" in issue list....
r419 l(:field_assigned_to),
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Fixed Iconv::IllegalSequence errors in csv exports...
r567 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # csv lines
@issues.each do |issue|
fields = [issue.id, issue.status.name,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 issue.project.name,
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 issue.tracker.name,
issue.priority.name,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 issue.subject,
Jean-Philippe Lang
"Author" column replaced by "Assigned to" in issue list....
r419 (issue.assigned_to ? issue.assigned_to.name : ""),
issue.author.name,
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Fixed Iconv::IllegalSequence errors in csv exports...
r567 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
retrieve_query
render :action => 'list_issues' and return unless @query.valid?
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 :include => [ :author, :status, :tracker, :priority, :project ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
Jean-Philippe Lang
Fixed: error on csv/pdf export and feeds (oracle)...
r553 :limit => Setting.issues_export_limit.to_i
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
@options_for_rfpdf ||= {}
@options_for_rfpdf[:file_name] = "export.pdf"
render :layout => false
end
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
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 User.current.memberships.each {|m| @projects << m.project if m.role.allowed_to?(:controller => 'projects', :action => 'move_issues')}
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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|
# project dependent properties
unless i.project_id == new_project.id
i.category = nil
i.fixed_version = nil
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 # delete issue relations
i.relations_from.clear
i.relations_to.clear
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# 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
# 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)
redirect_to :action => 'list_news', :id => @project
end
end
end
# Show news list of @project
def list_news
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 @news_pages, @news = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "#{News.table_name}.created_on DESC"
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.atom { render_feed(@news, :title => "#{@project.name}: #{l(:label_news_plural)}") }
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 Mailer.deliver_attachments_add(@attachments) if !@attachments.empty? #and Permission.find_by_controller_and_action(params[:controller], params[:action]).mail_enabled?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
end
Jean-Philippe Lang
Versions can now be created with no date....
r533 @versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def list_files
Jean-Philippe Lang
Versions can now be created with no date....
r533 @versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Show changelog for @project
def changelog
@trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
Jean-Philippe Lang
Versions can now be created with no date....
r533 retrieve_selected_tracker_ids(@trackers)
@versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def roadmap
@trackers = Tracker.find(:all, :conditions => ["is_in_roadmap=?", true], :order => 'position')
Jean-Philippe Lang
Versions can now be created with no date....
r533 retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 @versions = @project.versions.sort
@versions = @versions.select {|v| !v.completed? } unless params[:completed]
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 case params[:format]
when 'rss'
# 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
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @event_types = %w(issues news attachments documents wiki_edits revisions)
@event_types.delete('wiki_edits') unless @project.wiki
@event_types.delete('changesets') unless @project.repository
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @scope = @event_types.select {|t| params["show_#{t}"]}
# default events if none is specified in parameters
@scope = (@event_types - %w(wiki_edits))if @scope.empty?
@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] )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 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 )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 if @scope.include?('attachments')
@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 )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 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 )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 if @scope.include?('wiki_edits') && @project.wiki
Jean-Philippe Lang
Fixed: 10342 Creation of Schema in Oracle...
r476 select = "#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 "#{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"
Jean-Philippe Lang
patch #9429 Display Wiki edits in activity log (Nick Read)...
r367 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]
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @events += WikiContent.versioned_class.find(:all, :select => select, :joins => joins, :conditions => conditions)
Jean-Philippe Lang
patch #9429 Display Wiki edits in activity log (Nick Read)...
r367 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 if @scope.include?('revisions') && @project.repository
@events += @project.repository.changesets.find(:all, :conditions => ["#{Changeset.table_name}.committed_on BETWEEN ? AND ?", @date_from, @date_to])
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @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
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def calendar
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 @trackers = Tracker.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 @date_to = @date_to + (7-@date_to.cwday)
Jean-Philippe Lang
Added versions due dates on calendar....
r426 @events = []
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 @project.issues_with_subprojects(params[:with_subprojects]) do
Jean-Philippe Lang
Added versions due dates on calendar....
r426 @events += Issue.find(:all,
Jean-Philippe Lang
Subproject name displayed on issue list, calendar and gantt (only for issues that belong to a subproject)....
r481 :include => [:tracker, :status, :assigned_to, :priority, :project],
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 :conditions => ["((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?)) and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')})", @date_from, @date_to, @date_from, @date_to]
) unless @selected_tracker_ids.empty?
end
Jean-Philippe Lang
Added versions due dates on calendar....
r426 @events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
Added versions due dates on calendar....
r426 @ending_events_by_days = @events.group_by {|event| event.due_date}
@starting_events_by_days = @events.group_by {|event| event.start_date}
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :layout => false if request.xhr?
end
def gantt
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 @trackers = Tracker.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events = []
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 @project.issues_with_subprojects(params[:with_subprojects]) do
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events += Issue.find(:all,
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 :order => "start_date, due_date",
Jean-Philippe Lang
Subproject name displayed on issue list, calendar and gantt (only for issues that belong to a subproject)....
r481 :include => [:tracker, :status, :assigned_to, :priority, :project],
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 :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
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
@events.sort! {|x,y| x.start_date <=> y.start_date }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 if params[:format]=='pdf'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @options_for_rfpdf ||= {}
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 @options_for_rfpdf[:file_name] = "#{@project.identifier}-gantt.pdf"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :template => "projects/gantt.rfpdf", :layout => false
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 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")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 else
render :template => "projects/gantt.rhtml"
end
end
Jean-Philippe Lang
Added a quick search form in page header. Search functionality moved to a dedicated controller....
r486
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336 def feeds
@queries = @project.queries.find :all, :conditions => ["is_public=? or user_id=?", true, (logged_in_user ? logged_in_user.id : 0)]
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @key = User.current.rss_key
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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])
@html_title = @project.name
Jean-Philippe Lang
ActiveRecord::RecordNotFound exceptions handled more gracefully...
r130 rescue ActiveRecord::RecordNotFound
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render_404
end
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 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
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # Retrieve query from session or build a new query
def retrieve_query
if params[:query_id]
@query = @project.queries.find(params[:query_id])
Jean-Philippe Lang
"me" value is now available in queries for "assigned to" and "author" filters....
r517 @query.executed_by = logged_in_user
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Jean-Philippe Lang
"me" value is now available in queries for "assigned to" and "author" filters....
r517 @query = Query.new(:name => "_", :executed_by => logged_in_user)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @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
Jean-Philippe Lang
Initial commit...
r2 end