Adds a 'Add subprojects' permission.

* 'Add project' permission will let user create a root project
* 'Add subprojects' permission will let project members create subprojects

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3238 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2009-12-24 16:18:15 +00:00
parent 24fde6f109
commit 62c83bdd2e
44 changed files with 269 additions and 70 deletions

View File

@ -73,7 +73,7 @@ class ProjectsController < ApplicationController
@project.enabled_module_names = Setting.default_projects_modules @project.enabled_module_names = Setting.default_projects_modules
else else
@project.enabled_module_names = params[:enabled_modules] @project.enabled_module_names = params[:enabled_modules]
if @project.save if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin # Add current user as a project member if he is not admin
unless User.current.admin? unless User.current.admin?
@ -104,7 +104,7 @@ class ProjectsController < ApplicationController
else else
@project = Project.new(params[:project]) @project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules] @project.enabled_module_names = params[:enabled_modules]
if @project.copy(@source_project, :only => params[:only]) if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create) flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects' redirect_to :controller => 'admin', :action => 'projects'
@ -156,7 +156,7 @@ class ProjectsController < ApplicationController
def edit def edit
if request.post? if request.post?
@project.attributes = params[:project] @project.attributes = params[:project]
if @project.save if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id') @project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_update) flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project redirect_to :action => 'settings', :id => @project
@ -395,4 +395,19 @@ private
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s } @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end end
end end
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id
return true if User.current.admin?
parent_id = params[:project] && params[:project][:parent_id]
if parent_id || @project.new_record?
parent = parent_id.blank? ? nil : Project.find_by_id(parent_id.to_i)
unless @project.allowed_parents.include?(parent)
@project.errors.add :parent_id, :invalid
return false
end
end
true
end
end end

View File

@ -36,7 +36,16 @@ module ProjectsHelper
end end
def parent_project_select_tag(project) def parent_project_select_tag(project)
options = '<option></option>' + project_tree_options_for_select(project.allowed_parents, :selected => project.parent) selected = project.parent
# retrieve the requested parent project
parent_id = (params[:project] && params[:project][:parent_id]) || params[:parent_id]
if parent_id
selected = (parent_id.blank? ? nil : Project.find(parent_id))
end
options = ''
options << "<option value=''></option>" if project.allowed_parents.include?(nil)
options << project_tree_options_for_select(project.allowed_parents.compact, :selected => selected)
content_tag('select', options, :name => 'project[parent_id]') content_tag('select', options, :name => 'project[parent_id]')
end end

View File

@ -246,7 +246,11 @@ class Project < ActiveRecord::Base
# by the current user # by the current user
def allowed_parents def allowed_parents
return @allowed_parents if @allowed_parents return @allowed_parents if @allowed_parents
@allowed_parents = (Project.find(:all, :conditions => Project.allowed_to_condition(User.current, :add_project, :member => true)) - self_and_descendants) @allowed_parents = Project.find(:all, :conditions => Project.allowed_to_condition(User.current, :add_subprojects))
@allowed_parents = @allowed_parents - self_and_descendants
if User.current.allowed_to?(:add_project, nil, :global => true)
@allowed_parents << nil
end
unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent) unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent)
@allowed_parents << parent @allowed_parents << parent
end end

View File

@ -4,7 +4,7 @@
<!--[form:project]--> <!--[form:project]-->
<p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p> <p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
<% unless @project.allowed_parents.empty? %> <% unless @project.allowed_parents.compact.empty? %>
<p><label><%= l(:field_parent) %></label><%= parent_project_select_tag(@project) %></p> <p><label><%= l(:field_parent) %></label><%= parent_project_select_tag(@project) %></p>
<% end %> <% end %>

View File

@ -1,3 +1,9 @@
<div class="contextual">
<% if User.current.allowed_to?(:add_subprojects, @project) %>
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'add', :parent_id => @project}, :class => 'icon icon-add' %>
<% end %>
</div>
<h2><%=l(:label_overview)%></h2> <h2><%=l(:label_overview)%></h2>
<div class="splitcontentleft"> <div class="splitcontentleft">

View File

@ -867,3 +867,5 @@ bg:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -891,3 +891,5 @@ bs:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -870,3 +870,5 @@ ca:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -873,3 +873,5 @@ cs:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -893,3 +893,5 @@ da:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -893,3 +893,5 @@ de:
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Missing a RSS access key
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -873,3 +873,5 @@ el:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -328,6 +328,7 @@ en:
setting_rest_api_enabled: Enable REST web service setting_rest_api_enabled: Enable REST web service
permission_add_project: Create project permission_add_project: Create project
permission_add_subprojects: Create subprojects
permission_edit_project: Edit project permission_edit_project: Edit project
permission_select_project_modules: Select project modules permission_select_project_modules: Select project modules
permission_manage_members: Manage members permission_manage_members: Manage members
@ -463,6 +464,7 @@ en:
label_auth_source_new: New authentication mode label_auth_source_new: New authentication mode
label_auth_source_plural: Authentication modes label_auth_source_plural: Authentication modes
label_subproject_plural: Subprojects label_subproject_plural: Subprojects
label_subproject_new: New subproject
label_and_its_subprojects: "{{value}} and its subprojects" label_and_its_subprojects: "{{value}} and its subprojects"
label_min_max_length: Min - Max length label_min_max_length: Min - Max length
label_list: List label_list: List

