Project

General

Profile

Defect #33419 » 0001-Take-into-account-the-setting-Setting.cross_project_.patch

Marius BĂLTEANU, 2020-12-21 21:52

View differences:

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
(2-2/4)