Defect #33419 » 0001-Take-into-account-the-setting-Setting.cross_project_.patch
| app/helpers/issues_helper.rb | ||
|---|---|---|
| 696 | 696 | user_default_tab | 
| 697 | 697 | end | 
| 698 | 698 | end | 
| 699 | ||
| 700 | def projects_for_select(issue) | |
| 701 | if issue.parent_issue_id.present? | |
| 702 | issue.allowed_target_projects_for_subtask(User.current) | |
| 703 | elsif issue.new_record? && !issue.copy? | |
| 704 | issue.allowed_target_projects(User.current, 'descendants') | |
| 705 | else | |
| 706 | issue.allowed_target_projects(User.current) | |
| 707 | end | |
| 708 | end | |
| 699 | 709 | end | 
| app/models/issue.rb | ||
|---|---|---|
| 1550 | 1550 | end | 
| 1551 | 1551 | end | 
| 1552 | 1552 | |
| 1553 | # Returns a scope of projects that user can assign the subtask | |
| 1554 | def allowed_target_projects_for_subtask(user=User.current) | |
| 1555 | if parent_issue_id.present? | |
| 1556 | scope = filter_projects_scope(Setting.cross_project_subtasks) | |
| 1557 | end | |
| 1558 | ||
| 1559 | self.class.allowed_target_projects(user, project, scope) | |
| 1560 | end | |
| 1561 | ||
| 1553 | 1562 | # Returns a scope of projects that user can assign the issue to | 
| 1554 | def allowed_target_projects(user=User.current, context=nil) | |
| 1555 | if new_record? && context.is_a?(Project) && !copy? | |
| 1556 | current_project = context.self_and_descendants | |
| 1557 | elsif new_record? | |
| 1558 | current_project = nil | |
| 1559 | else | |
| 1560 | current_project = project | |
| 1563 | def allowed_target_projects(user=User.current, scope=nil) | |
| 1564 | current_project = new_record? ? nil : project | |
| 1565 | if scope | |
| 1566 | scope = filter_projects_scope(scope) | |
| 1561 | 1567 | end | 
| 1562 | 1568 | |
| 1563 | self.class.allowed_target_projects(user, current_project) | |
| 1569 |     self.class.allowed_target_projects(user, current_project, scope) | |
| 1564 | 1570 | end | 
| 1565 | 1571 | |
| 1566 | 1572 | # Returns a scope of projects that user can assign issues to | 
| 1567 | 1573 | # If current_project is given, it will be included in the scope | 
| 1568 | def self.allowed_target_projects(user=User.current, current_project=nil) | |
| 1574 |   def self.allowed_target_projects(user=User.current, current_project=nil, scope=nil) | |
| 1569 | 1575 | condition = Project.allowed_to_condition(user, :add_issues) | 
| 1570 |     if current_project.is_a?(Project) | |
| 1576 | if current_project | |
| 1571 | 1577 |       condition = ["(#{condition}) OR #{Project.table_name}.id = ?", current_project.id] | 
| 1572 | elsif current_project | |
| 1573 |       condition = ["(#{condition}) AND #{Project.table_name}.id IN (?)", current_project.map(&:id)] | |
| 1574 | 1578 | end | 
| 1575 | Project.where(condition).having_trackers | |
| 1579 | ||
| 1580 | if scope.nil? | |
| 1581 | scope = Project | |
| 1582 | end | |
| 1583 | ||
| 1584 | scope.where(condition).having_trackers | |
| 1576 | 1585 | end | 
| 1577 | 1586 | |
| 1578 | 1587 | # Returns a scope of trackers that user can assign the issue to | 
| ... | ... | |
| 1906 | 1915 | self.done_ratio ||= 0 | 
| 1907 | 1916 | end | 
| 1908 | 1917 | end | 
| 1918 | ||
| 1919 | def filter_projects_scope(scope=nil) | |
| 1920 | case scope | |
| 1921 | when 'system' | |
| 1922 | Project | |
| 1923 | when 'tree' | |
| 1924 | project.root.self_and_descendants | |
| 1925 | when 'hierarchy' | |
| 1926 | project.hierarchy | |
| 1927 | when 'descendants' | |
| 1928 | project.self_and_descendants | |
| 1929 | when '' | |
| 1930 | Project.where(:id => project.id) | |
| 1931 | else | |
| 1932 | Project | |
| 1933 | end | |
| 1934 | end | |
| 1909 | 1935 | end | 
| app/views/issues/_attributes.html.erb | ||
|---|---|---|
| 61 | 61 | <div class="splitcontentright"> | 
| 62 | 62 | <% if @issue.safe_attribute? 'parent_issue_id' %> | 
| 63 | 63 | <p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10, | 
| 64 |                                       :required => @issue.required_attribute?('parent_issue_id') %></p> | |
| 64 |                                       :required => @issue.required_attribute?('parent_issue_id'), | |
| 65 |                                       :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %></p> | |
| 65 | 66 | <%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript(auto_complete_issues_path(:project_id => @issue.project, :scope => Setting.cross_project_subtasks, :status => @issue.closed? ? 'c' : 'o', :issue_id => @issue.id))}')" %> | 
| 66 | 67 | <% end %> | 
| 67 | 68 | |
| app/views/issues/_form.html.erb | ||
|---|---|---|
| 9 | 9 | </p> | 
| 10 | 10 | <% end %> | 
| 11 | 11 | |
| 12 | <% projects = @issue.allowed_target_projects(User.current, @project) %> | |
| 12 | <% projects = projects_for_select(@issue) %> | |
| 13 | 13 | <% if (@issue.safe_attribute?('project_id') || @issue.project_id_changed?) && (@project.nil? || projects.length > 1 || @issue.copy?) %> | 
| 14 | 14 | <p><%= f.select :project_id, project_tree_options_for_select(projects, :selected => @issue.project), {:required => true}, | 
| 15 | 15 |                 :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %></p> | 
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 3100 | 3100 | assert_select 'select[name="issue[project_id]"]', 0 | 
| 3101 | 3101 | end | 
| 3102 | 3102 | |
| 3103 | def test_get_new_should_not_show_invalid_projects_when_issue_is_a_subtask | |
| 3104 | @request.session[:user_id] = 2 | |
| 3105 | issue = Issue.find(1) | |
| 3106 | issue.parent_id = 3 | |
| 3107 | issue.save | |
| 3108 | ||
| 3109 | with_settings :cross_project_subtasks => 'tree' do | |
| 3110 | get( | |
| 3111 | :new, | |
| 3112 |         :params => { | |
| 3113 | :project_id => 1, | |
| 3114 | :parent_issue_id => 1 | |
| 3115 | } | |
| 3116 | ) | |
| 3117 | end | |
| 3118 | assert_response :success | |
| 3119 | assert_select 'select[name="issue[project_id]"]' do | |
| 3120 | assert_select 'option', 3 | |
| 3121 | ||
| 3122 | # Onlinestore project should not be included | |
| 3123 | assert_select 'option[value=?]', '2', 0 | |
| 3124 | end | |
| 3125 | end | |
| 3126 | ||
| 3103 | 3127 | def test_get_new_with_minimal_permissions | 
| 3104 | 3128 | Role.find(1).update_attribute :permissions, [:add_issues] | 
| 3105 | 3129 | WorkflowTransition.where(:role_id => 1).delete_all | 
| test/unit/issue_test.rb | ||
|---|---|---|
| 1708 | 1708 | assert_not_include project, Issue.allowed_target_projects(User.find(1)) | 
| 1709 | 1709 | end | 
| 1710 | 1710 | |
| 1711 | def test_allowed_target_projects_for_subtask_should_not_include_invalid_projects | |
| 1712 | User.current = User.find(1) | |
| 1713 | issue = Issue.find(1) | |
| 1714 | issue.parent_id = 3 | |
| 1715 | ||
| 1716 | with_settings :cross_project_subtasks => 'tree' do | |
| 1717 | # Should include only the project tree | |
| 1718 | assert_equal [1, 3, 5], issue.allowed_target_projects_for_subtask.ids.sort | |
| 1719 | end | |
| 1720 | end | |
| 1721 | ||
| 1711 | 1722 | def test_allowed_target_trackers_with_one_role_allowed_on_all_trackers | 
| 1712 | 1723 | user = User.generate! | 
| 1713 | 1724 | role = Role.generate! | 
| ... | ... | |
| 3343 | 3354 | assert !child.reopenable? | 
| 3344 | 3355 | assert_equal l(:notice_issue_not_reopenable_by_closed_parent_issue), child.transition_warning | 
| 3345 | 3356 | end | 
| 3357 | ||
| 3358 | def test_filter_projects_scope | |
| 3359 | Issue.send(:public, :filter_projects_scope) | |
| 3360 | # Project eCookbook | |
| 3361 | issue = Issue.find(1) | |
| 3362 | ||
| 3363 | assert_equal Project, issue.filter_projects_scope | |
| 3364 |     assert_equal Project, issue.filter_projects_scope('system') | |
| 3365 | ||
| 3366 | # Project Onlinestore (id 2) is not part of the tree | |
| 3367 |     assert_equal [1, 3, 4, 5, 6], Issue.find(5).filter_projects_scope('tree').ids.sort | |
| 3368 | ||
| 3369 | # Project "Private child of eCookbook" | |
| 3370 | issue2 = Issue.find(9) | |
| 3371 | ||
| 3372 | # Projects "eCookbook Subproject 1" (id 3) and "eCookbook Subproject 1" (id 4) are not part of hierarchy | |
| 3373 |     assert_equal [1, 5, 6], issue2.filter_projects_scope('hierarchy').ids.sort | |
| 3374 | ||
| 3375 | # Project "Child of private child" is descendant of "Private child of eCookbook" | |
| 3376 |     assert_equal [5, 6], issue2.filter_projects_scope('descendants').ids.sort | |
| 3377 | ||
| 3378 |     assert_equal [5], issue2.filter_projects_scope('').ids.sort | |
| 3379 | end | |
| 3346 | 3380 | end |