View File

@ -917,3 +917,5 @@ es:
button_show: Mostrar button_show: Mostrar
text_line_separated: Múltiples valores permitidos (un valor en cada línea). text_line_separated: Múltiples valores permitidos (un valor en cada línea).
setting_mail_handler_body_delimiters: Truncar correos tras una de estas líneas setting_mail_handler_body_delimiters: Truncar correos tras una de estas líneas
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -903,3 +903,5 @@ fi:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -348,6 +348,7 @@ fr:
setting_rest_api_enabled: Activer l'API REST setting_rest_api_enabled: Activer l'API REST
permission_add_project: Créer un projet permission_add_project: Créer un projet
permission_add_subprojects: Créer des sous-projets
permission_edit_project: Modifier le projet permission_edit_project: Modifier le projet
permission_select_project_modules: Choisir les modules permission_select_project_modules: Choisir les modules
permission_manage_members: Gérer les members permission_manage_members: Gérer les members
@ -483,6 +484,7 @@ fr:
label_auth_source_new: Nouveau mode d'authentification label_auth_source_new: Nouveau mode d'authentification
label_auth_source_plural: Modes d'authentification label_auth_source_plural: Modes d'authentification
label_subproject_plural: Sous-projets label_subproject_plural: Sous-projets
label_subproject_new: Nouveau sous-projet
label_and_its_subprojects: "{{value}} et ses sous-projets" label_and_its_subprojects: "{{value}} et ses sous-projets"
label_min_max_length: Longueurs mini - maxi label_min_max_length: Longueurs mini - maxi
label_list: Liste label_list: Liste

View File

@ -893,3 +893,5 @@ gl:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -877,3 +877,5 @@ he:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -898,3 +898,5 @@
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -885,3 +885,5 @@ id:
error_workflow_copy_source: Please select a source tracker or role error_workflow_copy_source: Please select a source tracker or role
setting_start_of_week: Start calendars on setting_start_of_week: Start calendars on
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -880,3 +880,5 @@ it:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -902,3 +902,5 @@ ja:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -933,3 +933,5 @@ ko:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -941,3 +941,5 @@ lt:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -855,3 +855,5 @@ nl:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -868,3 +868,5 @@
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -896,3 +896,5 @@ pl:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -900,3 +900,5 @@ pt-BR:
label_missing_feeds_access_key: Chave de acesso ao RSS faltando label_missing_feeds_access_key: Chave de acesso ao RSS faltando
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -885,3 +885,5 @@ pt:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -870,3 +870,5 @@ ro:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -981,3 +981,5 @@ ru:
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Missing a RSS access key
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -872,3 +872,5 @@ sk:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -869,3 +869,5 @@ sl:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -888,3 +888,5 @@
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -923,3 +923,5 @@ sv:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -870,3 +870,5 @@ th:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -900,3 +900,5 @@ tr:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -869,3 +869,5 @@ uk:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -932,3 +932,5 @@ vi:
button_show: Show button_show: Show
text_line_separated: Multiple values allowed (one line for each value). text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -966,3 +966,5 @@
enumeration_doc_categories: 文件分類 enumeration_doc_categories: 文件分類
enumeration_activities: 活動 (時間追蹤) enumeration_activities: 活動 (時間追蹤)
enumeration_system_activity: 系統活動 enumeration_system_activity: 系統活動
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -897,3 +897,5 @@ zh:
label_missing_api_access_key: Missing an API access key label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key label_missing_feeds_access_key: Missing a RSS access key
setting_mail_handler_body_delimiters: Truncate emails after one of these lines setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject

View File

@ -32,6 +32,7 @@ Redmine::AccessControl.map do |map|
map.permission :select_project_modules, {:projects => :modules}, :require => :member map.permission :select_project_modules, {:projects => :modules}, :require => :member
map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member
map.permission :manage_versions, {:projects => [:settings, :add_version], :versions => [:edit, :close_completed, :destroy]}, :require => :member map.permission :manage_versions, {:projects => [:settings, :add_version], :versions => [:edit, :close_completed, :destroy]}, :require => :member
map.permission :add_subprojects, {:projects => :add}, :require => :member
map.project_module :issue_tracking do |map| map.project_module :issue_tracking do |map|
# Issue categories # Issue categories

View File

