comparison app/controllers/projects_controller.rb @ 1484:51364c0cd58f redmine-2.4-integration

Merge from live branch. Still need to merge manually in files overridden by plugins.
author Chris Cannam
date Wed, 15 Jan 2014 09:59:14 +0000
parents 261b3d9a4903 fc0fecf09eb9
children c86dacc2ef0a
comparison
equal deleted inserted replaced
1464:261b3d9a4903 1484:51364c0cd58f
18 class ProjectsController < ApplicationController 18 class ProjectsController < ApplicationController
19 menu_item :overview 19 menu_item :overview
20 menu_item :roadmap, :only => :roadmap 20 menu_item :roadmap, :only => :roadmap
21 menu_item :settings, :only => :settings 21 menu_item :settings, :only => :settings
22 22
23 before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ] 23 before_filter :find_project, :except => [ :index, :list, :explore, :new, :create, :copy ]
24 before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy] 24 before_filter :authorize, :except => [ :index, :list, :explore, :new, :create, :copy, :archive, :unarchive, :destroy]
25 before_filter :authorize_global, :only => [:new, :create] 25 before_filter :authorize_global, :only => [:new, :create]
26 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ] 26 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
27 accept_rss_auth :index 27 accept_rss_auth :index
28 accept_api_auth :index, :show, :create, :update, :destroy 28 accept_api_auth :index, :show, :create, :update, :destroy
29 29
42 include QueriesHelper 42 include QueriesHelper
43 helper :repositories 43 helper :repositories
44 include RepositoriesHelper 44 include RepositoriesHelper
45 include ProjectsHelper 45 include ProjectsHelper
46 helper :members 46 helper :members
47 47 include ActivitiesHelper
48 # Lists visible projects 48 helper :activities
49
50 # Lists visible projects. Paginator is for top-level projects only
51 # (subprojects belong to them)
49 def index 52 def index
50 respond_to do |format| 53 respond_to do |format|
51 format.html { 54 format.html {
52 scope = Project 55 sort_init 'name'
53 unless params[:closed] 56 sort_update %w(name lft created_on updated_on)
54 scope = scope.active 57 @limit = per_page_option
55 end 58 @project_count = Project.visible_roots.count
56 @projects = scope.visible.order('lft').all 59 @project_pages = Paginator.new self, @project_count, @limit, params['page']
60 @offset ||= @project_pages.current.offset
61 @projects = Project.visible_roots.all(:offset => @offset, :limit => @limit, :order => sort_clause)
62 render :template => 'projects/index.html.erb', :layout => !request.xhr?
63
64 ## Redmine 2.2:
65 # scope = Project
66 # unless params[:closed]
67 # scope = scope.active
68 # end
69 # @projects = scope.visible.order('lft').all
57 } 70 }
58 format.api { 71 format.api {
59 @offset, @limit = api_offset_and_limit 72 @offset, @limit = api_offset_and_limit
60 @project_count = Project.visible.count 73 @project_count = Project.visible.count
61 @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all 74 @projects = Project.visible.offset(@offset).limit(@limit).order('lft').all
65 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}") 78 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
66 } 79 }
67 end 80 end
68 end 81 end
69 82
83 # A different view of projects using explore boxes
84 def explore
85 respond_to do |format|
86 format.html {
87 @projects = Project.visible
88 render :template => 'projects/explore.html.erb', :layout => !request.xhr?
89 }
90 end
91 end
92
70 def new 93 def new
71 @issue_custom_fields = IssueCustomField.sorted.all 94 @issue_custom_fields = IssueCustomField.sorted.all
72 @trackers = Tracker.sorted.all 95 @trackers = Tracker.sorted.all
73 @project = Project.new 96 @project = Project.new
74 @project.safe_attributes = params[:project] 97 @project.safe_attributes = params[:project]
78 @issue_custom_fields = IssueCustomField.sorted.all 101 @issue_custom_fields = IssueCustomField.sorted.all
79 @trackers = Tracker.sorted.all 102 @trackers = Tracker.sorted.all
80 @project = Project.new 103 @project = Project.new
81 @project.safe_attributes = params[:project] 104 @project.safe_attributes = params[:project]
82 105
83 if validate_parent_id && @project.save 106 if validate_is_public_key && validate_parent_id && @project.save
84 @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') 107 @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
85 # Add current user as a project member if current user is not admin 108 # Add current user as a project member if current user is not admin
86 unless User.current.admin? 109 unless User.current.admin?
87 r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first 110 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]) 111 m = Member.new(:user => User.current, :roles => [r])
169 def settings 192 def settings
170 @issue_custom_fields = IssueCustomField.sorted.all 193 @issue_custom_fields = IssueCustomField.sorted.all
171 @issue_category ||= IssueCategory.new 194 @issue_category ||= IssueCategory.new
172 @member ||= @project.members.new 195 @member ||= @project.members.new
173 @trackers = Tracker.sorted.all 196 @trackers = Tracker.sorted.all
197 @repository ||= @project.repository
174 @wiki ||= @project.wiki 198 @wiki ||= @project.wiki
175 end 199 end
176 200
177 def edit 201 def edit
178 end 202 end
197 format.api { render_validation_errors(@project) } 221 format.api { render_validation_errors(@project) }
198 end 222 end
199 end 223 end
200 end 224 end
201 225
226 def overview
227 @project.has_welcome_page = params[:has_welcome_page]
228 if @project.save
229 flash[:notice] = l(:notice_successful_update)
230 end
231 redirect_to :action => 'settings', :id => @project, :tab => 'overview'
232 end
233
202 def modules 234 def modules
203 @project.enabled_module_names = params[:enabled_module_names] 235 @project.enabled_module_names = params[:enabled_module_names]
204 flash[:notice] = l(:notice_successful_update) 236 flash[:notice] = l(:notice_successful_update)
205 redirect_to settings_project_path(@project, :tab => 'modules') 237 redirect_to settings_project_path(@project, :tab => 'modules')
206 end 238 end
242 # hide project in layout 274 # hide project in layout
243 @project = nil 275 @project = nil
244 end 276 end
245 277
246 private 278 private
279
280 def validate_is_public_key
281 # Although is_public isn't mandatory in the project model (it gets
282 # defaulted), it must be present in params -- it can be true or
283 # false, but it must be there. This permits us to make forms in
284 # which the user _has_ to select public or private (rather than
285 # defaulting it) if we want to
286 if params.nil? || params[:project].nil? || !params[:project].has_key?(:is_public)
287 @project.errors.add :is_public, :public_or_private
288 return false
289 end
290 true
291 end
247 292
248 # Validates parent_id param according to user's permissions 293 # Validates parent_id param according to user's permissions
249 # TODO: move it to Project model in a validation that depends on User.current 294 # TODO: move it to Project model in a validation that depends on User.current
250 def validate_parent_id 295 def validate_parent_id
251 return true if User.current.admin? 296 return true if User.current.admin?