##// END OF EJS Templates
Merged r2109, r2118, r2130, r2131, r2134, r2135, r2136 and r2139 to r2145 from trunk....
Merged r2109, r2118, r2130, r2131, r2134, r2135, r2136 and r2139 to r2145 from trunk. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.8-stable@2146 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2080:d3386a5af784
r2144:7389b4bed0ca
Show More
projects_controller.rb
285 lines | 10.4 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.
class ProjectsController < ApplicationController
Jean-Philippe Lang
Highlight the current item of the main menu....
r1062 menu_item :overview
menu_item :activity, :only => :activity
menu_item :roadmap, :only => :roadmap
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings
Jean-Philippe Lang
Issue list now supports bulk edit/move/delete (#563, #607). For now, issues from different projects can not be bulk edited/moved/deleted at once....
r1116 menu_item :issues, :only => [:changelog]
Jean-Philippe Lang
Highlight the current item of the main menu....
r1062
Jean-Philippe Lang
Activity enhancements:...
r1213 before_filter :find_project, :except => [ :index, :list, :add, :activity ]
before_filter :find_optional_project, :only => :activity
before_filter :authorize, :except => [ :index, :list, :add, :archive, :unarchive, :destroy, :activity ]
Jean-Philippe Lang
Added the ability to archive projects:...
r546 before_filter :require_admin, :only => [ :add, :archive, :unarchive, :destroy ]
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 accept_key_auth :activity
Jean-Philippe Lang
Added fragment caching for calendar and gantt views...
r512
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
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 helper :issues
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Main project list now displays root projects with their subprojects....
r718 # Lists visible projects
Jean-Philippe Lang
Moved ProjectsController#list to ProjectsController#index....
r1450 def index
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 projects = Project.find :all,
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 :conditions => Project.visible_by(User.current),
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 :include => :parent
Jean-Philippe Lang
Adds new projects atom feed (#1290)....
r1451 respond_to do |format|
format.html {
@project_tree = projects.group_by {|p| p.parent || p}
Jean-Philippe Lang
Merged Rails 2.1 compatibility branch....
r1609 @project_tree.keys.each {|p| @project_tree[p] -= [p]}
Jean-Philippe Lang
Adds new projects atom feed (#1290)....
r1451 }
format.atom {
render_feed(projects.sort_by(&:created_on).reverse.slice(0, Setting.feeds_limit.to_i),
:title => "#{Setting.app_title}: #{l(:label_project_latest)}")
}
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718
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
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
Jean-Philippe Lang
Added per-project tracker selection. Trackers can be selected on project settings....
r907 @trackers = Tracker.all
Jean-Philippe Lang
Project name format limitation removed (name can now contain any character)....
r936 @root_projects = Project.find(:all,
:conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
:order => 'name')
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @project = Project.new(params[:project])
if request.get?
Jean-Philippe Lang
Adds an option to generate sequential project identifiers....
r1776 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
Jean-Philippe Lang
Added per-project tracker selection. Trackers can be selected on project settings....
r907 @project.trackers = Tracker.all
Jean-Philippe Lang
Adds a setting for whether new projects should be public by default (closes #842, #839)....
r1221 @project.is_public = Setting.default_projects_public?
Jean-Philippe Lang
Fixed: Modules selection not remembered when new project creation fails (#1109)....
r1343 @project.enabled_module_names = Redmine::AccessControl.available_project_modules
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 else
Jean-Philippe Lang
Fixed: Modules selection not remembered when new project creation fails (#1109)....
r1343 @project.enabled_module_names = params[:enabled_modules]
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'
Jean-Philippe Lang
Fixed: Modules selection not remembered when new project creation fails (#1109)....
r1343 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
end
# Show @project
def show
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
Fixed: private subprojects names are revealed on the project overview (#1152)....
r1384 @subprojects = @project.children.find(:all, :conditions => Project.visible_by(User.current))
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
Include subprojects on the issue list, calendar and gantt by default....
r1164 @trackers = @project.rolled_up_trackers
Jean-Philippe Lang
If 'Display subprojects issues on main projects' is set to false:...
r1283
cond = @project.project_condition(Setting.display_subprojects_issues?)
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 Issue.visible_by(User.current) do
@open_issues_by_tracker = Issue.count(:group => :tracker,
:include => [:project, :status, :tracker],
Jean-Philippe Lang
If 'Display subprojects issues on main projects' is set to false:...
r1283 :conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 @total_issues_by_tracker = Issue.count(:group => :tracker,
:include => [:project, :status, :tracker],
Jean-Philippe Lang
If 'Display subprojects issues on main projects' is set to false:...
r1283 :conditions => cond)
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 end
Jean-Philippe Lang
Propagates time tracking to the parent project (closes #433). Time report enhancements....
r1162 TimeEntry.visible_by(User.current) do
@total_hours = TimeEntry.sum(:hours,
:include => :project,
Jean-Philippe Lang
If 'Display subprojects issues on main projects' is set to false:...
r1283 :conditions => cond).to_f
Jean-Philippe Lang
Propagates time tracking to the parent project (closes #433). Time report enhancements....
r1162 end
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
Jean-Philippe Lang
Project name format limitation removed (name can now contain any character)....
r936 @root_projects = Project.find(:all,
:conditions => ["parent_id IS NULL AND status = #{Project::STATUS_ACTIVE} AND id <> ?", @project.id],
:order => 'name')
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @issue_category ||= IssueCategory.new
@member ||= @project.members.new
Jean-Philippe Lang
Added per-project tracker selection. Trackers can be selected on project settings....
r907 @trackers = Tracker.all
Jean-Philippe Lang
Added project module concept....
r714 @repository ||= @project.repository
@wiki ||= @project.wiki
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Edit @project
def edit
if request.post?
@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 project module concept....
r714
def modules
@project.enabled_module_names = params[:enabled_modules]
redirect_to :action => 'settings', :id => @project, :tab => 'modules'
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
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
def add_file
if request.post?
@version = @project.versions.find_by_id(params[:version_id])
Jean-Philippe Lang
Ported r1009 from 0.6-stable branch....
r1000 attachments = attach_files(@version, params[:attachments])
Jean-Philippe Lang
Added ApplicationController#attach_files as a common method to attach files in all actions....
r977 Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('file_added')
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
Make the project files list sortable (#997)....
r1315 sort_init "#{Attachment.table_name}.filename", "asc"
sort_update
@versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Show changelog for @project
def changelog
Jean-Philippe Lang
Added per-project tracker selection. Trackers can be selected on project settings....
r907 @trackers = @project.trackers.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
Jean-Philippe Lang
Added per-project tracker selection. Trackers can be selected on project settings....
r907 @trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true])
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
Jean-Philippe Lang
Display the last 30 days on the activity view rather than the current month....
r1182 @days = Setting.activity_days_default.to_i
if params[:from]
Jean-Philippe Lang
Fixes activity date param....
r1999 begin; @date_to = params[:from].to_date + 1; rescue; end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Display the last 30 days on the activity view rather than the current month....
r1182 @date_to ||= Date.today + 1
@date_from = @date_to - @days
Jean-Philippe Lang
Activity refactoring....
r1692 @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
Jean-Philippe Lang
Fixed: 404 when "Apply" clicked on activity page (#2251)....
r2080 @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Makes activity view accept a user_id param to show user's activity (#1002)....
r2065 @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
Jean-Philippe Lang
Activity refactoring....
r1692 @activity.scope_select {|t| !params["show_#{t}"].nil?}
Jean-Philippe Lang
Makes activity view accept a user_id param to show user's activity (#1002)....
r2065 @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
Jean-Philippe Lang
patch #9429 Display Wiki edits in activity log (Nick Read)...
r367
Jean-Philippe Lang
Activity refactoring....
r1692 events = @activity.events(@date_from, @date_to)
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
respond_to do |format|
Jean-Philippe Lang
Activity refactoring....
r1692 format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
Jean-Philippe Lang
Better naming of activity feed if only one kind of event is displayed (#1323)....
r1628 format.atom {
Jean-Philippe Lang
Makes activity view accept a user_id param to show user's activity (#1002)....
r2065 title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
Jean-Philippe Lang
Activity refactoring....
r1692 render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
Jean-Philippe Lang
Better naming of activity feed if only one kind of event is displayed (#1323)....
r1628 }
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end
Jean-Philippe Lang
Makes activity view accept a user_id param to show user's activity (#1002)....
r2065
rescue ActiveRecord::RecordNotFound
render_404
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
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])
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
Activity enhancements:...
r1213 def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
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
Initial commit...
r2 end