@@ -75,7 +75,7 class ProjectsController < ApplicationController | |||
|
75 | 75 | else |
|
76 | 76 | @project.enabled_module_names = params[:enabled_modules] |
|
77 | 77 | if @project.save |
|
78 |
@project.set_parent!(params[:project]['parent_id']) if |
|
|
78 | @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') | |
|
79 | 79 | # Add current user as a project member if he is not admin |
|
80 | 80 | unless User.current.admin? |
|
81 | 81 | r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first |
@@ -106,7 +106,7 class ProjectsController < ApplicationController | |||
|
106 | 106 | @project = Project.new(params[:project]) |
|
107 | 107 | @project.enabled_module_names = params[:enabled_modules] |
|
108 | 108 | if @project.copy(@source_project, :only => params[:only]) |
|
109 |
@project.set_parent!(params[:project]['parent_id']) if |
|
|
109 | @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') | |
|
110 | 110 | flash[:notice] = l(:notice_successful_create) |
|
111 | 111 | redirect_to :controller => 'admin', :action => 'projects' |
|
112 | 112 | end |
@@ -158,7 +158,7 class ProjectsController < ApplicationController | |||
|
158 | 158 | if request.post? |
|
159 | 159 | @project.attributes = params[:project] |
|
160 | 160 | if @project.save |
|
161 |
@project.set_parent!(params[:project]['parent_id']) if |
|
|
161 | @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') | |
|
162 | 162 | flash[:notice] = l(:notice_successful_update) |
|
163 | 163 | redirect_to :action => 'settings', :id => @project |
|
164 | 164 | else |
@@ -36,7 +36,7 module ProjectsHelper | |||
|
36 | 36 | end |
|
37 | 37 | |
|
38 | 38 | def parent_project_select_tag(project) |
|
39 |
options = '<option></option>' + project_tree_options_for_select(project. |
|
|
39 | options = '<option></option>' + project_tree_options_for_select(project.allowed_parents, :selected => project.parent) | |
|
40 | 40 | content_tag('select', options, :name => 'project[parent_id]') |
|
41 | 41 | end |
|
42 | 42 |
@@ -148,14 +148,16 class Project < ActiveRecord::Base | |||
|
148 | 148 | else |
|
149 | 149 | statements << "1=0" |
|
150 | 150 | if user.logged? |
|
151 | statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" if Role.non_member.allowed_to?(permission) | |
|
151 | if Role.non_member.allowed_to?(permission) && !options[:member] | |
|
152 | statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
153 | end | |
|
152 | 154 | allowed_project_ids = user.memberships.select {|m| m.roles.detect {|role| role.allowed_to?(permission)}}.collect {|m| m.project_id} |
|
153 | 155 | statements << "#{Project.table_name}.id IN (#{allowed_project_ids.join(',')})" if allowed_project_ids.any? |
|
154 | elsif Role.anonymous.allowed_to?(permission) | |
|
155 | # anonymous user allowed on public project | |
|
156 | statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
157 | 156 | else |
|
158 | # anonymous user is not authorized | |
|
157 | if Role.anonymous.allowed_to?(permission) && !options[:member] | |
|
158 | # anonymous user allowed on public project | |
|
159 | statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
160 | end | |
|
159 | 161 | end |
|
160 | 162 | end |
|
161 | 163 | statements.empty? ? base_statement : "((#{base_statement}) AND (#{statements.join(' OR ')}))" |
@@ -253,8 +255,34 class Project < ActiveRecord::Base | |||
|
253 | 255 | end |
|
254 | 256 | |
|
255 | 257 | # Returns an array of projects the project can be moved to |
|
256 | def possible_parents | |
|
257 | @possible_parents ||= (Project.active.find(:all) - self_and_descendants) | |
|
258 | # by the current user | |
|
259 | def allowed_parents | |
|
260 | return @allowed_parents if @allowed_parents | |
|
261 | @allowed_parents = (Project.find(:all, :conditions => Project.allowed_to_condition(User.current, :add_project, :member => true)) - self_and_descendants) | |
|
262 | unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent) | |
|
263 | @allowed_parents << parent | |
|
264 | end | |
|
265 | @allowed_parents | |
|
266 | end | |
|
267 | ||
|
268 | # Sets the parent of the project with authorization check | |
|
269 | def set_allowed_parent!(p) | |
|
270 | unless p.nil? || p.is_a?(Project) | |
|
271 | if p.to_s.blank? | |
|
272 | p = nil | |
|
273 | else | |
|
274 | p = Project.find_by_id(p) | |
|
275 | return false unless p | |
|
276 | end | |
|
277 | end | |
|
278 | if p.nil? | |
|
279 | if !new_record? && allowed_parents.empty? | |
|
280 | return false | |
|
281 | end | |
|
282 | elsif !allowed_parents.include?(p) | |
|
283 | return false | |
|
284 | end | |
|
285 | set_parent!(p) | |
|
258 | 286 | end |
|
259 | 287 | |
|
260 | 288 | # Sets the parent of the project |
@@ -4,7 +4,7 | |||
|
4 | 4 | <!--[form:project]--> |
|
5 | 5 | <p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p> |
|
6 | 6 | |
|
7 |
<% |
|
|
7 | <% unless @project.allowed_parents.empty? %> | |
|
8 | 8 | <p><label><%= l(:field_parent) %></label><%= parent_project_select_tag(@project) %></p> |
|
9 | 9 | <% end %> |
|
10 | 10 |
@@ -117,6 +117,23 class ProjectsControllerTest < ActionController::TestCase | |||
|
117 | 117 | assert_kind_of Project, project |
|
118 | 118 | assert_equal 'weblog', project.description |
|
119 | 119 | assert_equal true, project.is_public? |
|
120 | assert_nil project.parent | |
|
121 | end | |
|
122 | ||
|
123 | def test_post_add_subproject | |
|
124 | @request.session[:user_id] = 1 | |
|
125 | post :add, :project => { :name => "blog", | |
|
126 | :description => "weblog", | |
|
127 | :identifier => "blog", | |
|
128 | :is_public => 1, | |
|
129 | :custom_field_values => { '3' => 'Beta' }, | |
|
130 | :parent_id => 1 | |
|
131 | } | |
|
132 | assert_redirected_to '/projects/blog/settings' | |
|
133 | ||
|
134 | project = Project.find_by_name('blog') | |
|
135 | assert_kind_of Project, project | |
|
136 | assert_equal Project.find(1), project.parent | |
|
120 | 137 | end |
|
121 | 138 | |
|
122 | 139 | def test_post_add_by_non_admin |
@@ -26,6 +26,7 class ProjectTest < ActiveSupport::TestCase | |||
|
26 | 26 | def setup |
|
27 | 27 | @ecookbook = Project.find(1) |
|
28 | 28 | @ecookbook_sub1 = Project.find(3) |
|
29 | User.current = nil | |
|
29 | 30 | end |
|
30 | 31 | |
|
31 | 32 | should_validate_presence_of :name |
@@ -236,6 +237,14 class ProjectTest < ActiveSupport::TestCase | |||
|
236 | 237 | assert_equal [5, 6, 3, 4], d.collect(&:id) |
|
237 | 238 | end |
|
238 | 239 | |
|
240 | def test_allowed_parents_should_be_empty_for_non_member_user | |
|
241 | Role.non_member.add_permission!(:add_project) | |
|
242 | user = User.find(9) | |
|
243 | assert user.memberships.empty? | |
|
244 | User.current = user | |
|
245 | assert Project.new.allowed_parents.empty? | |
|
246 | end | |
|
247 | ||
|
239 | 248 | def test_users_by_role |
|
240 | 249 | users_by_role = Project.find(1).users_by_role |
|
241 | 250 | assert_kind_of Hash, users_by_role |
General Comments 0
You need to be logged in to leave comments.
Login now