##// END OF EJS Templates
Upgraded to Rails 2.3.4 (#3597)...
Upgraded to Rails 2.3.4 (#3597) * Ran the Rails upgrade * Upgraded to Rails Engines 2.3.2 * Added a plugin to let Engines override application views. * Converted tests to use the new classes: ** ActionController::TestCase for functional ** ActiveSupport::TestCase for units * Converted ActiveRecord::Error message to a string. * ActiveRecord grouping returns an ordered hash which doesn't have #sort! * Updated the I18n storage_units format. * Added some default initializers from a fresh rails app * Changed the order of check_box_tags and hidden_field_tags. The hidden tag needs to appear first in Rails 2.3, otherwise it will override any value in the check_box_tag. * Removed the custom handler for when the cookie store is tampered with. Rails 2.3 removed the TamperedWithCookie exception and instead Rails will not load the data from it when it's been tampered with (e.g. no user login). * Fixed mail layouts, 2.3 has problems with implicit multipart emails that use layouts. Also removed some custom Redmine mailer code. * Fixed a bug that occurred in tests where the "required" span tag would be added to the :field_status translation. This resulted in an email string of: <li>Status<span class="required"> *</span><span class="required"> *</span> Instead of: <li>Status: New</li> git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2887 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2706:937823a0d849
r2773:7b0cb6aba871
Show More
projects_controller.rb
326 lines | 12.0 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
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608 before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
Jean-Philippe Lang
Activity enhancements:...
r1213 before_filter :find_optional_project, :only => :activity
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608 before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
Jean-Philippe Lang
Ability to allow non-admin users to create projects (#1007)....
r2651 before_filter :authorize_global, :only => :add
before_filter :require_admin, :only => [ :copy, :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
Replaces the obsolete robots.txt with a cached action (#2491)....
r2317 after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
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
Adds new projects atom feed (#1290)....
r1451 respond_to do |format|
format.html {
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 @projects = Project.visible.find(:all, :order => 'lft')
Jean-Philippe Lang
Adds new projects atom feed (#1290)....
r1451 }
format.atom {
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 projects = Project.visible.find(:all, :order => 'created_on DESC',
:limit => Setting.feeds_limit.to_i)
render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
Jean-Philippe Lang
Adds new projects atom feed (#1290)....
r1451 }
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
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
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
Jean-Philippe Lang
Ability to allow non-admin users to create projects (#1007)....
r2651 # Add current user as a project member if he is not admin
unless User.current.admin?
Jean-Philippe Lang
Adds a setting to choose which role is given to a non-admin user who creates a project (#1007)....
r2655 r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
Jean-Philippe Lang
Ability to allow non-admin users to create projects (#1007)....
r2651 @project.members << m
end
Jean-Philippe Lang
notice messages translation...
r15 flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
Ability to allow non-admin users to create projects (#1007)....
r2651 redirect_to :controller => 'projects', :action => 'settings', :id => @project
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
end
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608
def copy
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@root_projects = Project.find(:all,
:conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
:order => 'name')
if request.get?
@project = Project.copy_from(params[:id])
if @project
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
else
redirect_to :controller => 'admin', :action => 'projects'
end
else
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if @project.copy(params[:id])
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects'
end
end
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
# Show @project
def show
Jean-Philippe Lang
Jump to the current tab when using the project quick-jump combo (#2364)....
r2208 if params[:jump]
# try to redirect to the requested menu item
redirect_to_project_menu_item(@project, params[:jump]) && return
end
Jean-Philippe Lang
Display all users roles on project overview (#3339)....
r2635 @users_by_role = @project.users_by_role
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 @subprojects = @project.children.visible
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
Removes Issue.visible_by...
r2340
@open_issues_by_tracker = Issue.visible.count(:group => :tracker,
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 :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
Removes Issue.visible_by...
r2340 @total_issues_by_tracker = Issue.visible.count(:group => :tracker,
Jean-Philippe Lang
Include subprojects on the issue list, calendar and gantt by default....
r1164 :include => [:project, :status, :tracker],
Jean-Philippe Lang
If 'Display subprojects issues on main projects' is set to false:...
r1283 :conditions => cond)
Jean-Philippe Lang
Removes Issue.visible_by...
r2340
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
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
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
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?
Jean-Philippe Lang
Keep status filter on the projects list when un/archiving a project (#3530)....
r2706 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
Jean-Philippe Lang
Added the ability to archive projects:...
r546 end
def unarchive
@project.unarchive if request.post? && !@project.active?
Jean-Philippe Lang
Keep status filter on the projects list when un/archiving a project (#3530)....
r2706 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
Jean-Philippe Lang
Added the ability to archive projects:...
r546 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?
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = attach_files(container, params[:attachments])
if !attachments.empty? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments)
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 return
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 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
Validates sort_key and sort_order params (#2378)....
r2169 sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 @containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
Jean-Philippe Lang
Make the project files list sortable (#997)....
r1315 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