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