@ -89,71 +89,163 @@ class ProjectsControllerTest < ActionController::TestCase
) )
end end
def test_get_add context "#add" do
@request.session[:user_id] = 1 context "by admin user" do
get :add setup do
assert_response :success @request.session[:user_id] = 1
assert_template 'add' end
end
should "accept get" do
def test_get_add_by_non_admin get :add
@request.session[:user_id] = 2 assert_response :success
get :add assert_template 'add'
assert_response :success end
assert_template 'add'
end should "accept post" do
post :add, :project => { :name => "blog",
def test_post_add :description => "weblog",
@request.session[:user_id] = 1 :identifier => "blog",
post :add, :project => { :name => "blog", :is_public => 1,
:description => "weblog", :custom_field_values => { '3' => 'Beta' }
:identifier => "blog", }
:is_public => 1, assert_redirected_to '/projects/blog/settings'
:custom_field_values => { '3' => 'Beta' }
} project = Project.find_by_name('blog')
assert_redirected_to '/projects/blog/settings' assert_kind_of Project, project
assert_equal 'weblog', project.description
assert_equal true, project.is_public?
assert_nil project.parent
end
should "accept post with parent" do
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' },
:parent_id => 1
}
assert_redirected_to '/projects/blog/settings'
project = Project.find_by_name('blog')
assert_kind_of Project, project
assert_equal Project.find(1), project.parent
end
end
project = Project.find_by_name('blog') context "by non-admin user with add_project permission" do
assert_kind_of Project, project setup do
assert_equal 'weblog', project.description Role.non_member.add_permission! :add_project
assert_equal true, project.is_public? @request.session[:user_id] = 9
assert_nil project.parent end
end
should "accept get" do
def test_post_add_subproject get :add
@request.session[:user_id] = 1 assert_response :success
post :add, :project => { :name => "blog", assert_template 'add'
:description => "weblog", assert_no_tag :select, :attributes => {:name => 'project[parent_id]'}
:identifier => "blog", end
:is_public => 1,
:custom_field_values => { '3' => 'Beta' }, should "accept post" do
:parent_id => 1 post :add, :project => { :name => "blog",
} :description => "weblog",
assert_redirected_to '/projects/blog/settings' :identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' }
}
assert_redirected_to '/projects/blog/settings'
project = Project.find_by_name('blog')
assert_kind_of Project, project
assert_equal 'weblog', project.description
assert_equal true, project.is_public?
# User should be added as a project member
assert User.find(9).member_of?(project)
assert_equal 1, project.members.size
end
should "fail with parent_id" do
assert_no_difference 'Project.count' do
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' },
:parent_id => 1
}
end
assert_response :success
project = assigns(:project)
assert_kind_of Project, project
assert_not_nil project.errors.on(:parent_id)
end
end
project = Project.find_by_name('blog') context "by non-admin user with add_subprojects permission" do
assert_kind_of Project, project setup do
assert_equal Project.find(1), project.parent Role.find(1).remove_permission! :add_project
end Role.find(1).add_permission! :add_subprojects
@request.session[:user_id] = 2
def test_post_add_by_non_admin end
@request.session[:user_id] = 2
post :add, :project => { :name => "blog", should "accept get" do
:description => "weblog", get :add, :parent_id => 'ecookbook'
:identifier => "blog", assert_response :success
:is_public => 1, assert_template 'add'
:custom_field_values => { '3' => 'Beta' } # parent project selected
} assert_tag :select, :attributes => {:name => 'project[parent_id]'},
assert_redirected_to '/projects/blog/settings' :child => {:tag => 'option', :attributes => {:value => '1', :selected => 'selected'}}
# no empty value
project = Project.find_by_name('blog') assert_no_tag :select, :attributes => {:name => 'project[parent_id]'},
assert_kind_of Project, project :child => {:tag => 'option', :attributes => {:value => ''}}
assert_equal 'weblog', project.description end
assert_equal true, project.is_public?
should "accept post with parent_id" do
# User should be added as a project member post :add, :project => { :name => "blog",
assert User.find(2).member_of?(project) :description => "weblog",
assert_equal 1, project.members.size :identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' },
:parent_id => 1
}
assert_redirected_to '/projects/blog/settings'
project = Project.find_by_name('blog')
end
should "fail without parent_id" do
assert_no_difference 'Project.count' do
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' }
}
end
assert_response :success
project = assigns(:project)
assert_kind_of Project, project
assert_not_nil project.errors.on(:parent_id)
end
should "fail with unauthorized parent_id" do
assert !User.find(2).member_of?(Project.find(6))
assert_no_difference 'Project.count' do
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' },
:parent_id => 6
}
end
assert_response :success
project = assigns(:project)
assert_kind_of Project, project
assert_not_nil project.errors.on(:parent_id)
end
end
end end
def test_show_routing def test_show_routing

View File

@ -282,7 +282,7 @@ class ProjectTest < ActiveSupport::TestCase
user = User.find(9) user = User.find(9)
assert user.memberships.empty? assert user.memberships.empty?
User.current = user User.current = user
assert Project.new.allowed_parents.empty? assert Project.new.allowed_parents.compact.empty?
end end
def test_users_by_role def test_users_by_role