annotate app/controllers/.svn/text-base/projects_controller.rb.svn-base @ 45:65d9e2cabaa3 luisf

Added tipoftheday to the config/settings in order to correct previous issues. Tip of the day is now working correctly. Added the heading strings to the locales files.
author luisf
date Tue, 23 Nov 2010 11:50:01 +0000
parents 94944d00e43c
children af80e5618e9b
rev   line source
Chris@0 1 # Redmine - project management software
Chris@0 2 # Copyright (C) 2006-2009 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@0 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@0 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@0 18 class ProjectsController < ApplicationController
Chris@0 19 menu_item :overview
Chris@0 20 menu_item :roadmap, :only => :roadmap
Chris@0 21 menu_item :settings, :only => :settings
Chris@0 22
chris@22 23 before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
chris@22 24 before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
chris@22 25 before_filter :authorize_global, :only => [:new, :create]
Chris@0 26 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
chris@22 27 accept_key_auth :index
chris@22 28
chris@22 29 after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
Chris@0 30 if controller.request.post?
Chris@0 31 controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
Chris@0 32 end
Chris@0 33 end
chris@22 34
chris@22 35 # TODO: convert to PUT only
chris@22 36 verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
chris@22 37
Chris@0 38 helper :sort
Chris@0 39 include SortHelper
Chris@0 40 helper :custom_fields
Chris@0 41 include CustomFieldsHelper
Chris@0 42 helper :issues
Chris@0 43 helper :queries
Chris@0 44 include QueriesHelper
Chris@0 45 helper :repositories
Chris@0 46 include RepositoriesHelper
Chris@0 47 include ProjectsHelper
Chris@0 48
Chris@0 49 # Lists visible projects
Chris@0 50 def index
Chris@0 51 respond_to do |format|
Chris@0 52 format.html {
Chris@0 53 @projects = Project.visible.find(:all, :order => 'lft')
Chris@0 54 }
Chris@0 55 format.xml {
Chris@0 56 @projects = Project.visible.find(:all, :order => 'lft')
Chris@0 57 }
Chris@0 58 format.atom {
Chris@0 59 projects = Project.visible.find(:all, :order => 'created_on DESC',
Chris@0 60 :limit => Setting.feeds_limit.to_i)
Chris@0 61 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
Chris@0 62 }
Chris@0 63 end
Chris@0 64 end
Chris@0 65
chris@22 66 def new
Chris@0 67 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
Chris@0 68 @trackers = Tracker.all
Chris@0 69 @project = Project.new(params[:project])
chris@22 70
chris@22 71 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
chris@22 72 @project.trackers = Tracker.all
chris@22 73 @project.is_public = Setting.default_projects_public?
chris@22 74 @project.enabled_module_names = Setting.default_projects_modules
chris@22 75 end
chris@22 76
chris@22 77 def create
chris@22 78 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
chris@22 79 @trackers = Tracker.all
chris@22 80 @project = Project.new(params[:project])
chris@22 81
chris@22 82 @project.enabled_module_names = params[:enabled_modules]
chris@22 83 if validate_parent_id && @project.save
chris@22 84 @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
chris@22 85 # Add current user as a project member if he is not admin
chris@22 86 unless User.current.admin?
chris@22 87 r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
chris@22 88 m = Member.new(:user => User.current, :roles => [r])
chris@22 89 @project.members << m
chris@22 90 end
chris@22 91 respond_to do |format|
chris@22 92 format.html {
chris@22 93 flash[:notice] = l(:notice_successful_create)
chris@22 94 redirect_to :controller => 'projects', :action => 'settings', :id => @project
chris@22 95 }
chris@37 96 format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
chris@22 97 end
Chris@0 98 else
chris@22 99 respond_to do |format|
chris@22 100 format.html { render :action => 'new' }
chris@22 101 format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
Chris@0 102 end
chris@22 103 end
chris@22 104
Chris@0 105 end
Chris@0 106
Chris@0 107 def copy
Chris@0 108 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
Chris@0 109 @trackers = Tracker.all
Chris@0 110 @root_projects = Project.find(:all,
Chris@0 111 :conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
Chris@0 112 :order => 'name')
Chris@0 113 @source_project = Project.find(params[:id])
Chris@0 114 if request.get?
Chris@0 115 @project = Project.copy_from(@source_project)
Chris@0 116 if @project
Chris@0 117 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
Chris@0 118 else
Chris@0 119 redirect_to :controller => 'admin', :action => 'projects'
Chris@0 120 end
Chris@0 121 else
Chris@0 122 Mailer.with_deliveries(params[:notifications] == '1') do
Chris@0 123 @project = Project.new(params[:project])
Chris@0 124 @project.enabled_module_names = params[:enabled_modules]
Chris@0 125 if validate_parent_id && @project.copy(@source_project, :only => params[:only])
Chris@0 126 @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
Chris@0 127 flash[:notice] = l(:notice_successful_create)
chris@37 128 redirect_to :controller => 'projects', :action => 'settings'
Chris@0 129 elsif !@project.new_record?
Chris@0 130 # Project was created
Chris@0 131 # But some objects were not copied due to validation failures
Chris@0 132 # (eg. issues from disabled trackers)
Chris@0 133 # TODO: inform about that
chris@37 134 redirect_to :controller => 'projects', :action => 'settings'
Chris@0 135 end
Chris@0 136 end
Chris@0 137 end
Chris@0 138 rescue ActiveRecord::RecordNotFound
Chris@0 139 redirect_to :controller => 'admin', :action => 'projects'
Chris@0 140 end
Chris@0 141
Chris@0 142 # Show @project
Chris@0 143 def show
Chris@0 144 if params[:jump]
Chris@0 145 # try to redirect to the requested menu item
Chris@0 146 redirect_to_project_menu_item(@project, params[:jump]) && return
Chris@0 147 end
Chris@0 148
Chris@0 149 @users_by_role = @project.users_by_role
Chris@0 150 @subprojects = @project.children.visible
Chris@0 151 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
Chris@0 152 @trackers = @project.rolled_up_trackers
Chris@0 153
Chris@0 154 cond = @project.project_condition(Setting.display_subprojects_issues?)
Chris@0 155
Chris@0 156 @open_issues_by_tracker = Issue.visible.count(:group => :tracker,
Chris@0 157 :include => [:project, :status, :tracker],
Chris@0 158 :conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
Chris@0 159 @total_issues_by_tracker = Issue.visible.count(:group => :tracker,
Chris@0 160 :include => [:project, :status, :tracker],
Chris@0 161 :conditions => cond)
Chris@0 162
Chris@0 163 TimeEntry.visible_by(User.current) do
Chris@0 164 @total_hours = TimeEntry.sum(:hours,
Chris@0 165 :include => :project,
Chris@0 166 :conditions => cond).to_f
Chris@0 167 end
Chris@0 168 @key = User.current.rss_key
Chris@0 169
Chris@0 170 respond_to do |format|
Chris@0 171 format.html
Chris@0 172 format.xml
Chris@0 173 end
Chris@0 174 end
Chris@0 175
Chris@0 176 def settings
Chris@0 177 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
Chris@0 178 @issue_category ||= IssueCategory.new
Chris@0 179 @member ||= @project.members.new
Chris@0 180 @trackers = Tracker.all
Chris@0 181 @repository ||= @project.repository
Chris@0 182 @wiki ||= @project.wiki
Chris@0 183 end
Chris@0 184
Chris@0 185 def edit
chris@22 186 end
chris@22 187
chris@22 188 def update
chris@22 189 @project.attributes = params[:project]
chris@22 190 if validate_parent_id && @project.save
chris@22 191 @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
chris@22 192 respond_to do |format|
chris@22 193 format.html {
chris@22 194 flash[:notice] = l(:notice_successful_update)
chris@22 195 redirect_to :action => 'settings', :id => @project
chris@22 196 }
chris@22 197 format.xml { head :ok }
chris@22 198 end
Chris@0 199 else
chris@22 200 respond_to do |format|
chris@22 201 format.html {
chris@22 202 settings
chris@22 203 render :action => 'settings'
chris@22 204 }
chris@22 205 format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
Chris@0 206 end
Chris@0 207 end
Chris@0 208 end
Chris@0 209
Chris@0 210 def modules
Chris@0 211 @project.enabled_module_names = params[:enabled_modules]
Chris@0 212 flash[:notice] = l(:notice_successful_update)
Chris@0 213 redirect_to :action => 'settings', :id => @project, :tab => 'modules'
Chris@0 214 end
Chris@0 215
Chris@0 216 def archive
Chris@0 217 if request.post?
Chris@0 218 unless @project.archive
Chris@0 219 flash[:error] = l(:error_can_not_archive_project)
Chris@0 220 end
Chris@0 221 end
Chris@0 222 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
Chris@0 223 end
Chris@0 224
Chris@0 225 def unarchive
Chris@0 226 @project.unarchive if request.post? && !@project.active?
Chris@0 227 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
Chris@0 228 end
Chris@0 229
Chris@0 230 # Delete @project
Chris@0 231 def destroy
Chris@0 232 @project_to_destroy = @project
Chris@0 233 if request.get?
Chris@0 234 # display confirmation view
Chris@0 235 else
Chris@0 236 if params[:format] == 'xml' || params[:confirm]
Chris@0 237 @project_to_destroy.destroy
Chris@0 238 respond_to do |format|
Chris@0 239 format.html { redirect_to :controller => 'admin', :action => 'projects' }
Chris@0 240 format.xml { head :ok }
Chris@0 241 end
Chris@0 242 end
Chris@0 243 end
Chris@0 244 # hide project in layout
Chris@0 245 @project = nil
Chris@0 246 end
Chris@0 247
Chris@0 248 private
Chris@0 249 def find_optional_project
Chris@0 250 return true unless params[:id]
Chris@0 251 @project = Project.find(params[:id])
Chris@0 252 authorize
Chris@0 253 rescue ActiveRecord::RecordNotFound
Chris@0 254 render_404
Chris@0 255 end
Chris@0 256
Chris@0 257 # Validates parent_id param according to user's permissions
Chris@0 258 # TODO: move it to Project model in a validation that depends on User.current
Chris@0 259 def validate_parent_id
Chris@0 260 return true if User.current.admin?
Chris@0 261 parent_id = params[:project] && params[:project][:parent_id]
Chris@0 262 if parent_id || @project.new_record?
Chris@0 263 parent = parent_id.blank? ? nil : Project.find_by_id(parent_id.to_i)
Chris@0 264 unless @project.allowed_parents.include?(parent)
Chris@0 265 @project.errors.add :parent_id, :invalid
Chris@0 266 return false
Chris@0 267 end
Chris@0 268 end
Chris@0 269 true
Chris@0 270 end
Chris@0 271 end